From 0cd9bea707eca29767a3da4edfbffa55b0549f0e Mon Sep 17 00:00:00 2001 From: Sergey Astapov Date: Tue, 12 Sep 2023 22:50:53 -0400 Subject: [PATCH] Deployed 44545fe1 --- versions.json | 2 +- ...945b.js => chunk.143.ecfdb6771aff3cbc6790.js} | 8 ++++---- ...f357.js => chunk.178.a928faaede5b9937b219.js} | 6 +++--- ...age-docs-f5788b741f6b449984ed53d443b80b20.js} | 16 ++++++++-------- ...> vendor-4644b75e144ac992042ed72206ce7dfc.js} | 2 +- versions/master/docs/ember-cli-mirage.json | 2 +- .../ember-cli-addon-docs/search-index.json | 2 +- versions/master/index.html | 8 ++++---- 8 files changed, 23 insertions(+), 23 deletions(-) rename versions/master/assets/{chunk.143.c84d0c885284ea5c945b.js => chunk.143.ecfdb6771aff3cbc6790.js} (97%) rename versions/master/assets/{chunk.178.2d1dd645789d8f67f357.js => chunk.178.a928faaede5b9937b219.js} (87%) rename versions/master/assets/{ember-cli-mirage-docs-5369b9c2c456bc74608b9d04de3c40cf.js => ember-cli-mirage-docs-f5788b741f6b449984ed53d443b80b20.js} (87%) rename versions/master/assets/{vendor-b8ab54957db71ef413fea7af5f51932a.js => vendor-4644b75e144ac992042ed72206ce7dfc.js} (99%) diff --git a/versions.json b/versions.json index f7235e2d6..31c1c46a8 100644 --- a/versions.json +++ b/versions.json @@ -2,7 +2,7 @@ "master": { "path": "versions/master", "name": "master", - "sha": "bb4f336eca77446722737647adc25f8a22a9ae7c", + "sha": "44545fe133826c60e10d9392c3b78be750bcf07b", "tag": null }, "-latest": { diff --git a/versions/master/assets/chunk.143.c84d0c885284ea5c945b.js b/versions/master/assets/chunk.143.ecfdb6771aff3cbc6790.js similarity index 97% rename from versions/master/assets/chunk.143.c84d0c885284ea5c945b.js rename to versions/master/assets/chunk.143.ecfdb6771aff3cbc6790.js index 1aaddc905..f3d785771 100644 --- a/versions/master/assets/chunk.143.c84d0c885284ea5c945b.js +++ b/versions/master/assets/chunk.143.ecfdb6771aff3cbc6790.js @@ -12,8 +12,8 @@ e.exports=require("@ember/runloop")},8574:e=>{"use strict" e.exports=require("@ember/service")},1866:e=>{"use strict" e.exports=require("@ember/utils")},5521:e=>{"use strict" e.exports=require("@glimmer/tracking")},6173:e=>{"use strict" -e.exports=require("@glimmer/tracking/primitives/cache")},41:(e,r,s)=>{var t,n -e.exports=(t=_eai_d,n=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?n("_eai_dyn_"+e):n("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return n("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},t("@handlebars/parser",[],(function(){return s(489)})),t("clipboard",[],(function(){return s(2838)})),t("ember-keyboard",["@ember/utils","@ember/service","@ember/destroyable","@ember/debug"],(function(){return s(7636)})),t("ember-keyboard/helpers/if-key.js",["@ember/component/helper","@ember/debug","@ember/utils"],(function(){return s(9519)})),t("ember-keyboard/helpers/on-key.js",["@ember/component/helper","@ember/debug","@ember/service"],(function(){return s(263)})),t("ember-keyboard/modifiers/on-key.js",["@ember/application","@ember/modifier","@ember/destroyable","@ember/service","@ember/object","@ember/debug","@ember/utils"],(function(){return s(1586)})),t("ember-keyboard/services/keyboard.js",["@ember/service","@ember/application","@ember/object","@ember/runloop","@ember/debug","@ember/utils"],(function(){return s(6690)})),t("ember-modifier",["@ember/application","@ember/modifier","@ember/destroyable"],(function(){return s(6972)})),t("highlight.js/lib/core",[],(function(){return s(2433)})),t("highlight.js/lib/languages/css",[],(function(){return s(1006)})),t("highlight.js/lib/languages/diff",[],(function(){return s(1084)})),t("highlight.js/lib/languages/handlebars",[],(function(){return s(5673)})),t("highlight.js/lib/languages/javascript",[],(function(){return s(69)})),t("highlight.js/lib/languages/json",[],(function(){return s(5525)})),t("highlight.js/lib/languages/shell",[],(function(){return s(5649)})),t("highlight.js/lib/languages/typescript",[],(function(){return s(681)})),t("highlight.js/lib/languages/xml",[],(function(){return s(9674)})),t("js-yaml",[],(function(){return s(6899)})),t("line-column",[],(function(){return s(7261)})),t("lodash",[],(function(){return s(3535)})),t("lunr",[],(function(){return s(305)})),t("marked",[],(function(){return s(6232)})),t("moment",[],(function(){return s(5030)})),t("moment-timezone",[],(function(){return s(1420)})),t("node-html-parser",[],(function(){return s(8717)})),t("prop-types",[],(function(){return s(1169)})),t("tether",[],(function(){return s(8672)})),void t("tracked-toolbox",["@ember/debug","@ember/object","@glimmer/tracking","@glimmer/tracking/primitives/cache"],(function(){return s(6271)})))},9592:function(e,r){window._eai_r=require,window._eai_d=define}},s={} +e.exports=require("@glimmer/tracking/primitives/cache")},8476:(e,r,s)=>{var t,n +e.exports=(t=_eai_d,n=_eai_r,window.emberAutoImportDynamic=function(e){return 1===arguments.length?n("_eai_dyn_"+e):n("_eai_dynt_"+e)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(e){return n("_eai_sync_"+e)(Array.prototype.slice.call(arguments,1))},t("@handlebars/parser",[],(function(){return s(489)})),t("clipboard",[],(function(){return s(2838)})),t("ember-keyboard",["@ember/utils","@ember/service","@ember/destroyable","@ember/debug"],(function(){return s(7636)})),t("ember-keyboard/helpers/if-key.js",["@ember/component/helper","@ember/debug","@ember/utils"],(function(){return s(9519)})),t("ember-keyboard/helpers/on-key.js",["@ember/component/helper","@ember/debug","@ember/service"],(function(){return s(263)})),t("ember-keyboard/modifiers/on-key.js",["@ember/application","@ember/modifier","@ember/destroyable","@ember/service","@ember/object","@ember/debug","@ember/utils"],(function(){return s(1586)})),t("ember-keyboard/services/keyboard.js",["@ember/service","@ember/application","@ember/object","@ember/runloop","@ember/debug","@ember/utils"],(function(){return s(6690)})),t("ember-modifier",["@ember/application","@ember/modifier","@ember/destroyable"],(function(){return s(6972)})),t("highlight.js/lib/core",[],(function(){return s(2433)})),t("highlight.js/lib/languages/css",[],(function(){return s(1006)})),t("highlight.js/lib/languages/diff",[],(function(){return s(1084)})),t("highlight.js/lib/languages/handlebars",[],(function(){return s(5673)})),t("highlight.js/lib/languages/javascript",[],(function(){return s(69)})),t("highlight.js/lib/languages/json",[],(function(){return s(5525)})),t("highlight.js/lib/languages/shell",[],(function(){return s(5649)})),t("highlight.js/lib/languages/typescript",[],(function(){return s(681)})),t("highlight.js/lib/languages/xml",[],(function(){return s(9674)})),t("js-yaml",[],(function(){return s(6899)})),t("line-column",[],(function(){return s(7261)})),t("lodash",[],(function(){return s(3535)})),t("lunr",[],(function(){return s(305)})),t("marked",[],(function(){return s(6232)})),t("moment",[],(function(){return s(5030)})),t("moment-timezone",[],(function(){return s(1420)})),t("node-html-parser",[],(function(){return s(8717)})),t("prop-types",[],(function(){return s(1169)})),t("tether",[],(function(){return s(8672)})),void t("tracked-toolbox",["@ember/debug","@ember/object","@glimmer/tracking","@glimmer/tracking/primitives/cache"],(function(){return s(6271)})))},5033:function(e,r){window._eai_r=require,window._eai_d=define}},s={} function t(e){var n=s[e] if(void 0!==n)return n.exports var i=s[e]={id:e,loaded:!1,exports:{}} @@ -30,6 +30,6 @@ var r=(r,s)=>{var n,i,[o,u,j]=s,a=0 if(o.some((r=>0!==e[r]))){for(n in u)t.o(u,n)&&(t.m[n]=u[n]) if(j)var l=j(t)}for(r&&r(s);at(9592))) -var n=t.O(void 0,[471],(()=>t(41))) +s.forEach(r.bind(null,0)),s.push=r.bind(null,s.push.bind(s))})(),t.O(void 0,[471],(()=>t(5033))) +var n=t.O(void 0,[471],(()=>t(8476))) n=t.O(n),__ember_auto_import__=n})() diff --git a/versions/master/assets/chunk.178.2d1dd645789d8f67f357.js b/versions/master/assets/chunk.178.a928faaede5b9937b219.js similarity index 87% rename from versions/master/assets/chunk.178.2d1dd645789d8f67f357.js rename to versions/master/assets/chunk.178.a928faaede5b9937b219.js index 865fa9773..dfab48bfd 100644 --- a/versions/master/assets/chunk.178.2d1dd645789d8f67f357.js +++ b/versions/master/assets/chunk.178.a928faaede5b9937b219.js @@ -1,4 +1,4 @@ -var __ember_auto_import__;(()=>{var r,e={9592:function(r,e){window._eai_r=require,window._eai_d=define},2681:(r,e,o)=>{var i,t +var __ember_auto_import__;(()=>{var r,e={5033:function(r,e){window._eai_r=require,window._eai_d=define},6993:(r,e,o)=>{var i,t r.exports=(i=_eai_d,t=_eai_r,window.emberAutoImportDynamic=function(r){return 1===arguments.length?t("_eai_dyn_"+r):t("_eai_dynt_"+r)(Array.prototype.slice.call(arguments,1))},window.emberAutoImportSync=function(r){return t("_eai_sync_"+r)(Array.prototype.slice.call(arguments,1))},void i("qunit",[],(function(){return o(7275)})))}},o={} function i(r){var t=o[r] if(void 0!==t)return t.exports @@ -15,6 +15,6 @@ var e=(e,o)=>{var t,n,[a,_,l]=o,p=0 if(a.some((e=>0!==r[e]))){for(t in _)i.o(_,t)&&(i.m[t]=_[t]) if(l)var u=l(i)}for(e&&e(o);pi(9592))) -var t=i.O(void 0,[275],(()=>i(2681))) +o.forEach(e.bind(null,0)),o.push=e.bind(null,o.push.bind(o))})(),i.O(void 0,[275],(()=>i(5033))) +var t=i.O(void 0,[275],(()=>i(6993))) t=i.O(t),__ember_auto_import__=t})() diff --git a/versions/master/assets/ember-cli-mirage-docs-5369b9c2c456bc74608b9d04de3c40cf.js b/versions/master/assets/ember-cli-mirage-docs-f5788b741f6b449984ed53d443b80b20.js similarity index 87% rename from versions/master/assets/ember-cli-mirage-docs-5369b9c2c456bc74608b9d04de3c40cf.js rename to versions/master/assets/ember-cli-mirage-docs-f5788b741f6b449984ed53d443b80b20.js index 75af65ed9..f8020a7c1 100644 --- a/versions/master/assets/ember-cli-mirage-docs-5369b9c2c456bc74608b9d04de3c40cf.js +++ b/versions/master/assets/ember-cli-mirage-docs-f5788b741f6b449984ed53d443b80b20.js @@ -36,7 +36,7 @@ var s=(0,t.createTemplateFactory)({id:"5ugqzygz",block:'[[[10,0],[14,0,"docs-md" e.default=s})),define("ember-cli-mirage-docs/docs/advanced/mocking-guids",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"G3eGuKKz",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"mocking-guids"],[14,0,"docs-md__h1"],[12],[1,"Mocking GUIDs"],[13],[1,"\\n "],[10,2],[12],[1,"Some applications use GUIDs (or UUIDs) instead of auto-incrementing integers as identifiers for their models."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage supports the ability to overwrite how its database assigns IDs to new records via the "],[10,"code"],[12],[1,"IdentityManager"],[13],[1," class. You can generate model-specific managers or an application-wide manager to customize how your database behaves."],[13],[1,"\\n"],[10,2],[12],[1,"To generate a new identity manager, use the blueprint:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember generate mirage-identity-manager \\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"A custom identity manager must implement these methods:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,"code"],[12],[1,"fetch"],[13],[1,", which must return an identifier not used yet."],[13],[1,"\\n"],[10,"li"],[12],[10,"code"],[12],[1,"set"],[13],[1,", which is called with an "],[10,"code"],[12],[1,"id"],[13],[1," of a record being insert in mirage\'s database."],[13],[1,"\\n"],[10,"li"],[12],[10,"code"],[12],[1,"reset"],[13],[1,", which should reset database to initial state."],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"Here\'s an example implementation for an identity manager that mocks GUIDs:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { v4 "],[10,1],[14,0,"hljs-keyword"],[12],[1,"as"],[13],[1," getUuid } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-uuid\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"class"],[13],[1," {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"constructor"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1," = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Set"],[13],[1,"();\\n }\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Returns a new unused unique identifier."],[13],[1,"\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fetch"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," uuid = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getUuid"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"while"],[13],[1," ("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"has"],[13],[1,"(uuid)) {\\n uuid = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getUuid"],[13],[1,"();\\n }\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"add"],[13],[1,"(uuid);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," uuid;\\n }\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Registers an identifier as used. Must throw if identifier is already used."],[13],[1,"\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"id"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"if"],[13],[1," ("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"has"],[13],[1,"(id)) {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"throw"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Error"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"`ID "],[10,1],[14,0,"hljs-subst"],[12],[1,"${id}"],[13],[1," has already been used.`"],[13],[1,");\\n }\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"add"],[13],[1,"(id);\\n }\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Resets all used identifiers to unused."],[13],[1,"\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"reset"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"clear"],[13],[1,"();\\n }\\n}\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/advanced/mocking-guids.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/advanced/server-configuration",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"xg3hYjvo",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"server-configuration"],[14,0,"docs-md__h1"],[12],[1,"Server configuration"],[13],[1,"\\n "],[10,2],[12],[1,"The MirageJS server is configured for you by ember-cli-mirage. However, if you\\nneed to customize the server you can by creating a makeServer function in the\\nconfig.js."],[13],[1,"\\n"],[10,2],[12],[1,"Typically, the "],[10,"code"],[12],[1,"/mirage/config.js"],[13],[1," file contains a single default export which\\nis a function defining all your Mirage route handlers. Ember CLI Mirage then\\nuses this function, along with all the other modules you\'ve defined in\\n"],[10,"code"],[12],[1,"mirage/models"],[13],[1,", "],[10,"code"],[12],[1,"mirage/fixtures"],[13],[1,", "],[10,"code"],[12],[1,"mirage/factories"],[13],[1,", and\\n"],[10,"code"],[12],[1,"mirage/serializers"],[13],[1,", to create your Mirage JS server when your app boots up\\nin development and testing."],[13],[1,"\\n"],[10,2],[12],[1,"You can now opt in to having more control over exactly how your Mirage server\\nis instantiated using the same code as the mirageJS examples of creating a server \\nby changing your current default export that represents the routes to a normal function,\\nthen creating a new default export function that creates the mirageJS server."],[13],[1,"\\n"],[10,2],[12],[1,"This new default export function receives a single argument named "],[10,"code"],[12],[1,"config"],[13],[1,", \\nwhich contains all the factory/fixture/serializer/model modules that exist \\nin your project\'s "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory. This saves you from having to import \\neach module explicitly and then pass it into your Mirage server, just like \\nyou\'re used to with the default setup."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"config"],[13],[1," argument maps exactly to everything inside of your "],[10,"code"],[12],[1,"/mirage"],[13],[1,"\\ndirectory - notably, it does not contain the autogenerated Mirage model\\ndefinitions derived from your Ember Data models, which is an important feature\\nof Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper\\nhas been provided named "],[10,"code"],[12],[1,"discoverEmberDataModels"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," \\npackage that you can use to augment your config with these models so that your Mirage schema is\\nautomatically inferred from your host application\'s Ember Data models and\\nrelationships. The snippet below shows how to do this. Note that the order\\nhere matters if you also have models defined in your "],[10,"code"],[12],[1,"/mirage/models"],[13],[1,"\\ndirectory, as those model definitions would \\"win\\" in the event of a conflict\\nwith the ones autodiscovered from Ember Data. (However, most of time if you\\nare inferring your Mirage schema from Ember Data, you shouldn\'t need to define\\nadditional models.)"],[13],[1,"\\n"],[10,2],[12],[1,"Finally, your route handlers just need to be passed to the "],[10,"code"],[12],[1,"routes()"],[13],[1," key in\\nyour Mirage config. You can do this inline, or you can make them a separate\\nfunction, and organize that function however you choose."],[13],[1,"\\n"],[10,2],[12],[1,"You should also add "],[10,"code"],[12],[1,"miragejs"],[13],[1," to your project\'s dependencies in\\nyour "],[10,"code"],[12],[1,"package.json"],[13],[1," file, since you are now importing directly from it. Note\\nthat this gives you the added benefit of being able to upgrade "],[10,"code"],[12],[1,"miragejs"],[13],[1,"\\nindependently of "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1,". "],[13],[1,"\\n"],[10,2],[12],[1,"All the objects from "],[10,"code"],[12],[1,"miragejs"],[13],[1," are re-exported in "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," such as \\n"],[10,"code"],[12],[1,"Model"],[13],[1,", "],[10,"code"],[12],[1,"belongsTo"],[13],[1,", "],[10,"code"],[12],[1,"hasMany"],[13],[1," as well as "],[10,"code"],[12],[1,"Fixtures"],[13],[1,", "],[10,"code"],[12],[1,"Traits"],[13],[1," for example. \\nThese should in the future also be imported directly from "],[10,"code"],[12],[1,"miragejs"],[13],[1," as \\neventually these re-exports will be removed. This will help align the \\n"],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," users with the rest of the Mirage JS community."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with inline routes"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n },\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with routes in an external function"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#serializers"],[14,0,"heading-anchor"],[12],[1,"Serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your \\nserver configuration to have mirage perform this for you."],[13],[1,"\\n"],[10,2],[12],[1,"When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage\\nversion of the model. With serializers, you may have created a mirage serializer to override some methods, but would still \\nlike Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than\\nthe way you merge the models."],[13],[1,"\\n"],[10,2],[12],[10,"code"],[12],[1,"applyEmberDataSerializers"],[13],[1," will apply the "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"attrs"],[13],[1," from your ember data serializers to your mirage serializers.\\nIf you have not created a mirage serializer it will create one and extend it from your mirage application serializer.\\nEnsure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand \\nhow to use "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"transforms"],[13],[1,". If you have not created a mirage serializer named application, the created serializer \\nwill extend EmberDataSerializer directly."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example of having Mirage adjust/create your serializers similiar to ember data models"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels, applyEmberDataSerializers } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"makeServer"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"serializers"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"applyEmberDataSerializers"],[13],[1,"(config."],[10,1],[14,0,"hljs-property"],[12],[1,"serializers"],[13],[1,"),\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/advanced/server-configuration.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"AflMJzcs",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"server-configuration"],[14,0,"docs-md__h1"],[12],[1,"Server configuration"],[13],[1,"\\n "],[10,2],[12],[1,"The MirageJS server is configured for you by ember-cli-mirage. However, if you\\nneed to customize the server you can by creating a makeServer function in the\\nconfig.js."],[13],[1,"\\n"],[10,2],[12],[1,"Typically, the "],[10,"code"],[12],[1,"/mirage/config.js"],[13],[1," file contains a single default export which\\nis a function defining all your Mirage route handlers. Ember CLI Mirage then\\nuses this function, along with all the other modules you\'ve defined in\\n"],[10,"code"],[12],[1,"mirage/models"],[13],[1,", "],[10,"code"],[12],[1,"mirage/fixtures"],[13],[1,", "],[10,"code"],[12],[1,"mirage/factories"],[13],[1,", and\\n"],[10,"code"],[12],[1,"mirage/serializers"],[13],[1,", to create your Mirage JS server when your app boots up\\nin development and testing."],[13],[1,"\\n"],[10,2],[12],[1,"You can now opt in to having more control over exactly how your Mirage server\\nis instantiated using the same code as the mirageJS examples of creating a server \\nby changing your current default export that represents the routes to a normal function,\\nthen creating a new default export function that creates the mirageJS server."],[13],[1,"\\n"],[10,2],[12],[1,"This new default export function receives a single argument named "],[10,"code"],[12],[1,"config"],[13],[1,", \\nwhich contains all the factory/fixture/serializer/model modules that exist \\nin your project\'s "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory. This saves you from having to import \\neach module explicitly and then pass it into your Mirage server, just like \\nyou\'re used to with the default setup."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"config"],[13],[1," argument maps exactly to everything inside of your "],[10,"code"],[12],[1,"/mirage"],[13],[1,"\\ndirectory - notably, it does not contain the autogenerated Mirage model\\ndefinitions derived from your Ember Data models, which is an important feature\\nof Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper\\nhas been provided named "],[10,"code"],[12],[1,"discoverEmberDataModels"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," \\npackage that you can use to augment your config with these models so that your Mirage schema is\\nautomatically inferred from your host application\'s Ember Data models and\\nrelationships. The snippet below shows how to do this. Note that the order\\nhere matters if you also have models defined in your "],[10,"code"],[12],[1,"/mirage/models"],[13],[1,"\\ndirectory, as those model definitions would \\"win\\" in the event of a conflict\\nwith the ones autodiscovered from Ember Data. (However, most of time if you\\nare inferring your Mirage schema from Ember Data, you shouldn\'t need to define\\nadditional models.)"],[13],[1,"\\n"],[10,2],[12],[1,"Finally, your route handlers just need to be passed to the "],[10,"code"],[12],[1,"routes()"],[13],[1," key in\\nyour Mirage config. You can do this inline, or you can make them a separate\\nfunction, and organize that function however you choose."],[13],[1,"\\n"],[10,2],[12],[1,"You should also add "],[10,"code"],[12],[1,"miragejs"],[13],[1," to your project\'s dependencies in\\nyour "],[10,"code"],[12],[1,"package.json"],[13],[1," file, since you are now importing directly from it. Note\\nthat this gives you the added benefit of being able to upgrade "],[10,"code"],[12],[1,"miragejs"],[13],[1,"\\nindependently of "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1,". "],[13],[1,"\\n"],[10,2],[12],[1,"All the objects from "],[10,"code"],[12],[1,"miragejs"],[13],[1," are re-exported in "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," such as \\n"],[10,"code"],[12],[1,"Model"],[13],[1,", "],[10,"code"],[12],[1,"belongsTo"],[13],[1,", "],[10,"code"],[12],[1,"hasMany"],[13],[1," as well as "],[10,"code"],[12],[1,"Fixtures"],[13],[1,", "],[10,"code"],[12],[1,"Traits"],[13],[1," for example. \\nThese should in the future also be imported directly from "],[10,"code"],[12],[1,"miragejs"],[13],[1," as \\neventually these re-exports will be removed. This will help align the \\n"],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," users with the rest of the Mirage JS community."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with inline routes"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n },\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with routes in an external function"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#serializers"],[14,0,"heading-anchor"],[12],[1,"Serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your \\nserver configuration to have mirage perform this for you."],[13],[1,"\\n"],[10,2],[12],[1,"When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage\\nversion of the model. With serializers, you may have created a mirage serializer to override some methods, but would still \\nlike Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than\\nthe way you merge the models."],[13],[1,"\\n"],[10,2],[12],[10,"code"],[12],[1,"applyEmberDataSerializers"],[13],[1," will apply the "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"attrs"],[13],[1," from your ember data serializers to your mirage serializers.\\nIf you have not created a mirage serializer it will create one and extend it from your mirage application serializer.\\nEnsure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand \\nhow to use "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"transforms"],[13],[1,". If you have not created a mirage serializer named application, the created serializer \\nwill extend EmberDataSerializer directly."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example of having Mirage adjust/create your serializers similiar to ember data models"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels, applyEmberDataSerializers } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"serializers"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"applyEmberDataSerializers"],[13],[1,"(config."],[10,1],[14,0,"hljs-property"],[12],[1,"serializers"],[13],[1,"),\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/advanced/server-configuration.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/advanced/simulating-cookie-responses",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"TIEtL3SP",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"simulating-cookie-responses"],[14,0,"docs-md__h1"],[12],[1,"Simulating cookie responses"],[13],[1,"\\n "],[10,2],[12],[1,"Although Mirage allows setting headers in a response, the\\nXMLHttpRequest spec explicitly\\n"],[10,3],[14,6,"http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method"],[14,0,"docs-md__a"],[12],[1,"forbids access"],[13],[1,"\\nto "],[10,"code"],[12],[1,"Set-Cookie"],[13],[1," and "],[10,"code"],[12],[1,"Set-Cookie2"],[13],[1," headers. As a result Mirage\\nresponses cannot set cookies via headers."],[13],[1,"\\n"],[10,2],[12],[1,"However, you can simulate receiving cookies from an ajax\\ncall at the browser level by setting them in a route\\nfunction handler:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"post"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/users/login\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"schema"],[13],[1," =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// log in for 24 hours"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," now = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Date"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," cookieExpiration = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Date"],[13],[1,"(now."],[10,1],[14,0,"hljs-title function_"],[12],[1,"getTime"],[13],[1,"() + ("],[10,1],[14,0,"hljs-number"],[12],[1,"24"],[13],[1," * "],[10,1],[14,0,"hljs-number"],[12],[1,"3600"],[13],[1," * "],[10,1],[14,0,"hljs-number"],[12],[1,"1000"],[13],[1,"));\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"document"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"cookie"],[13],[1,"="],[10,1],[14,0,"hljs-string"],[12],[1,"`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires="],[10,1],[14,0,"hljs-subst"],[12],[1,"${cookieExpiration.toUTCString()}"],[13],[1,";`"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"users"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"("],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Your Ember client code will now have access to any cookies set\\nusing "],[10,"code"],[12],[1,"document.cookie"],[13],[1,"."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/advanced/simulating-cookie-responses.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/advanced/switching-between-scenarios",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 @@ -58,11 +58,11 @@ var s=(0,t.createTemplateFactory)({id:"nKgBk0hD",block:'[[[10,0],[14,0,"docs-md" e.default=s})),define("ember-cli-mirage-docs/docs/data-layer/serializers/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"r2CE/nQb",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"serializers"],[14,0,"docs-md__h1"],[12],[1,"Serializers"],[13],[1,"\\n "],[10,2],[12],[1,"A serializer is an object responsible for transforming a Model or Collection that\'s returned from your route handlers"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies/:id\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"(request."],[10,1],[14,0,"hljs-property"],[12],[1,"params"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"into a formatted JSON payload"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,";,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"suitable for consumption by your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"Serializers are the last main part of Mirage\'s architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s see how they work."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"choosing-which-serializer-to-use"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#choosing-which-serializer-to-use"],[14,0,"heading-anchor"],[12],[1,"Choosing which serializer to use"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The first step in working with Mirage\'s serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"The JSON payload above is an example of an API that follows "],[10,3],[14,6,"https://jsonapi.org/"],[14,0,"docs-md__a"],[12],[1,"the JSON:API spec"],[13],[1,". You\'ll see it used a lot in the Ember ecosystem, because it\'s the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined."],[13],[1,"\\n"],[10,2],[12],[1,"If you are starting a new app, it\'s recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don\'t use JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"If your app does use JSON:API, Mirage ships with a "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," that will do the heavy lifting for you."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage also ships with two other named serializers, "],[10,"code"],[12],[1,"ActiveModelSerializer"],[13],[1," and "],[10,"code"],[12],[1,"RestSerializer"],[13],[1,", that match two other popular backend formats. "],[10,"code"],[12],[1,"EmberDataSerializer"],[13],[1," is also provided as a variation to the "],[10,"code"],[12],[1,"RestSerializer"],[13],[1," that uses the "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"attrs"],[13],[1," defined in your applications ember data serializers, similar to how models are auto discovered. See the section on "],[1,[28,[35,0],["Ember Data Serializer","docs.data-layer.serializers.ember-data-serializer"],null]],[1," for more information."],[13],[1,"\\n"],[10,2],[12],[1,"If your backend uses a different format, you\'ll need to choose the closest one and customize it to match your production format. We\'ll talk about that later in this guide."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"defining-serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#defining-serializers"],[14,0,"heading-anchor"],[12],[1,"Defining serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Once you\'ve selected the appropriate serializer, define your default application-wide serializer by exporting it from "],[10,"code"],[12],[1,"/mirage/serializers/application.js"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This specifies the serializer to use for each Model and Collection in your system."],[13],[1,"\\n"],[10,2],[12],[1,"If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s use Mirage\'s generator to create a "],[10,"code"],[12],[1,"Movie"],[13],[1," serializer:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember g mirage-serializer movie\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This creates the file"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'./application\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"which follows the best practice of model-specific serializers extending from your Application serializer."],[13],[1,"\\n"],[10,2],[12],[1,"You can now customize the behavior of how "],[10,"code"],[12],[1,"Movie"],[13],[1," models and collections are serialized into JSON."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"customizing-serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#customizing-serializers"],[14,0,"heading-anchor"],[12],[1,"Customizing serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"When it comes to customizing your application\'s serializers, you\'ll mostly be tweaking Mirage\'s defaults."],[13],[1,"\\n"],[10,2],[12],[1,"For example, if your Ember app expects attribute names to be PascalCase"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n\\n{\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ReleaseDate"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"you might override the Serializer\'s "],[10,"code"],[12],[1,"keyForAttribute"],[13],[1," method:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { classify } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/string\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"keyForAttribute"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"attr"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"classify"],[13],[1,"(attr);\\n }\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"See the API docs for each serializer to learn more about all the customization hooks available."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"relationships"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#relationships"],[14,0,"heading-anchor"],[12],[1,"Relationships"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships."],[13],[1,"\\n"],[10,2],[12],[1,"For example, the "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," respects query param includes"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"GET /movies/1?include=cast-members\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes."],[13],[1,"\\n"],[10,2],[12],[1,"There\'s an option on "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," that enables this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now, a GET request to "],[10,"code"],[12],[1,"/movies/1"],[13],[1," would respond with this payload:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,";,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-members\'"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'people\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1," },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'people\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'2\'"],[13],[1," },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'people\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'3\'"],[13],[1," },\\n ]\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The Ember app could now use these ids to subsequently fetch the related cast members."],[13],[1,"\\n"],[10,2],[12],[1,"Other times, an Ember app expects to get a link to fetch related data. The "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," also has a hook for this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'./application\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"links"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"movie"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," {\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-members\'"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"`/api/movies/"],[10,1],[14,0,"hljs-subst"],[12],[1,"${movie.id}"],[13],[1,"/cast-members`"],[13],[1,"\\n }\\n };\\n }\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now a GET request to "],[10,"code"],[12],[1,"/movies/1"],[13],[1," would respond with this payload:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,";,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-members\'"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"links"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"`/api/movies/1/cast-members`"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"working-with-serialized-json"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#working-with-serialized-json"],[14,0,"heading-anchor"],[12],[1,"Working with serialized JSON"],[13],[13],[1,"\\n "],[10,2],[12],[1,"While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler."],[13],[1,"\\n"],[10,2],[12],[1,"You can use the "],[10,"code"],[12],[1,"this.serialize"],[13],[1," helper method to do this - make sure to use a "],[10,"code"],[12],[1,"function"],[13],[1," instead of a fat arrow so you have access to the correct "],[10,"code"],[12],[1,"this"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movies = schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(movies);\\n\\n json."],[10,1],[14,0,"hljs-property"],[12],[1,"meta"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"size"],[13],[1," = movies."],[10,1],[14,0,"hljs-property"],[12],[1,"length"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," json;\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"serialize"],[13],[1," helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer."],[13],[1,"\\n"],[10,2],[12],[1,"You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movies = schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(movies, "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie-with-relationship\'"],[13],[1,");\\n\\n json."],[10,1],[14,0,"hljs-property"],[12],[1,"meta"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"size"],[13],[1," = movies."],[10,1],[14,0,"hljs-property"],[12],[1,"length"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," json;\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This route handler would use the "],[10,"code"],[12],[1,"mirage/serializers/movie-with-relationship.js"],[13],[1," serializer to transform the collection of movies into a "],[10,"code"],[12],[1,"json"],[13],[1," payload, which is then modified and then finally returned from the route handler."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn\'t adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models."],[13],[1,"\\n"],[10,2],[12],[1,"The more conventional your backend API is, the less code you\'ll need to write – not only in Mirage, but also in other parts of your Ember application!"],[13],[1,"\\n"],[10,2],[12],[1,"Be sure to check out the "],[1,[28,[35,0],["Serializer","docs.api.item","modules/serializerSerializer#keyForAttribute"],null]],[1," and "],[1,[28,[35,0],["JSONAPISerializer","docs.api.item","modules/serializers/json-api-serializerJSONAPISerializer"],null]],[1," docs to learn about all the hooks available to customize your serializer layer."],[13],[1,"\\n"],[10,2],[12],[1,"Now that we\'ve covered the ins and outs of Mirage\'s data layer, we\'re ready to see how we can use Mirage to effectively test our Ember application."],[13],[1,"\\n"],[13]],[],false,["docs-link"]]',moduleName:"ember-cli-mirage-docs/docs/data-layer/serializers/index.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/getting-started/installation",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"/Nxn8xbp",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"installation"],[14,0,"docs-md__h1"],[12],[1,"Installation"],[13],[1,"\\n "],[10,2],[12],[1,"To install Mirage, run"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember install ember-cli-mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Ember should install the addon and add a "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to the root of your project."],[13],[1,"\\n"],[10,2],[12],[1,"Check out the "],[1,[28,[35,0],["upgrade guide","docs.getting-started.upgrade-guide"],null]],[1," if you\'re coming from a previous version of Mirage."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-embroider-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-embroider-users"],[14,0,"heading-anchor"],[12],[1,"Note for Embroider users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Embroider does not recognizes changes to Ember CLI Mirage configuration in "],[10,"code"],[12],[1,"mirage/"],[13],[1," folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in "],[10,"code"],[12],[1,"EMBROIDER_REBUILD_ADDONS"],[13],[1," environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-prettier-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-prettier-users"],[14,0,"heading-anchor"],[12],[1,"Note for Prettier users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There\'s an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you\'re using Prettier and install Mirage, you can either"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[1,"pin "],[10,"code"],[12],[1,"eslint-plugin-prettier"],[13],[1," to 2.6.0, or"],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[1,"add the following to "],[10,"code"],[12],[1,".eslintignore"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/mirage\\n"],[13],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"note-for-fastboot-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-fastboot-users"],[14,0,"heading-anchor"],[12],[1,"Note for FastBoot users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot."],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/1411"],[14,0,"docs-md__a"],[12],[1,"FastBoot support"],[13],[1," is a highly requested feature we are working on. In the meantime, you\'ll need to develop your FastBoot pages against a local server."],[13],[1,"\\n"],[10,2],[12],[1,"You can always bypass FastBoot page generation locally by running"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"FASTBOOT_DISABLED=true ember serve\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage will then run in the browser as expected, and you can develop your client app as normal."],[13],[1,"\\n"],[13]],[],false,["docs-link"]]',moduleName:"ember-cli-mirage-docs/docs/getting-started/installation.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"hySRtFG/",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"installation"],[14,0,"docs-md__h1"],[12],[1,"Installation"],[13],[1,"\\n "],[10,2],[12],[1,"To install Mirage, run"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember install ember-cli-mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Ember should install the addon and add a "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to the root of your project. \\nEmber-cli-mirage depends on "],[10,3],[14,6,"https://miragejs.com/"],[14,0,"docs-md__a"],[12],[1,"MirageJS"],[13],[1," as a peer dependency and will add it to your applications "],[10,"code"],[12],[1,"package.json"],[13],[1,". "],[13],[1,"\\n"],[10,2],[12],[1,"Check out the "],[1,[28,[35,0],["upgrade guide","docs.getting-started.upgrade-guide"],null]],[1," if you\'re coming from a previous version of Mirage."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-embroider-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-embroider-users"],[14,0,"heading-anchor"],[12],[1,"Note for Embroider users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Embroider does not recognizes changes to Ember CLI Mirage configuration in "],[10,"code"],[12],[1,"mirage/"],[13],[1," folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in "],[10,"code"],[12],[1,"EMBROIDER_REBUILD_ADDONS"],[13],[1," environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-prettier-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-prettier-users"],[14,0,"heading-anchor"],[12],[1,"Note for Prettier users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There\'s an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you\'re using Prettier and install Mirage, you can either"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[1,"pin "],[10,"code"],[12],[1,"eslint-plugin-prettier"],[13],[1," to 2.6.0, or"],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[1,"add the following to "],[10,"code"],[12],[1,".eslintignore"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/mirage\\n"],[13],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"note-for-fastboot-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-fastboot-users"],[14,0,"heading-anchor"],[12],[1,"Note for FastBoot users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot."],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/1411"],[14,0,"docs-md__a"],[12],[1,"FastBoot support"],[13],[1," is a highly requested feature we are working on. In the meantime, you\'ll need to develop your FastBoot pages against a local server."],[13],[1,"\\n"],[10,2],[12],[1,"You can always bypass FastBoot page generation locally by running"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"FASTBOOT_DISABLED=true ember serve\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage will then run in the browser as expected, and you can develop your client app as normal."],[13],[1,"\\n"],[13]],[],false,["docs-link"]]',moduleName:"ember-cli-mirage-docs/docs/getting-started/installation.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/getting-started/overview",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"7vrxUmNi",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"overview"],[14,0,"docs-md__h1"],[12],[1,"Overview"],[13],[1,"\\n "],[10,2],[12],[1,"The file mirage/config.js contains the boilerplate code to create a mirage server."],[13],[1,"\\n"],[10,2],[12],[1,"You can customize the server that is created here by following the mirage documentation\\n"],[10,3],[14,6,"https://miragejs.com/docs/getting-started/overview/"],[14,0,"docs-md__a"],[12],[1,"https://miragejs.com/docs/getting-started/overview/"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage lets you simulate API responses by writing "],[10,"strong"],[12],[1,"route handlers"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"The simplest example of a route handler is a function that returns an object:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"namespace"],[13],[1," = "],[10,1],[14,0,"hljs-string"],[12],[1,"\'api\'"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1," } },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Inception\'"],[13],[1," } },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Dunkirk\'"],[13],[1," } },\\n ]\\n };\\n });\\n\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now whenever your Ember app makes a GET request to "],[10,"code"],[12],[1,"/api/movies"],[13],[1,", Mirage will respond with this data."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"dynamic-data"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#dynamic-data"],[14,0,"heading-anchor"],[12],[1,"Dynamic data"],[13],[13],[1,"\\n "],[10,2],[12],[1,"This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,"em"],[12],[1,"They\'re inflexible"],[13],[1,". What if you want to change the data for this route in your tests?"],[13],[1,"\\n"],[10,"li"],[12],[10,"em"],[12],[1,"They contain formatting logic"],[13],[1,". Logic that\'s concerned with the shape of your JSON payload (e.g. the "],[10,"code"],[12],[1,"data"],[13],[1," and "],[10,"code"],[12],[1,"attributes"],[13],[1," keys) is now duplicated across all your route handlers."],[13],[1,"\\n"],[10,"li"],[12],[10,"em"],[12],[1,"They\'re too basic."],[13],[1," Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down."],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"Mirage provides a "],[10,"strong"],[12],[1,"data layer"],[13],[1," that lets you write more powerful server implementations. Let\'s see how it works by replacing our basic stub data above."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"creating-a-model"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#creating-a-model"],[14,0,"heading-anchor"],[12],[1,"Creating a model"],[13],[13],[1,"\\n "],[10,2],[12],[1,"First, we\'ll need to tell Mirage that we have a dynamic "],[10,"code"],[12],[1,"Movie"],[13],[1," model."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re using Ember Data and you already have a "],[10,"code"],[12],[1,"Movie"],[13],[1," model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won\'t have any files in the "],[10,"code"],[12],[1,"mirage/models"],[13],[1," directory."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re not using Ember Data, you can use the "],[10,"code"],[12],[1,"mirage-model"],[13],[1," generator to create a model from the command line:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-bash"],[12],[1,"$ ember g mirage-model movie\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This generates the following file:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"writing-a-dynamic-route-handler"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#writing-a-dynamic-route-handler"],[14,0,"heading-anchor"],[12],[1,"Writing a dynamic route handler"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Models let our route handlers take advantage of Mirage\'s "],[10,"em"],[12],[1,"in-memory database"],[13],[1,". The database makes our route handlers dynamic, so we can change the data that\'s returned without having to rewrite the handler."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s update our route handler to be dynamic:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"schema"],[13],[1," argument lets us access our new "],[10,"code"],[12],[1,"Movie"],[13],[1," model. This route will now respond with all the authors in Mirage\'s database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage\'s database, instead of having to write a different version of the handler for each scenario we want to simulate."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"seeding-the-database"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#seeding-the-database"],[14,0,"heading-anchor"],[12],[1,"Seeding the database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Right now, if we sent a request to our new handler above, the response would look something like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /api/movies"],[13],[1,"\\n"],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n]\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"That\'s because Mirage\'s database is empty."],[13],[1,"\\n"],[10,2],[12],[1,"To actually seed our database with fake data, we\'ll use "],[10,"em"],[12],[1,"factories"],[13],[1,". Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s create a factory for our author with"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"$ "],[13],[1,"ember g mirage-factory movie\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/factories/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"title"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"i"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"`Movie "],[10,1],[14,0,"hljs-subst"],[12],[1,"${i}"],[13],[1,"`"],[13],[1,"; "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Movie 1, Movie 2, etc."],[13],[1,"\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"year"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," min = "],[10,1],[14,0,"hljs-number"],[12],[1,"1950"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," max = "],[10,1],[14,0,"hljs-number"],[12],[1,"2019"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Math"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"floor"],[13],[1,"("],[10,1],[14,0,"hljs-title class_"],[12],[1,"Math"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"random"],[13],[1,"() * (max - min + "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,")) + min;\\n },\\n\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This factory creates objects like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"[\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Movie 1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1992"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n },\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Movie 2\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2008"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ..."],[13],[1,"\\n]\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and so on, which will automatically be inserted into the "],[10,"code"],[12],[1,"movies"],[13],[1," database table. The database will assign each record an "],[10,"code"],[12],[1,"id"],[13],[1,", and now we can interact with this data in our route handlers."],[13],[1,"\\n"],[10,2],[12],[1,"To actually use our new factory definition, we can call the "],[10,"code"],[12],[1,"server.create"],[13],[1," and "],[10,"code"],[12],[1,"server.createList"],[13],[1," methods."],[13],[1,"\\n"],[10,2],[12],[1,"To seed our development database, use the function in the "],[10,"code"],[12],[1,"scenarios/default.js"],[13],[1," file:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/scenarios/default.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"server"],[13],[1,") {\\n\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"10"],[13],[1,");\\n\\n};\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now when our Ember app makes a GET request to "],[10,"code"],[12],[1,"/api/movies"],[13],[1," using the route handler above, we\'ll see something that looks like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /api/movies"],[13],[1,"\\n"],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"movies\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Movie 1\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1992"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n }\\n },\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"movies\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Movie 2\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2008"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n }\\n },\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ..."],[13],[1,"\\n]\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"As we can see, this response is now influenced by the run-time state of our database."],[13],[1,"\\n"],[10,2],[12],[1,"In acceptance tests, "],[10,"code"],[12],[1,"scenarios/default.js"],[13],[1," is ignored, and instead you can use "],[10,"code"],[12],[1,"this.server"],[13],[1," to setup your database in the state needed for the test:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// tests/acceptance/movies-test.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can view the movies\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"movie\\""],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/home\\""],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"[data-test-id=\'movie-row\']\\""],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"exists"],[13],[1,"({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"count"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1," });\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You can also pass attribute overrides directly to "],[10,"code"],[12],[1,"create"],[13],[1," or "],[10,"code"],[12],[1,"createList"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can view the movie title\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movie = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Interstellar\\""],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"`/movies/"],[10,1],[14,0,"hljs-subst"],[12],[1,"${movie.id}"],[13],[1,"`"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'h1\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"includesText"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Interstellar\\""],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You now have a simple way to set up your Mirage server\'s initial data, both during development and on a per-test basis."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"associations"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#associations"],[14,0,"heading-anchor"],[12],[1,"Associations"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s say your movie has many cast-members. You can declare this relationship in your model:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", hasMany } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"castMembers"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasMany"],[13],[1,"()\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/cast-member.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"movie"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id/cast-members\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movie = schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"(request."],[10,1],[14,0,"hljs-property"],[12],[1,"params"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," movie."],[10,1],[14,0,"hljs-property"],[12],[1,"castMembers"],[13],[1,";\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and when creating graphs of related data:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can see a movie\'s cast members\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"castMembers"],[13],[1,": [\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-member\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Matthew McConaughey\'"],[13],[1," }),\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-member\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Anne Hathaway\'"],[13],[1," }),\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-member\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Jessica Chastain\'"],[13],[1," })\\n ]\\n });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/\'"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'li.cast-member\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"exists"],[13],[1,"({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"count"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1," });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage uses foreign keys to keep track of these related models for you, so you don\'t have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage\'s database."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#serializers"],[14,0,"heading-anchor"],[12],[1,"Serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Mirage is designed for you to be able to completely replicate your production server."],[13],[1,"\\n"],[10,2],[12],[1,"So far, we\'ve seen that Mirage\'s default payloads are formatted using the "],[10,3],[14,6,"https://jsonapi.org"],[14,0,"docs-md__a"],[12],[1,"JSON:API"],[13],[1," spec. This spec produces payloads that look like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"For example, your API responses might look more like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"movies"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This is why Mirage "],[10,"em"],[12],[1,"serializers"],[13],[1," exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"keyForAttribute"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"attr"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"dasherize"],[13],[1,"(attr);\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"keyForRelationship"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"attr"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"dasherize"],[13],[1,"(attr);\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage\'s serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"include"],[13],[1,": [ "],[10,1],[14,0,"hljs-string"],[12],[1,"\'crewMembers\'"],[13],[1," ]\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"(request."],[10,1],[14,0,"hljs-property"],[12],[1,"params"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n });\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"With the above config, a GET to "],[10,"code"],[12],[1,"/movies/1"],[13],[1," would return automatically include related crew members:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"movie"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'crew-members\'"],[13],[1,": [\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie-id\'"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Matthew McConaughey\'"],[13],[1,"\\n },\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie-id\'"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Anne Hathaway\'"],[13],[1,"\\n },\\n ...\\n ]\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the "],[10,3],[14,6,"../api/modules/serializer~Serializer"],[14,0,"docs-md__a"],[12],[1,"serializer guide"],[13],[1," to learn more."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"shorthands"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#shorthands"],[14,0,"heading-anchor"],[12],[1,"Shorthands"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Mirage has "],[10,"em"],[12],[1,"shorthands"],[13],[1," to reduce the code needed for conventional API routes. For example, the route handler"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"authors"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"can be written as"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"There are also shorthands for "],[10,"code"],[12],[1,"post"],[13],[1,", "],[10,"code"],[12],[1,"patch"],[13],[1," (or "],[10,"code"],[12],[1,"put"],[13],[1,"), and "],[10,"code"],[12],[1,"del"],[13],[1," methods. Here\'s a full set of resourceful routes for an "],[10,"code"],[12],[1,"author"],[13],[1," resource:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors/:id\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"post"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"patch"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors/:id\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"del"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors/:id\'"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"passthrough"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#passthrough"],[14,0,"heading-anchor"],[12],[1,"Passthrough"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Mirage is a great tool to use even if you\'re working on an existing app, or if you don\'t want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn\'t have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"passthrough"],[13],[1,"();\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now you can develop as you normally would, for example against an existing API."],[13],[1,"\\n"],[10,2],[12],[1,"When it comes time to build a new feature, you don\'t have to wait for the API to be updated. Just define the new route that you need"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/comments\'"],[13],[1,");\\n\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"passthrough"],[13],[1,"();\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"That should be enough to get you started!"],[13],[1,"\\n"],[10,2],[12],[1,"The rest of the docs are organized by Mirage\'s higher-level concepts:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Route handlers"],[13],[1," contain the logic around what run-time data Mirage uses to respond to requests."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[1,"The "],[10,"strong"],[12],[1,"Data layer"],[13],[1," is how Mirage stores and tracks changes to your data over time."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"Keep reading to learn more!"],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/getting-started/overview.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/getting-started/upgrade-guide/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"R4xJfTRw",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"upgrade-guide"],[14,0,"docs-md__h1"],[12],[1,"Upgrade guide"],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading from an existing version of Mirage, you can run the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"Using npm\\nnpm install -D ember-cli-mirage@X.X.X\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"Using yarn\\nyarn add -D ember-cli-mirage@X.X.X\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"full-changelog"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#full-changelog"],[14,0,"heading-anchor"],[12],[1,"Full Changelog"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You can view all of Mirage\'s release notes on "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/releases"],[14,0,"docs-md__a"],[12],[1,"our Releases page"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"3-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#3-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"3.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Ensure that all the imports are updated for the objects that were moved to MirageJS. \\nThis is generally the imports in the files in the mirage directory."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// from"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"//to"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Previous the file "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," was a exported default function that defined only your routes.\\nSince MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS."],[13],[1,"\\n"],[10,2],[12],[1,"Change the routes function to no longer be exported as the default function and give it a name, we\\nsuggest "],[10,"code"],[12],[1,"routes"],[13],[1,". Add the below boilerplate code to the top of the "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1,". The end\\nresult would look like this."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," {\\n discoverEmberDataModels,\\n} "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," ("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// This would be your old default export function renamed"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The environment variable discoverEmberDataModels is now longer used. If you wish to \\nnot have "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," auto discover the models, just remove the "],[10,"code"],[12],[1,"...discoverEmberDataModels(),"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"2-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#2-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"2.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-update-import-paths-for-miragejs-imports"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-update-import-paths-for-miragejs-imports"],[14,0,"heading-anchor"],[12],[1,"1. Update import paths for miragejs imports"],[13],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"1-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#1-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"1.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-remove-faker-js"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-remove-faker-js"],[14,0,"heading-anchor"],[12],[1,"1. Remove Faker.js"],[13],[13],[1,"\\n "],[10,2],[12],[1,"When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call "],[10,"code"],[12],[1,"app.import"],[13],[1," in order to use the library in your application code."],[13],[1,"\\n"],[10,2],[12],[1,"Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for "],[10,3],[14,6,"https://github.com/Marak/faker.js"],[14,0,"docs-md__a"],[12],[1,"Faker.js"],[13],[1,", a useful library to have alongside your Mirage factory definitions."],[13],[1,"\\n"],[10,2],[12],[1,"There\'s a few problems with this, most notably that users "],[10,"em"],[12],[1,"had"],[13],[1," to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version."],[13],[1,"\\n"],[10,2],[12],[1,"Now, thanks to "],[10,3],[14,6,"https://github.com/ef4/ember-auto-import"],[14,0,"docs-md__a"],[12],[1,"Ember Auto Import"],[13],[1,", this is no longer the case. Using dependencies directly from npm is painless – just "],[10,"code"],[12],[1,"yarn/npm install"],[13],[1," them and "],[10,"code"],[12],[1,"import"],[13],[1," them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you."],[13],[1,"\\n"],[10,2],[12],[1,"This also means that users can easily manage their project\'s version of Faker (and other similar dependencies) independently of the version of Mirage they\'re using."],[13],[1,"\\n"],[10,2],[12],[1,"For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change."],[13],[1,"\\n"],[10,2],[12],[1,"Here are the steps you\'ll need to take to fix this:"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Ember Auto Import (if it\'s not already installed)"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"ember install ember-auto-import\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Faker.js directly from npm:"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"yarn add -D faker\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"or npm install --save-dev faker\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Change all imports of "],[10,"code"],[12],[1,"faker"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-packge"],[13],[1," to import directly from "],[10,"code"],[12],[1,"faker"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[10,1],[14,0,"hljs-deletion"],[12],[1,"- import { Factory, faker } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import { Factory } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import faker from \'faker\';"],[13],[1,"\\n"],[13],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage-faker-codemod"],[14,0,"docs-md__a"],[12],[1,"There is a codemod"],[13],[1," that will do this for you, thanks to the gracious work of "],[10,3],[14,6,"https://github.com/caseywatts"],[14,0,"docs-md__a"],[12],[1,"Casey Watts"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \\"useful\\" additions. I thought this was a good idea at the time... it wasn\'t. 🙈"],[13],[1,"\\n"],[10,2],[12],[1,"You can look at "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/v0.4.15/addon/faker.js"],[14,0,"docs-md__a"],[12],[1,"the module from v0.4.15"],[13],[1," to see that we added the "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1," and "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1," methods, so if you use these methods too, you\'ll need to refactor them."],[13],[1,"\\n"],[10,2],[12],[1,"Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS:"],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.arrayElement"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.random([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.arrayElement([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1,", use the remainder (modulo) operator:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries(i) {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.cycle([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ let countries = [ \'United States of America\', \'Canada\', \'Mexico\' ];"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return countries[i % countries.length];"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.number"],[13],[1," with min and max options:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," age() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.random.number.range(18, 65);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.number({ min: 18, max: 65 });"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like "],[10,3],[14,6,"https://chancejs.com/"],[14,0,"docs-md__a"],[12],[1,"Chance.js"],[13],[1,", and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"2-new-import-for-setupmirage"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#2-new-import-for-setupmirage"],[14,0,"heading-anchor"],[12],[1,"2. New import for setupMirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Before"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," setupMirage "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support/setup-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// After"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support\\""],[13],[1,";\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"heading-anchor"],[12],[1,"3. Remove deprecated forms of "],[10,"code"],[12],[1,"create"],[13],[1,", "],[10,"code"],[12],[1,"createList"],[13],[1," and "],[10,"code"],[12],[1,"normalizedRequestAttrs"],[13],[13],[13],[1,"\\n "],[10,2],[12],[1,"There are several places in Mirage\'s APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we\'re moving to 1.0, we\'re removing this deprecated/unintentional behavior."],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"server.create"],[13],[1," and "],[10,"code"],[12],[1,"server.createList"],[13],[1," were coded to take a singularized model name, e.g. "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,". It just so happens that "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," also works. That pluralized version is now removed from Mirage."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," to "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Note this also applies to "],[10,"code"],[12],[1,"server.createList"],[13],[1," – the correct form is "],[10,"code"],[12],[1,"server.createList(\'user\', 3)"],[13],[1,", and the pluralized form "],[10,"code"],[12],[1,"server.createList(\'users\', 3)"],[13],[1," is now unsupported."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"this.normalizedRequestAttrs"],[13],[1," in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path."],[13],[1,"\\n"],[10,2],[12],[1,"In this case, you can call "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1," to tell Mirage to expect the payload to be for a "],[10,"code"],[12],[1,"blog-post"],[13],[1," model."],[13],[1,"\\n"],[10,2],[12],[1,"This API was intended to be used with dasherized names, because that\'s how compound model names are specified throughout Mirage when they are represented as strings."],[13],[1,"\\n"],[10,2],[12],[1,"It just so happened that "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blogPost\')"],[13],[1," also worked, by chance, until a refactor. So, that behavior was kept but now is being removed."],[13],[1,"\\n"],[10,2],[12],[1,"The correct usage is "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1,". Using the camelized version of the model name is no longer supported."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that\'s the case!"],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"heading-anchor"],[12],[1,"4. The "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," serializer property now defaults to true"],[13],[13],[1,"\\n "],[10,2],[12],[1,"This applies to the ActiveModelSerializer and RestSerializer."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"normalize"],[13],[1," property on serializers helps Mirage\'s shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly."],[13],[1,"\\n"],[10,2],[12],[1,"There was a gap in the default "],[10,"code"],[12],[1,"normalize"],[13],[1," method for a long time, in that it didn\'t take REST payloads that included foreign keys and looked like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," payload = {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"contact"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Link\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n};\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and turn that "],[10,"code"],[12],[1,"address"],[13],[1," key into a proper JSON:API relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'contacts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Link\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'address\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"We added this feature a while ago, and it\'s controlled with the "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn\'t be a breaking change.)"],[13],[1,"\\n"],[10,2],[12],[1,"We\'re now making "],[10,"code"],[12],[1,"true"],[13],[1," the default, which should be the behavior everyone desires (assuming they\'re using shorthands). This is technically a breaking change, though it\'s unlikely to affect most people."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-3-x-0-4-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-3-x-0-4-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.3.x → 0.4 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There is one primary change in 0.4 that could break your 0.3 app."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.3.x, Mirage\'s JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being "],[10,"code"],[12],[1,"included"],[13],[1," in the payload."],[13],[1,"\\n"],[10,2],[12],[1,"This actually goes against JSON:API\'s design. Foreign keys in the payload are known as "],[10,3],[14,6,"http://jsonapi.org/format/#document-resource-object-linkage"],[14,0,"docs-md__a"],[12],[1,"Resource Linkage"],[13],[1," and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document."],[13],[1,"\\n"],[10,2],[12],[1,"By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a "],[10,"code"],[12],[1,"post"],[13],[1," came back like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'users\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and you forgot to "],[10,"code"],[12],[1,"?include=author"],[13],[1," in your GET request, Ember Data would potentially use the "],[10,"code"],[12],[1,"user:1"],[13],[1," foreign key and lazily fetch the "],[10,"code"],[12],[1,"author"],[13],[1," by making a request to "],[10,"code"],[12],[1,"GET /authors/1"],[13],[1,". This is problematic because"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"This is not how foreign keys are intended to be used"],[13],[1,"\\n"],[10,"li"],[12],[1,"It\'d be better to see no data and fix the problem by going back up to your data-loading code and add "],[10,"code"],[12],[1,"?include=author"],[13],[1," to your GET request, or"],[13],[1,"\\n"],[10,"li"],[12],[1,"If you do want your interface to lazily load the author, use resource "],[10,"code"],[12],[1,"links"],[13],[1," instead of the resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"links"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/api/users/1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Resource links can be defined on Mirage serializers using the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel"],[14,0,"docs-md__a"],[12],[1,"links"],[13],[1," method (though "],[10,"code"],[12],[1,"including"],[13],[1," is likely the far more simpler and common approach to fetching related data)."],[13],[1,"\\n"],[10,2],[12],[1,"So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document)."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior is configurable via the "],[10,"code"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," key on your JSONAPISerializers. It is set to "],[10,"code"],[12],[1,"false"],[13],[1," by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to "],[10,"code"],[12],[1,"true"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you do this, I would recommend looking closely at how your real server behaves when serializing resources\' relationships and whether it uses resource "],[10,"code"],[12],[1,"links"],[13],[1," or resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,", and to update your Mirage code accordingly to give you the most faithful representation of your server."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-2-x-0-3-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-2-x-0-3-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.2.x → 0.3 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.2, the following model definitions"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"would have generated a \\"schema\\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from "],[10,"code"],[12],[1,"post"],[13],[1," to "],[10,"code"],[12],[1,"author"],[13],[1,". To have a two-way sync\'d relationship, known as an inverse, you\'d need to define both sides of the relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", hasMany } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"posts"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasMany"],[13],[1,"()\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Practically speaking, to upgrade you\'ll need to go through your code and update relationships that implicitly had inverses (from 0.2.x\'s hasMany and belongsTo behavior) and update them to define both sides."],[13],[1,"\\n"],[10,2],[12],[1,"This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you\'d also need the author to have a "],[10,"code"],[12],[1,"postIds: []"],[13],[1," array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.)"],[13],[1,"\\n"],[10,2],[12],[1,"Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it\'s probably because of something I haven\'t thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help!"],[13],[1,"\\n"],[10,2],[12],[1,"For more information on the motivation behind change, please read the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/blog/2017/01/09/0-3-0-beta-series/"],[14,0,"docs-md__a"],[12],[1,"0-3 beta series release blog post"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-1-x-0-2-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-1-x-0-2-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.1.x → 0.2 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading your Mirage server from v0.1.x to v0.2.x, here\'s what you need to know:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The default Mirage directory has changed."],[13],[1," The default Mirage directory has moved from "],[10,"code"],[12],[1,"/app/mirage"],[13],[1," to "],[10,"code"],[12],[1,"/mirage"],[13],[1,". When you install 0.2.0, the default blueprint will add the "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to your project. You can delete it and move your current Mirage files to the new location with something like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"rm -rf mirage\\nmv app/mirage mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"from the root of your project. Mirage\'s directory is also "],[10,3],[14,6,"../configuration/#directory"],[14,0,"docs-md__a"],[12],[1,"customizable"],[13],[1," (Although you should move it from the "],[10,"code"],[12],[1,"/app"],[13],[1," directory or else it will not be removed from the build in production mode)."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All multiword filenames are dasherized."],[13],[1," In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. "],[10,"code"],[12],[1,"blog_posts: []"],[13],[1,"), just name your file "],[10,"code"],[12],[1,"fixtures/blog_posts.js"],[13],[1,". This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P."],[13],[1,"\\n"],[10,2],[12],[1,"In Mirage 0.2.x, we follow Ember CLI\'s conventions of dasherized filenames. So, you\'ll just need to go through and change"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog_post.js\\n/mirage/fixtures/blog_post.js\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"etc.\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog-post.js\\n/mirage/fixtures/blog-post.js\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You will then use the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"new Serializer layer"],[13],[1," to do things like format keys in your json payloads."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All JavaScript properties are camelCased."],[13],[1," Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be "],[10,"code"],[12],[1,"db.blog_posts"],[13],[1,", and your factory keys might be "],[10,"code"],[12],[1,"first_name() {..}"],[13],[1,". Looks pretty cool right?"],[13],[1,"\\n"],[10,2],[12],[1,"Wrong. We\'re JavaScript developers here, people. It\'s time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.)"],[13],[1,"\\n"],[10,2],[12],[1,"You\'ll need to update your route handlers, which may look like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blog_posts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"author_id"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blogPosts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"authorId"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Note that everything is camelCased, including foreign keys."],[13],[1,"\\n"],[10,2],[12],[1,"Similarly, factories that look like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"first_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"last_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"should be changed to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"lastName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This goes for all attrs that "],[10,"code"],[12],[1,"server.create"],[13],[1," takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Mirage now has its own Model layer (an ORM)."],[13],[1," In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we\'ve introduced Mirage Models, which serve as the new canonical source of truth about your database."],[13],[1,"\\n"],[10,2],[12],[1,"To create a model, use"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember g mirage-model blog-post\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This will create a file like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Having that file sets up the "],[10,"code"],[12],[1,"db.blogPosts"],[13],[1," collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. "],[3," not yet! in 0.6.0 For instance, given the model above, `server.create(\'blog-post\')` would create a blank `blog-post` model. You could then make a factory for models that need more customization. "],[1," Models, factories and fixtures all work together, but now you won\'t be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth."],[13],[1,"\\n"],[10,2],[12],[1,"We needed to add models for "],[10,3],[14,6,"../models/#associations"],[14,0,"docs-md__a"],[12],[1,"association support"],[13],[1," (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the "],[10,3],[14,6,"../models"],[14,0,"docs-md__a"],[12],[1,"models guide"],[13],[1," and "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," to see how having models can simplify your Mirage server."],[13],[1,"\\n"],[10,2],[12],[1,"We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition."],[13],[1,"\\n"],[10,2],[12],[1,"Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The ORM object "],[10,"code"],[12],[1,"schema"],[13],[1," is now injected into route handlers."],[13],[1," In Mirage 0.1.x, the "],[10,"code"],[12],[1,"db"],[13],[1," was the first parameter injected into route handlers:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"db, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now, the "],[10,"code"],[12],[1,"schema"],[13],[1," object is, so you can take advantage of the Model layer. Fortunately, the "],[10,"code"],[12],[1,"db"],[13],[1," hangs directly off of the "],[10,"code"],[12],[1,"schema"],[13],[1,", so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"{ db }, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and then start opting-in to the ORM (and using "],[10,"code"],[12],[1,"schema"],[13],[1,") one route handler at a time."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Specify a Serializer."],[13],[1," If you\'re using shorthands, you\'ll need to pick a serializer in "],[10,"code"],[12],[1,"/mirage/serializers/application.js"],[13],[1,". See the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," for details."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"You can always view the "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/master/CHANGELOG.md"],[14,0,"docs-md__a"],[12],[1,"full changelog"],[13],[1," to see everything that\'s changed. If you think this guide missed a critical part of the upgrade path, please "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/new"],[14,0,"docs-md__a"],[12],[1,"open an issue"],[13],[1,"!"],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/getting-started/upgrade-guide/index.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"rAUJOQC/",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"upgrade-guide"],[14,0,"docs-md__h1"],[12],[1,"Upgrade guide"],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading from an existing version of Mirage, you can run the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"Using npm\\nnpm install -D ember-cli-mirage@X.X.X\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"Using yarn\\nyarn add -D ember-cli-mirage@X.X.X\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"full-changelog"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#full-changelog"],[14,0,"heading-anchor"],[12],[1,"Full Changelog"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You can view all of Mirage\'s release notes on "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/releases"],[14,0,"docs-md__a"],[12],[1,"our Releases page"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"3-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#3-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"3.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Ensure that all the imports are updated for the objects that were moved to MirageJS. \\nThis is generally the imports in the files in the mirage directory."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// from"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"//to"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Previous the file "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," was a exported default function that defined only your routes.\\nSince MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS."],[13],[1,"\\n"],[10,2],[12],[1,"Change the routes function to no longer be exported as the default function and give it a name, we\\nsuggest "],[10,"code"],[12],[1,"routes"],[13],[1,". Add the below boilerplate code to the top of the "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1,". The end\\nresult would look like this."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," {\\n discoverEmberDataModels,\\n} "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," ("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// This would be your old default export function renamed"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The environment variable discoverEmberDataModels is now longer used. If you wish to \\nnot have "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," auto discover the models, just remove the "],[10,"code"],[12],[1,"...discoverEmberDataModels(),"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"2-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#2-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"2.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-update-import-paths-for-miragejs-imports"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-update-import-paths-for-miragejs-imports"],[14,0,"heading-anchor"],[12],[1,"1. Update import paths for miragejs imports"],[13],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"1-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#1-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"1.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-remove-faker-js"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-remove-faker-js"],[14,0,"heading-anchor"],[12],[1,"1. Remove Faker.js"],[13],[13],[1,"\\n "],[10,2],[12],[1,"When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call "],[10,"code"],[12],[1,"app.import"],[13],[1," in order to use the library in your application code."],[13],[1,"\\n"],[10,2],[12],[1,"Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for "],[10,3],[14,6,"https://github.com/Marak/faker.js"],[14,0,"docs-md__a"],[12],[1,"Faker.js"],[13],[1,", a useful library to have alongside your Mirage factory definitions."],[13],[1,"\\n"],[10,2],[12],[1,"There\'s a few problems with this, most notably that users "],[10,"em"],[12],[1,"had"],[13],[1," to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version."],[13],[1,"\\n"],[10,2],[12],[1,"Now, thanks to "],[10,3],[14,6,"https://github.com/ef4/ember-auto-import"],[14,0,"docs-md__a"],[12],[1,"Ember Auto Import"],[13],[1,", this is no longer the case. Using dependencies directly from npm is painless – just "],[10,"code"],[12],[1,"yarn/npm install"],[13],[1," them and "],[10,"code"],[12],[1,"import"],[13],[1," them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you."],[13],[1,"\\n"],[10,2],[12],[1,"This also means that users can easily manage their project\'s version of Faker (and other similar dependencies) independently of the version of Mirage they\'re using."],[13],[1,"\\n"],[10,2],[12],[1,"For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change."],[13],[1,"\\n"],[10,2],[12],[1,"Here are the steps you\'ll need to take to fix this:"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Ember Auto Import (if it\'s not already installed)"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"ember install ember-auto-import\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Faker.js directly from npm:"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"yarn add -D faker\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"or npm install --save-dev faker\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Change all imports of "],[10,"code"],[12],[1,"faker"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-packge"],[13],[1," to import directly from "],[10,"code"],[12],[1,"faker"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[10,1],[14,0,"hljs-deletion"],[12],[1,"- import { Factory, faker } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import { Factory } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import faker from \'faker\';"],[13],[1,"\\n"],[13],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage-faker-codemod"],[14,0,"docs-md__a"],[12],[1,"There is a codemod"],[13],[1," that will do this for you, thanks to the gracious work of "],[10,3],[14,6,"https://github.com/caseywatts"],[14,0,"docs-md__a"],[12],[1,"Casey Watts"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \\"useful\\" additions. I thought this was a good idea at the time... it wasn\'t. 🙈"],[13],[1,"\\n"],[10,2],[12],[1,"You can look at "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/v0.4.15/addon/faker.js"],[14,0,"docs-md__a"],[12],[1,"the module from v0.4.15"],[13],[1," to see that we added the "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1," and "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1," methods, so if you use these methods too, you\'ll need to refactor them."],[13],[1,"\\n"],[10,2],[12],[1,"Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS:"],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.arrayElement"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.random([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.arrayElement([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1,", use the remainder (modulo) operator:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries(i) {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.cycle([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ let countries = [ \'United States of America\', \'Canada\', \'Mexico\' ];"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return countries[i % countries.length];"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.number"],[13],[1," with min and max options:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," age() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.random.number.range(18, 65);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.number({ min: 18, max: 65 });"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like "],[10,3],[14,6,"https://chancejs.com/"],[14,0,"docs-md__a"],[12],[1,"Chance.js"],[13],[1,", and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"2-new-import-for-setupmirage"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#2-new-import-for-setupmirage"],[14,0,"heading-anchor"],[12],[1,"2. New import for setupMirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Before"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," setupMirage "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support/setup-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// After"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support\\""],[13],[1,";\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"heading-anchor"],[12],[1,"3. Remove deprecated forms of "],[10,"code"],[12],[1,"create"],[13],[1,", "],[10,"code"],[12],[1,"createList"],[13],[1," and "],[10,"code"],[12],[1,"normalizedRequestAttrs"],[13],[13],[13],[1,"\\n "],[10,2],[12],[1,"There are several places in Mirage\'s APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we\'re moving to 1.0, we\'re removing this deprecated/unintentional behavior."],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"server.create"],[13],[1," and "],[10,"code"],[12],[1,"server.createList"],[13],[1," were coded to take a singularized model name, e.g. "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,". It just so happens that "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," also works. That pluralized version is now removed from Mirage."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," to "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Note this also applies to "],[10,"code"],[12],[1,"server.createList"],[13],[1," – the correct form is "],[10,"code"],[12],[1,"server.createList(\'user\', 3)"],[13],[1,", and the pluralized form "],[10,"code"],[12],[1,"server.createList(\'users\', 3)"],[13],[1," is now unsupported."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"this.normalizedRequestAttrs"],[13],[1," in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path."],[13],[1,"\\n"],[10,2],[12],[1,"In this case, you can call "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1," to tell Mirage to expect the payload to be for a "],[10,"code"],[12],[1,"blog-post"],[13],[1," model."],[13],[1,"\\n"],[10,2],[12],[1,"This API was intended to be used with dasherized names, because that\'s how compound model names are specified throughout Mirage when they are represented as strings."],[13],[1,"\\n"],[10,2],[12],[1,"It just so happened that "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blogPost\')"],[13],[1," also worked, by chance, until a refactor. So, that behavior was kept but now is being removed."],[13],[1,"\\n"],[10,2],[12],[1,"The correct usage is "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1,". Using the camelized version of the model name is no longer supported."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that\'s the case!"],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"heading-anchor"],[12],[1,"4. The "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," serializer property now defaults to true"],[13],[13],[1,"\\n "],[10,2],[12],[1,"This applies to the ActiveModelSerializer and RestSerializer."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"normalize"],[13],[1," property on serializers helps Mirage\'s shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly."],[13],[1,"\\n"],[10,2],[12],[1,"There was a gap in the default "],[10,"code"],[12],[1,"normalize"],[13],[1," method for a long time, in that it didn\'t take REST payloads that included foreign keys and looked like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," payload = {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"contact"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Link\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n};\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and turn that "],[10,"code"],[12],[1,"address"],[13],[1," key into a proper JSON:API relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'contacts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Link\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'address\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"We added this feature a while ago, and it\'s controlled with the "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn\'t be a breaking change.)"],[13],[1,"\\n"],[10,2],[12],[1,"We\'re now making "],[10,"code"],[12],[1,"true"],[13],[1," the default, which should be the behavior everyone desires (assuming they\'re using shorthands). This is technically a breaking change, though it\'s unlikely to affect most people."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-3-x-0-4-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-3-x-0-4-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.3.x → 0.4 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There is one primary change in 0.4 that could break your 0.3 app."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.3.x, Mirage\'s JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being "],[10,"code"],[12],[1,"included"],[13],[1," in the payload."],[13],[1,"\\n"],[10,2],[12],[1,"This actually goes against JSON:API\'s design. Foreign keys in the payload are known as "],[10,3],[14,6,"http://jsonapi.org/format/#document-resource-object-linkage"],[14,0,"docs-md__a"],[12],[1,"Resource Linkage"],[13],[1," and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document."],[13],[1,"\\n"],[10,2],[12],[1,"By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a "],[10,"code"],[12],[1,"post"],[13],[1," came back like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'users\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and you forgot to "],[10,"code"],[12],[1,"?include=author"],[13],[1," in your GET request, Ember Data would potentially use the "],[10,"code"],[12],[1,"user:1"],[13],[1," foreign key and lazily fetch the "],[10,"code"],[12],[1,"author"],[13],[1," by making a request to "],[10,"code"],[12],[1,"GET /authors/1"],[13],[1,". This is problematic because"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"This is not how foreign keys are intended to be used"],[13],[1,"\\n"],[10,"li"],[12],[1,"It\'d be better to see no data and fix the problem by going back up to your data-loading code and add "],[10,"code"],[12],[1,"?include=author"],[13],[1," to your GET request, or"],[13],[1,"\\n"],[10,"li"],[12],[1,"If you do want your interface to lazily load the author, use resource "],[10,"code"],[12],[1,"links"],[13],[1," instead of the resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"links"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/api/users/1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Resource links can be defined on Mirage serializers using the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel"],[14,0,"docs-md__a"],[12],[1,"links"],[13],[1," method (though "],[10,"code"],[12],[1,"including"],[13],[1," is likely the far more simpler and common approach to fetching related data)."],[13],[1,"\\n"],[10,2],[12],[1,"So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document)."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior is configurable via the "],[10,"code"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," key on your JSONAPISerializers. It is set to "],[10,"code"],[12],[1,"false"],[13],[1," by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to "],[10,"code"],[12],[1,"true"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you do this, I would recommend looking closely at how your real server behaves when serializing resources\' relationships and whether it uses resource "],[10,"code"],[12],[1,"links"],[13],[1," or resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,", and to update your Mirage code accordingly to give you the most faithful representation of your server."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-2-x-0-3-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-2-x-0-3-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.2.x → 0.3 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.2, the following model definitions"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"would have generated a \\"schema\\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from "],[10,"code"],[12],[1,"post"],[13],[1," to "],[10,"code"],[12],[1,"author"],[13],[1,". To have a two-way sync\'d relationship, known as an inverse, you\'d need to define both sides of the relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", hasMany } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"posts"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasMany"],[13],[1,"()\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Practically speaking, to upgrade you\'ll need to go through your code and update relationships that implicitly had inverses (from 0.2.x\'s hasMany and belongsTo behavior) and update them to define both sides."],[13],[1,"\\n"],[10,2],[12],[1,"This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you\'d also need the author to have a "],[10,"code"],[12],[1,"postIds: []"],[13],[1," array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.)"],[13],[1,"\\n"],[10,2],[12],[1,"Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it\'s probably because of something I haven\'t thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help!"],[13],[1,"\\n"],[10,2],[12],[1,"For more information on the motivation behind change, please read the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/blog/2017/01/09/0-3-0-beta-series/"],[14,0,"docs-md__a"],[12],[1,"0-3 beta series release blog post"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-1-x-0-2-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-1-x-0-2-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.1.x → 0.2 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading your Mirage server from v0.1.x to v0.2.x, here\'s what you need to know:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The default Mirage directory has changed."],[13],[1," The default Mirage directory has moved from "],[10,"code"],[12],[1,"/app/mirage"],[13],[1," to "],[10,"code"],[12],[1,"/mirage"],[13],[1,". When you install 0.2.0, the default blueprint will add the "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to your project. You can delete it and move your current Mirage files to the new location with something like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"rm -rf mirage\\nmv app/mirage mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"from the root of your project. Mirage\'s directory is also "],[10,3],[14,6,"../configuration/#directory"],[14,0,"docs-md__a"],[12],[1,"customizable"],[13],[1," (Although you should move it from the "],[10,"code"],[12],[1,"/app"],[13],[1," directory or else it will not be removed from the build in production mode)."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All multiword filenames are dasherized."],[13],[1," In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. "],[10,"code"],[12],[1,"blog_posts: []"],[13],[1,"), just name your file "],[10,"code"],[12],[1,"fixtures/blog_posts.js"],[13],[1,". This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P."],[13],[1,"\\n"],[10,2],[12],[1,"In Mirage 0.2.x, we follow Ember CLI\'s conventions of dasherized filenames. So, you\'ll just need to go through and change"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog_post.js\\n/mirage/fixtures/blog_post.js\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"etc.\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog-post.js\\n/mirage/fixtures/blog-post.js\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You will then use the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"new Serializer layer"],[13],[1," to do things like format keys in your json payloads."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All JavaScript properties are camelCased."],[13],[1," Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be "],[10,"code"],[12],[1,"db.blog_posts"],[13],[1,", and your factory keys might be "],[10,"code"],[12],[1,"first_name() {..}"],[13],[1,". Looks pretty cool right?"],[13],[1,"\\n"],[10,2],[12],[1,"Wrong. We\'re JavaScript developers here, people. It\'s time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.)"],[13],[1,"\\n"],[10,2],[12],[1,"You\'ll need to update your route handlers, which may look like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blog_posts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"author_id"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blogPosts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"authorId"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Note that everything is camelCased, including foreign keys."],[13],[1,"\\n"],[10,2],[12],[1,"Similarly, factories that look like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"first_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"last_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"should be changed to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"lastName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This goes for all attrs that "],[10,"code"],[12],[1,"server.create"],[13],[1," takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Mirage now has its own Model layer (an ORM)."],[13],[1," In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we\'ve introduced Mirage Models, which serve as the new canonical source of truth about your database."],[13],[1,"\\n"],[10,2],[12],[1,"To create a model, use"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember g mirage-model blog-post\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This will create a file like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Having that file sets up the "],[10,"code"],[12],[1,"db.blogPosts"],[13],[1," collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. "],[3," not yet! in 0.6.0 For instance, given the model above, `server.create(\'blog-post\')` would create a blank `blog-post` model. You could then make a factory for models that need more customization. "],[1," Models, factories and fixtures all work together, but now you won\'t be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth."],[13],[1,"\\n"],[10,2],[12],[1,"We needed to add models for "],[10,3],[14,6,"../models/#associations"],[14,0,"docs-md__a"],[12],[1,"association support"],[13],[1," (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the "],[10,3],[14,6,"../models"],[14,0,"docs-md__a"],[12],[1,"models guide"],[13],[1," and "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," to see how having models can simplify your Mirage server."],[13],[1,"\\n"],[10,2],[12],[1,"We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition."],[13],[1,"\\n"],[10,2],[12],[1,"Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The ORM object "],[10,"code"],[12],[1,"schema"],[13],[1," is now injected into route handlers."],[13],[1," In Mirage 0.1.x, the "],[10,"code"],[12],[1,"db"],[13],[1," was the first parameter injected into route handlers:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"db, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now, the "],[10,"code"],[12],[1,"schema"],[13],[1," object is, so you can take advantage of the Model layer. Fortunately, the "],[10,"code"],[12],[1,"db"],[13],[1," hangs directly off of the "],[10,"code"],[12],[1,"schema"],[13],[1,", so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"{ db }, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and then start opting-in to the ORM (and using "],[10,"code"],[12],[1,"schema"],[13],[1,") one route handler at a time."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Specify a Serializer."],[13],[1," If you\'re using shorthands, you\'ll need to pick a serializer in "],[10,"code"],[12],[1,"/mirage/serializers/application.js"],[13],[1,". See the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," for details."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"You can always view the "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/master/CHANGELOG.md"],[14,0,"docs-md__a"],[12],[1,"full changelog"],[13],[1," to see everything that\'s changed. If you think this guide missed a critical part of the upgrade path, please "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/new"],[14,0,"docs-md__a"],[12],[1,"open an issue"],[13],[1,"!"],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/getting-started/upgrade-guide/index.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/getting-started/upgrade-guide/v2-deprecations",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"WQwpgFeB",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"deprecations-added-in-v2-x-of-ember-cli-mirage"],[14,0,"docs-md__h1"],[12],[1,"Deprecations Added in v2.x of ember-cli-mirage"],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"miragejs-re-exports"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#miragejs-re-exports"],[14,0,"heading-anchor"],[12],[1,"miragejs re-exports"],[13],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"only-exporting-routes-as-the-default-function"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#only-exporting-routes-as-the-default-function"],[14,0,"heading-anchor"],[12],[1,"only exporting routes as the default function"],[13],[13],[1,"\\n "],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/getting-started/upgrade-guide/v2-deprecations.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/getting-started/what-is-mirage",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 @@ -76,7 +76,7 @@ var s=(0,t.createTemplateFactory)({id:"30dhOyaX",block:'[[[10,0],[14,0,"docs-md" e.default=s})),define("ember-cli-mirage-docs/docs/testing/assertions",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"mQbz5yFD",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"assertions"],[14,0,"docs-md__h1"],[12],[1,"Assertions"],[13],[1,"\\n "],[10,2],[12],[1,"Most of your tests will assert against your Ember app\'s UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you\'ll assert that your UI is in the state you expect it to be."],[13],[1,"\\n"],[10,2],[12],[1,"But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server."],[13],[1,"\\n"],[10,2],[12],[1,"To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"asserting-against-mirage-s-database"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#asserting-against-mirage-s-database"],[14,0,"heading-anchor"],[12],[1,"Asserting against Mirage\'s database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage\'s database. If the correct data makes it there, you\'ll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect."],[13],[1,"\\n"],[10,2],[12],[1,"Here\'s an example:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can change the lesson\'s title\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'lesson\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'My First Lesson\'"],[13],[1," })\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.Edit\'"],[13],[1,")\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Updated lesson\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.Save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Assert against our app\'s UI"],[13],[1,"\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'h1\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasText"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Updated lesson\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Also check that the data was \\"persisted\\" to our backend"],[13],[1,"\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"db"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"lessons"],[13],[1,"["],[10,1],[14,0,"hljs-number"],[12],[1,"0"],[13],[1,"]."],[10,1],[14,0,"hljs-property"],[12],[1,"title"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Updated lesson\'"],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This is a great way to gain some extra confidence that your Ember app is sending over the data you expect."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"asserting-against-mirage-models"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#asserting-against-mirage-models"],[14,0,"heading-anchor"],[12],[1,"Asserting against Mirage Models"],[13],[13],[1,"\\n "],[10,2],[12],[1,"It can also be useful to assert against Mirage\'s ORM models, to verify things like updates to your model\'s relationships:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'I can add a tag to a post\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," programming = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'tag\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Programming\'"],[13],[1," });\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," post = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'post\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"`/posts/"],[10,1],[14,0,"hljs-subst"],[12],[1,"${post.id}"],[13],[1,"/edit`"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"select"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.tags\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Programming\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"()."],[10,1],[14,0,"hljs-title function_"],[12],[1,"includesText"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Saved!\'"],[13],[1,");\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"(post."],[10,1],[14,0,"hljs-title function_"],[12],[1,"reload"],[13],[1,"()."],[10,1],[14,0,"hljs-property"],[12],[1,"tagIds"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"includes"],[13],[1,"(programming."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,"));\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"reload"],[13],[1," method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected."],[13],[1,"\\n"],[10,2],[12],[1,"Asserting against models is basically another way to verify Mirage\'s database data is correct."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"asserting-against-handled-requests-and-responses"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#asserting-against-handled-requests-and-responses"],[14,0,"heading-anchor"],[12],[1,"Asserting against handled requests and responses"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You can also assert against the actual HTTP requests and responses that are made during your test."],[13],[1,"\\n"],[10,2],[12],[1,"To do this, first enable "],[10,3],[14,6,"https://github.com/pretenderjs/pretender#tracking-requests"],[14,0,"docs-md__a"],[12],[1,"Pretender\'s "],[10,"code"],[12],[1,"trackedRequests"],[13],[1," feature"],[13],[1," by enabling the "],[10,"code"],[12],[1,"trackRequests"],[13],[1," environment option:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// config/environment.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"exports"],[13],[1," = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"environment"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"if"],[13],[1," (environment === "],[10,1],[14,0,"hljs-string"],[12],[1,"\'test\'"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable constant_"],[12],[1,"ENV"],[13],[1,"["],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,"] = {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"trackRequests"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n };\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This feature is disabled by default to avoid memory issues during long development sessions."],[13],[1,"\\n"],[10,2],[12],[1,"Now Mirage will track every request (along with the associated response) and make them available to you via "],[10,"code"],[12],[1,"server.pretender.handledRequests"],[13],[1,". That way you can assert against requests in that array at the end of your test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can filter the table\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"5"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"genre"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Sci-Fi\'"],[13],[1," });\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"genre"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Drama\'"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"select"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.genre\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Sci-Fi\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Assert against our app\'s UI"],[13],[1,"\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'tr\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"exists"],[13],[1,"({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"count"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"5"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Also assert against the HTTP request count & query"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," requests = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"pretender"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"handledRequests"],[13],[1,";\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"(requests."],[10,1],[14,0,"hljs-property"],[12],[1,"length"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"deepEqual"],[13],[1,"(requests["],[10,1],[14,0,"hljs-number"],[12],[1,"0"],[13],[1,"]."],[10,1],[14,0,"hljs-property"],[12],[1,"queryParams"],[13],[1,", { "],[10,1],[14,0,"hljs-string"],[12],[1,"\'filter[genre]\'"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Sci-Fi\'"],[13],[1," });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"In general we recommend asserting against Mirage\'s database and your UI, as the specifics of your app\'s HTTP requests should be considered implementation details of the behavior you\'re actually interested in verifying. But there\'s certainly valid reasons to drop down and assert against HTTP data."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"And with that, you\'ve completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage\'s various classes."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/testing/assertions.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/testing/integration-and-unit-tests",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"q6ZiwphE",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"integration-and-unit-tests"],[14,0,"docs-md__h1"],[12],[1,"Integration and unit tests"],[13],[1,"\\n "],[10,2],[12],[1,"While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s say you have a data-fetching component, and you want to write a "],[10,3],[14,6,"https://guides.emberjs.com/release/testing/#toc_rendering-tests"],[14,0,"docs-md__a"],[12],[1,"rendering test"],[13],[1," to verify its behavior."],[13],[1,"\\n"],[10,2],[12],[1,"You can import and use the "],[10,"code"],[12],[1,"setupMirage"],[13],[1," function directly in your rendering test, and use Mirage just like you would in an acceptance test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can fetch records\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n

{{model.title}}

\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," file, you can use "],[10,"code"],[12],[1,"this.server"],[13],[1," to setup new routes."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it renders an error state\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"(\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," ({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"errors"],[13],[1,": [ "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Something went wrong\'"],[13],[1," ]}),\\n "],[10,1],[14,0,"hljs-number"],[12],[1,"500"],[13],[1,"\\n );\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n {{#if error}}\\n

Whoops!

\\n {{/if}}\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Whoops!\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"creating-ember-data-models-on-the-client-with-mirage"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#creating-ember-data-models-on-the-client-with-mirage"],[14,0,"heading-anchor"],[12],[1,"Creating Ember Data models on the client with Mirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some."],[13],[1,"\\n"],[10,2],[12],[1,"For example, let\'s say we were writing a rendering test to verify the behavior of our "],[10,"code"],[12],[1,""],[13],[1," component:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// get the article"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"How might we test this?"],[13],[1,"\\n"],[10,2],[12],[1,"It might be tempting to use Mirage\'s "],[10,"code"],[12],[1,"server.create"],[13],[1,", since you probably already have factories defined:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"But you shouldn\'t do this."],[13],[1,"\\n"],[10,2],[12],[1,"Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don\'t actually know anything about your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage models exist solely in your \\"backend\\", and are only useful in helping you create your mock server definition."],[13],[1,"\\n"],[10,2],[12],[1,"The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server."],[13],[1,"\\n"],[10,2],[12],[1,"So, in the same way that you wouldn\'t create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// `article` is a Mirage model. It should never be consumed directly by Ember code."],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n`"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"So, how might we get an article materialized into Ember Data\'s store so we can test this component, while still leveraging our Mirage factory definitions?"],[13],[1,"\\n"],[10,2],[12],[1,"Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"using-findrecord-and-findall"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#using-findrecord-and-findall"],[14,0,"heading-anchor"],[12],[1,"Using findRecord and findAll"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The first approach is to lookup Ember Data\'s store, and use it to find the record (just like your Ember application\'s routes do):"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 1: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"findRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"writing-a-helper-to-push-mirage-s-database"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#writing-a-helper-to-push-mirage-s-database"],[14,0,"heading-anchor"],[12],[1,"Writing a helper to push Mirage\'s database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The second approach is to make a helper that serializers Mirage\'s database into JSON and pushes that JSON into your Ember Data store."],[13],[1,"\\n"],[10,2],[12],[1,"The actual logic might depend on the configuration of your Mirage server, but if you\'re following all of Mirage\'s conventions it should look roughly like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// your-app/tests/helpers/push-mirage-into-store.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { getContext } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { run } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/runloop\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," context = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getContext"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = context."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Object"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"keys"],[13],[1,"(context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,")\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"key"],[13],[1," =>"],[13],[1," context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[key]."],[10,1],[14,0,"hljs-property"],[12],[1,"all"],[13],[1," !== "],[10,1],[14,0,"hljs-literal"],[12],[1,"undefined"],[13],[1,") "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Get the resources"],[13],[1,"\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"forEach"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"resource"],[13],[1," =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," models = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[resource]."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," modelName = models."],[10,1],[14,0,"hljs-property"],[12],[1,"modelName"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serializer = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"serializerOrRegistry"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serializerFor"],[13],[1,"(modelName);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," originalAlwaysIncludeLinkageData = serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,";\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = serializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(models);\\n\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = originalAlwaysIncludeLinkageData;\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"run"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushPayload"],[13],[1,"(json);\\n });\\n });\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now in your test, call your helper to seed Ember Data\'s store, and then use "],[10,"code"],[12],[1,"peekRecord"],[13],[1," to materialize and work with Ember Data records:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," pushMirageIntoStore "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'YOUR-APP/tests/helpers/push-mirage-into-store\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 2: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushMirageIntoStore"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"peekRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Something like "],[10,"code"],[12],[1,"pushMirageIntoStore"],[13],[1," will probably make its way into Mirage at some point."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"Now that you\'ve seen how to use "],[10,"code"],[12],[1,"setupMirage"],[13],[1," outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server!"],[13],[1,"\\n"],[10,2],[12],[1,"Next, we discuss some ways you can go about asserting against your Mirage mock server."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/testing/integration-and-unit-tests.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"OKkgcjIe",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"integration-and-unit-tests"],[14,0,"docs-md__h1"],[12],[1,"Integration and unit tests"],[13],[1,"\\n "],[10,2],[12],[1,"While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s say you have a data-fetching component, and you want to write a "],[10,3],[14,6,"https://guides.emberjs.com/release/testing/#toc_rendering-tests"],[14,0,"docs-md__a"],[12],[1,"rendering test"],[13],[1," to verify its behavior."],[13],[1,"\\n"],[10,2],[12],[1,"You can import and use the "],[10,"code"],[12],[1,"setupMirage"],[13],[1," function directly in your rendering test, and use Mirage just like you would in an acceptance test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can fetch records\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n

{{model.title}}

\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," file, you can use "],[10,"code"],[12],[1,"this.server"],[13],[1," to setup new routes."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it renders an error state\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"(\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," ({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"errors"],[13],[1,": [ "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Something went wrong\'"],[13],[1," ]}),\\n "],[10,1],[14,0,"hljs-number"],[12],[1,"500"],[13],[1,"\\n );\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n {{#if error}}\\n

Whoops!

\\n {{/if}}\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Whoops!\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"creating-ember-data-models-on-the-client-with-mirage"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#creating-ember-data-models-on-the-client-with-mirage"],[14,0,"heading-anchor"],[12],[1,"Creating Ember Data models on the client with Mirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some."],[13],[1,"\\n"],[10,2],[12],[1,"For example, let\'s say we were writing a rendering test to verify the behavior of our "],[10,"code"],[12],[1,""],[13],[1," component:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// get the article"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"How might we test this?"],[13],[1,"\\n"],[10,2],[12],[1,"It might be tempting to use Mirage\'s "],[10,"code"],[12],[1,"server.create"],[13],[1,", since you probably already have factories defined:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"But you shouldn\'t do this."],[13],[1,"\\n"],[10,2],[12],[1,"Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don\'t actually know anything about your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage models exist solely in your \\"backend\\", and are only useful in helping you create your mock server definition."],[13],[1,"\\n"],[10,2],[12],[1,"The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server."],[13],[1,"\\n"],[10,2],[12],[1,"So, in the same way that you wouldn\'t create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// `article` is a Mirage model. It should never be consumed directly by Ember code."],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,");\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n`"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"So, how might we get an article materialized into Ember Data\'s store so we can test this component, while still leveraging our Mirage factory definitions?"],[13],[1,"\\n"],[10,2],[12],[1,"Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"using-findrecord-and-findall"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#using-findrecord-and-findall"],[14,0,"heading-anchor"],[12],[1,"Using findRecord and findAll"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The first approach is to lookup Ember Data\'s store, and use it to find the record (just like your Ember application\'s routes do):"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 1: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"findRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"writing-a-helper-to-push-mirage-s-database"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#writing-a-helper-to-push-mirage-s-database"],[14,0,"heading-anchor"],[12],[1,"Writing a helper to push Mirage\'s database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The second approach is to make a helper that serializers Mirage\'s database into JSON and pushes that JSON into your Ember Data store."],[13],[1,"\\n"],[10,2],[12],[1,"The actual logic might depend on the configuration of your Mirage server, but if you\'re following all of Mirage\'s conventions it should look roughly like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// your-app/tests/helpers/push-mirage-into-store.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { getContext } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { run } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/runloop\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," context = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getContext"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = context."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Object"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"keys"],[13],[1,"(context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,")\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"key"],[13],[1," =>"],[13],[1," context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[key]."],[10,1],[14,0,"hljs-property"],[12],[1,"all"],[13],[1," !== "],[10,1],[14,0,"hljs-literal"],[12],[1,"undefined"],[13],[1,") "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Get the resources"],[13],[1,"\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"forEach"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"resource"],[13],[1," =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," models = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[resource]."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," modelName = models."],[10,1],[14,0,"hljs-property"],[12],[1,"modelName"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serializer = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"serializerOrRegistry"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serializerFor"],[13],[1,"(modelName);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," originalAlwaysIncludeLinkageData = serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,";\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = serializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(models);\\n\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = originalAlwaysIncludeLinkageData;\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"run"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushPayload"],[13],[1,"(json);\\n });\\n });\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now in your test, call your helper to seed Ember Data\'s store, and then use "],[10,"code"],[12],[1,"peekRecord"],[13],[1," to materialize and work with Ember Data records:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," pushMirageIntoStore "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'YOUR-APP/tests/helpers/push-mirage-into-store\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 2: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushMirageIntoStore"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"peekRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Something like "],[10,"code"],[12],[1,"pushMirageIntoStore"],[13],[1," will probably make its way into Mirage at some point."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"Now that you\'ve seen how to use "],[10,"code"],[12],[1,"setupMirage"],[13],[1," outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server!"],[13],[1,"\\n"],[10,2],[12],[1,"Next, we discuss some ways you can go about asserting against your Mirage mock server."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/testing/integration-and-unit-tests.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/docs/testing/setup-mirage",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"tl92orhg",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"setupmirage-test-helper"],[14,0,"docs-md__h1"],[12],[1,"setupMirage test helper"],[13],[1,"\\n "],[10,2],[12],[1,"In your tests (acceptance, integration and unit) you can import the "],[10,"code"],[12],[1,"setupMirage"],[13],[1," test helper to start the Mirage server. Passing the hooks from the test module allows the mirage server to be created and shutdown before and after each test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'my first test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// test code"],[13],[1,"\\n });\\n });\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The second parameter (optional) allows defining the mirage server to be used for this set of tests."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," makeServer "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'app-name/mirage/config\'"],[13],[1,"; "],[10,1],[14,0,"hljs-comment"],[12],[1,"// replace app-name with your app name"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks, { makeServer });\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'my first test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// test code"],[13],[1,"\\n });\\n });\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If it is not desirable to use the default config from the mirage directory you could import any other file that implements the same function, or even define the function locally or inline"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"const"],[13],[1," makeServer = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"namespace"],[13],[1," = "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"api\\""],[13],[1,"\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"timing"],[13],[1," = "],[10,1],[14,0,"hljs-number"],[12],[1,"2000"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/movies\\""],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," ["],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Interstellar\\""],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Inception\\""],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Dunkirk\\""],[13],[1,"]\\n })\\n }\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n }\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks, { makeServer });\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'my first test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// test code"],[13],[1,"\\n });\\n });\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/docs/testing/setup-mirage.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/helpers/and",["exports","ember-truth-helpers/helpers/and"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"and",{enumerable:!0,get:function(){return t.and}}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ember-cli-mirage-docs/helpers/append",["exports","ember-composable-helpers/helpers/append"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"append",{enumerable:!0,get:function(){return t.append}}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ember-cli-mirage-docs/helpers/break-on",["exports","ember-cli-addon-docs/helpers/break-on"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ember-cli-mirage-docs/helpers/call",["exports","ember-composable-helpers/helpers/call"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"call",{enumerable:!0,get:function(){return t.call}}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})),define("ember-cli-mirage-docs/helpers/camelize",["exports","ember-cli-string-helpers/helpers/camelize"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"camelize",{enumerable:!0,get:function(){return t.camelize}}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})})) @@ -214,7 +214,7 @@ var s=(0,t.createTemplateFactory)({id:"PEM+C9Q3",block:'[[[10,0],[14,0,"docs-md" e.default=s})),define("ember-cli-mirage-docs/templates/docs/advanced/mocking-guids",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"Cckbii6b",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"mocking-guids"],[14,0,"docs-md__h1"],[12],[1,"Mocking GUIDs"],[13],[1,"\\n "],[10,2],[12],[1,"Some applications use GUIDs (or UUIDs) instead of auto-incrementing integers as identifiers for their models."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage supports the ability to overwrite how its database assigns IDs to new records via the "],[10,"code"],[12],[1,"IdentityManager"],[13],[1," class. You can generate model-specific managers or an application-wide manager to customize how your database behaves."],[13],[1,"\\n"],[10,2],[12],[1,"To generate a new identity manager, use the blueprint:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember generate mirage-identity-manager \\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"A custom identity manager must implement these methods:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,"code"],[12],[1,"fetch"],[13],[1,", which must return an identifier not used yet."],[13],[1,"\\n"],[10,"li"],[12],[10,"code"],[12],[1,"set"],[13],[1,", which is called with an "],[10,"code"],[12],[1,"id"],[13],[1," of a record being insert in mirage\'s database."],[13],[1,"\\n"],[10,"li"],[12],[10,"code"],[12],[1,"reset"],[13],[1,", which should reset database to initial state."],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"Here\'s an example implementation for an identity manager that mocks GUIDs:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { v4 "],[10,1],[14,0,"hljs-keyword"],[12],[1,"as"],[13],[1," getUuid } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-uuid\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"class"],[13],[1," {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"constructor"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1," = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Set"],[13],[1,"();\\n }\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Returns a new unused unique identifier."],[13],[1,"\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fetch"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," uuid = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getUuid"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"while"],[13],[1," ("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"has"],[13],[1,"(uuid)) {\\n uuid = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getUuid"],[13],[1,"();\\n }\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"add"],[13],[1,"(uuid);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," uuid;\\n }\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Registers an identifier as used. Must throw if identifier is already used."],[13],[1,"\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"id"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"if"],[13],[1," ("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"has"],[13],[1,"(id)) {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"throw"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Error"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"`ID "],[10,1],[14,0,"hljs-subst"],[12],[1,"${id}"],[13],[1," has already been used.`"],[13],[1,");\\n }\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"add"],[13],[1,"(id);\\n }\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Resets all used identifiers to unused."],[13],[1,"\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"reset"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"ids"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"clear"],[13],[1,"();\\n }\\n}\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/advanced/mocking-guids.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/advanced/server-configuration",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"PMfWz1BQ",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"server-configuration"],[14,0,"docs-md__h1"],[12],[1,"Server configuration"],[13],[1,"\\n "],[10,2],[12],[1,"The MirageJS server is configured for you by ember-cli-mirage. However, if you\\nneed to customize the server you can by creating a makeServer function in the\\nconfig.js."],[13],[1,"\\n"],[10,2],[12],[1,"Typically, the "],[10,"code"],[12],[1,"/mirage/config.js"],[13],[1," file contains a single default export which\\nis a function defining all your Mirage route handlers. Ember CLI Mirage then\\nuses this function, along with all the other modules you\'ve defined in\\n"],[10,"code"],[12],[1,"mirage/models"],[13],[1,", "],[10,"code"],[12],[1,"mirage/fixtures"],[13],[1,", "],[10,"code"],[12],[1,"mirage/factories"],[13],[1,", and\\n"],[10,"code"],[12],[1,"mirage/serializers"],[13],[1,", to create your Mirage JS server when your app boots up\\nin development and testing."],[13],[1,"\\n"],[10,2],[12],[1,"You can now opt in to having more control over exactly how your Mirage server\\nis instantiated using the same code as the mirageJS examples of creating a server \\nby changing your current default export that represents the routes to a normal function,\\nthen creating a new default export function that creates the mirageJS server."],[13],[1,"\\n"],[10,2],[12],[1,"This new default export function receives a single argument named "],[10,"code"],[12],[1,"config"],[13],[1,", \\nwhich contains all the factory/fixture/serializer/model modules that exist \\nin your project\'s "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory. This saves you from having to import \\neach module explicitly and then pass it into your Mirage server, just like \\nyou\'re used to with the default setup."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"config"],[13],[1," argument maps exactly to everything inside of your "],[10,"code"],[12],[1,"/mirage"],[13],[1,"\\ndirectory - notably, it does not contain the autogenerated Mirage model\\ndefinitions derived from your Ember Data models, which is an important feature\\nof Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper\\nhas been provided named "],[10,"code"],[12],[1,"discoverEmberDataModels"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," \\npackage that you can use to augment your config with these models so that your Mirage schema is\\nautomatically inferred from your host application\'s Ember Data models and\\nrelationships. The snippet below shows how to do this. Note that the order\\nhere matters if you also have models defined in your "],[10,"code"],[12],[1,"/mirage/models"],[13],[1,"\\ndirectory, as those model definitions would \\"win\\" in the event of a conflict\\nwith the ones autodiscovered from Ember Data. (However, most of time if you\\nare inferring your Mirage schema from Ember Data, you shouldn\'t need to define\\nadditional models.)"],[13],[1,"\\n"],[10,2],[12],[1,"Finally, your route handlers just need to be passed to the "],[10,"code"],[12],[1,"routes()"],[13],[1," key in\\nyour Mirage config. You can do this inline, or you can make them a separate\\nfunction, and organize that function however you choose."],[13],[1,"\\n"],[10,2],[12],[1,"You should also add "],[10,"code"],[12],[1,"miragejs"],[13],[1," to your project\'s dependencies in\\nyour "],[10,"code"],[12],[1,"package.json"],[13],[1," file, since you are now importing directly from it. Note\\nthat this gives you the added benefit of being able to upgrade "],[10,"code"],[12],[1,"miragejs"],[13],[1,"\\nindependently of "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1,". "],[13],[1,"\\n"],[10,2],[12],[1,"All the objects from "],[10,"code"],[12],[1,"miragejs"],[13],[1," are re-exported in "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," such as \\n"],[10,"code"],[12],[1,"Model"],[13],[1,", "],[10,"code"],[12],[1,"belongsTo"],[13],[1,", "],[10,"code"],[12],[1,"hasMany"],[13],[1," as well as "],[10,"code"],[12],[1,"Fixtures"],[13],[1,", "],[10,"code"],[12],[1,"Traits"],[13],[1," for example. \\nThese should in the future also be imported directly from "],[10,"code"],[12],[1,"miragejs"],[13],[1," as \\neventually these re-exports will be removed. This will help align the \\n"],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," users with the rest of the Mirage JS community."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with inline routes"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n },\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with routes in an external function"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#serializers"],[14,0,"heading-anchor"],[12],[1,"Serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your \\nserver configuration to have mirage perform this for you."],[13],[1,"\\n"],[10,2],[12],[1,"When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage\\nversion of the model. With serializers, you may have created a mirage serializer to override some methods, but would still \\nlike Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than\\nthe way you merge the models."],[13],[1,"\\n"],[10,2],[12],[10,"code"],[12],[1,"applyEmberDataSerializers"],[13],[1," will apply the "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"attrs"],[13],[1," from your ember data serializers to your mirage serializers.\\nIf you have not created a mirage serializer it will create one and extend it from your mirage application serializer.\\nEnsure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand \\nhow to use "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"transforms"],[13],[1,". If you have not created a mirage serializer named application, the created serializer \\nwill extend EmberDataSerializer directly."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example of having Mirage adjust/create your serializers similiar to ember data models"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels, applyEmberDataSerializers } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"makeServer"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"serializers"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"applyEmberDataSerializers"],[13],[1,"(config."],[10,1],[14,0,"hljs-property"],[12],[1,"serializers"],[13],[1,"),\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/advanced/server-configuration.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"b0QCb2sV",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"server-configuration"],[14,0,"docs-md__h1"],[12],[1,"Server configuration"],[13],[1,"\\n "],[10,2],[12],[1,"The MirageJS server is configured for you by ember-cli-mirage. However, if you\\nneed to customize the server you can by creating a makeServer function in the\\nconfig.js."],[13],[1,"\\n"],[10,2],[12],[1,"Typically, the "],[10,"code"],[12],[1,"/mirage/config.js"],[13],[1," file contains a single default export which\\nis a function defining all your Mirage route handlers. Ember CLI Mirage then\\nuses this function, along with all the other modules you\'ve defined in\\n"],[10,"code"],[12],[1,"mirage/models"],[13],[1,", "],[10,"code"],[12],[1,"mirage/fixtures"],[13],[1,", "],[10,"code"],[12],[1,"mirage/factories"],[13],[1,", and\\n"],[10,"code"],[12],[1,"mirage/serializers"],[13],[1,", to create your Mirage JS server when your app boots up\\nin development and testing."],[13],[1,"\\n"],[10,2],[12],[1,"You can now opt in to having more control over exactly how your Mirage server\\nis instantiated using the same code as the mirageJS examples of creating a server \\nby changing your current default export that represents the routes to a normal function,\\nthen creating a new default export function that creates the mirageJS server."],[13],[1,"\\n"],[10,2],[12],[1,"This new default export function receives a single argument named "],[10,"code"],[12],[1,"config"],[13],[1,", \\nwhich contains all the factory/fixture/serializer/model modules that exist \\nin your project\'s "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory. This saves you from having to import \\neach module explicitly and then pass it into your Mirage server, just like \\nyou\'re used to with the default setup."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"config"],[13],[1," argument maps exactly to everything inside of your "],[10,"code"],[12],[1,"/mirage"],[13],[1,"\\ndirectory - notably, it does not contain the autogenerated Mirage model\\ndefinitions derived from your Ember Data models, which is an important feature\\nof Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper\\nhas been provided named "],[10,"code"],[12],[1,"discoverEmberDataModels"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," \\npackage that you can use to augment your config with these models so that your Mirage schema is\\nautomatically inferred from your host application\'s Ember Data models and\\nrelationships. The snippet below shows how to do this. Note that the order\\nhere matters if you also have models defined in your "],[10,"code"],[12],[1,"/mirage/models"],[13],[1,"\\ndirectory, as those model definitions would \\"win\\" in the event of a conflict\\nwith the ones autodiscovered from Ember Data. (However, most of time if you\\nare inferring your Mirage schema from Ember Data, you shouldn\'t need to define\\nadditional models.)"],[13],[1,"\\n"],[10,2],[12],[1,"Finally, your route handlers just need to be passed to the "],[10,"code"],[12],[1,"routes()"],[13],[1," key in\\nyour Mirage config. You can do this inline, or you can make them a separate\\nfunction, and organize that function however you choose."],[13],[1,"\\n"],[10,2],[12],[1,"You should also add "],[10,"code"],[12],[1,"miragejs"],[13],[1," to your project\'s dependencies in\\nyour "],[10,"code"],[12],[1,"package.json"],[13],[1," file, since you are now importing directly from it. Note\\nthat this gives you the added benefit of being able to upgrade "],[10,"code"],[12],[1,"miragejs"],[13],[1,"\\nindependently of "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1,". "],[13],[1,"\\n"],[10,2],[12],[1,"All the objects from "],[10,"code"],[12],[1,"miragejs"],[13],[1," are re-exported in "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," such as \\n"],[10,"code"],[12],[1,"Model"],[13],[1,", "],[10,"code"],[12],[1,"belongsTo"],[13],[1,", "],[10,"code"],[12],[1,"hasMany"],[13],[1," as well as "],[10,"code"],[12],[1,"Fixtures"],[13],[1,", "],[10,"code"],[12],[1,"Traits"],[13],[1," for example. \\nThese should in the future also be imported directly from "],[10,"code"],[12],[1,"miragejs"],[13],[1," as \\neventually these re-exports will be removed. This will help align the \\n"],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," users with the rest of the Mirage JS community."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with inline routes"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n },\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example with routes in an external function"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#serializers"],[14,0,"heading-anchor"],[12],[1,"Serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your \\nserver configuration to have mirage perform this for you."],[13],[1,"\\n"],[10,2],[12],[1,"When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage\\nversion of the model. With serializers, you may have created a mirage serializer to override some methods, but would still \\nlike Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than\\nthe way you merge the models."],[13],[1,"\\n"],[10,2],[12],[10,"code"],[12],[1,"applyEmberDataSerializers"],[13],[1," will apply the "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"attrs"],[13],[1," from your ember data serializers to your mirage serializers.\\nIf you have not created a mirage serializer it will create one and extend it from your mirage application serializer.\\nEnsure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand \\nhow to use "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"transforms"],[13],[1,". If you have not created a mirage serializer named application, the created serializer \\nwill extend EmberDataSerializer directly."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-javascript"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Example of having Mirage adjust/create your serializers similiar to ember data models"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels, applyEmberDataSerializers } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"serializers"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"applyEmberDataSerializers"],[13],[1,"(config."],[10,1],[14,0,"hljs-property"],[12],[1,"serializers"],[13],[1,"),\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.namespace = \'/api\'"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// this.resource(\'user\')"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/advanced/server-configuration.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/advanced/simulating-cookie-responses",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"svHbBQCl",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"simulating-cookie-responses"],[14,0,"docs-md__h1"],[12],[1,"Simulating cookie responses"],[13],[1,"\\n "],[10,2],[12],[1,"Although Mirage allows setting headers in a response, the\\nXMLHttpRequest spec explicitly\\n"],[10,3],[14,6,"http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method"],[14,0,"docs-md__a"],[12],[1,"forbids access"],[13],[1,"\\nto "],[10,"code"],[12],[1,"Set-Cookie"],[13],[1," and "],[10,"code"],[12],[1,"Set-Cookie2"],[13],[1," headers. As a result Mirage\\nresponses cannot set cookies via headers."],[13],[1,"\\n"],[10,2],[12],[1,"However, you can simulate receiving cookies from an ajax\\ncall at the browser level by setting them in a route\\nfunction handler:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"post"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/users/login\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"schema"],[13],[1," =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// log in for 24 hours"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," now = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Date"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," cookieExpiration = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"new"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Date"],[13],[1,"(now."],[10,1],[14,0,"hljs-title function_"],[12],[1,"getTime"],[13],[1,"() + ("],[10,1],[14,0,"hljs-number"],[12],[1,"24"],[13],[1," * "],[10,1],[14,0,"hljs-number"],[12],[1,"3600"],[13],[1," * "],[10,1],[14,0,"hljs-number"],[12],[1,"1000"],[13],[1,"));\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"document"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"cookie"],[13],[1,"="],[10,1],[14,0,"hljs-string"],[12],[1,"`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires="],[10,1],[14,0,"hljs-subst"],[12],[1,"${cookieExpiration.toUTCString()}"],[13],[1,";`"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"users"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"("],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Your Ember client code will now have access to any cookies set\\nusing "],[10,"code"],[12],[1,"document.cookie"],[13],[1,"."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/advanced/simulating-cookie-responses.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/advanced/switching-between-scenarios",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 @@ -239,11 +239,11 @@ var s=(0,t.createTemplateFactory)({id:"z6HYxt3d",block:'[[[10,0],[14,0,"docs-md" e.default=s})),define("ember-cli-mirage-docs/templates/docs/data-layer/serializers/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"PNplaQrR",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"serializers"],[14,0,"docs-md__h1"],[12],[1,"Serializers"],[13],[1,"\\n "],[10,2],[12],[1,"A serializer is an object responsible for transforming a Model or Collection that\'s returned from your route handlers"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies/:id\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"(request."],[10,1],[14,0,"hljs-property"],[12],[1,"params"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"into a formatted JSON payload"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,";,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"suitable for consumption by your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"Serializers are the last main part of Mirage\'s architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s see how they work."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"choosing-which-serializer-to-use"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#choosing-which-serializer-to-use"],[14,0,"heading-anchor"],[12],[1,"Choosing which serializer to use"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The first step in working with Mirage\'s serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"The JSON payload above is an example of an API that follows "],[10,3],[14,6,"https://jsonapi.org/"],[14,0,"docs-md__a"],[12],[1,"the JSON:API spec"],[13],[1,". You\'ll see it used a lot in the Ember ecosystem, because it\'s the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined."],[13],[1,"\\n"],[10,2],[12],[1,"If you are starting a new app, it\'s recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don\'t use JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"If your app does use JSON:API, Mirage ships with a "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," that will do the heavy lifting for you."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage also ships with two other named serializers, "],[10,"code"],[12],[1,"ActiveModelSerializer"],[13],[1," and "],[10,"code"],[12],[1,"RestSerializer"],[13],[1,", that match two other popular backend formats. "],[10,"code"],[12],[1,"EmberDataSerializer"],[13],[1," is also provided as a variation to the "],[10,"code"],[12],[1,"RestSerializer"],[13],[1," that uses the "],[10,"code"],[12],[1,"primaryKey"],[13],[1," and "],[10,"code"],[12],[1,"attrs"],[13],[1," defined in your applications ember data serializers, similar to how models are auto discovered. See the section on "],[1,[28,[35,0],["Ember Data Serializer","docs.data-layer.serializers.ember-data-serializer"],null]],[1," for more information."],[13],[1,"\\n"],[10,2],[12],[1,"If your backend uses a different format, you\'ll need to choose the closest one and customize it to match your production format. We\'ll talk about that later in this guide."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"defining-serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#defining-serializers"],[14,0,"heading-anchor"],[12],[1,"Defining serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Once you\'ve selected the appropriate serializer, define your default application-wide serializer by exporting it from "],[10,"code"],[12],[1,"/mirage/serializers/application.js"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This specifies the serializer to use for each Model and Collection in your system."],[13],[1,"\\n"],[10,2],[12],[1,"If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s use Mirage\'s generator to create a "],[10,"code"],[12],[1,"Movie"],[13],[1," serializer:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember g mirage-serializer movie\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This creates the file"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'./application\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"which follows the best practice of model-specific serializers extending from your Application serializer."],[13],[1,"\\n"],[10,2],[12],[1,"You can now customize the behavior of how "],[10,"code"],[12],[1,"Movie"],[13],[1," models and collections are serialized into JSON."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"customizing-serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#customizing-serializers"],[14,0,"heading-anchor"],[12],[1,"Customizing serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"When it comes to customizing your application\'s serializers, you\'ll mostly be tweaking Mirage\'s defaults."],[13],[1,"\\n"],[10,2],[12],[1,"For example, if your Ember app expects attribute names to be PascalCase"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n\\n{\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ReleaseDate"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"you might override the Serializer\'s "],[10,"code"],[12],[1,"keyForAttribute"],[13],[1," method:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { classify } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/string\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"keyForAttribute"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"attr"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"classify"],[13],[1,"(attr);\\n }\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"See the API docs for each serializer to learn more about all the customization hooks available."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"relationships"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#relationships"],[14,0,"heading-anchor"],[12],[1,"Relationships"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships."],[13],[1,"\\n"],[10,2],[12],[1,"For example, the "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," respects query param includes"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"GET /movies/1?include=cast-members\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes."],[13],[1,"\\n"],[10,2],[12],[1,"There\'s an option on "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," that enables this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now, a GET request to "],[10,"code"],[12],[1,"/movies/1"],[13],[1," would respond with this payload:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,";,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-members\'"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'people\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1," },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'people\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'2\'"],[13],[1," },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'people\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'3\'"],[13],[1," },\\n ]\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The Ember app could now use these ids to subsequently fetch the related cast members."],[13],[1,"\\n"],[10,2],[12],[1,"Other times, an Ember app expects to get a link to fetch related data. The "],[10,"code"],[12],[1,"JSONAPISerializer"],[13],[1," also has a hook for this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'./application\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"ApplicationSerializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"links"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"movie"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," {\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-members\'"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"`/api/movies/"],[10,1],[14,0,"hljs-subst"],[12],[1,"${movie.id}"],[13],[1,"/cast-members`"],[13],[1,"\\n }\\n };\\n }\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now a GET request to "],[10,"code"],[12],[1,"/movies/1"],[13],[1," would respond with this payload:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,";,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-members\'"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"links"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"`/api/movies/1/cast-members`"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"working-with-serialized-json"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#working-with-serialized-json"],[14,0,"heading-anchor"],[12],[1,"Working with serialized JSON"],[13],[13],[1,"\\n "],[10,2],[12],[1,"While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler."],[13],[1,"\\n"],[10,2],[12],[1,"You can use the "],[10,"code"],[12],[1,"this.serialize"],[13],[1," helper method to do this - make sure to use a "],[10,"code"],[12],[1,"function"],[13],[1," instead of a fat arrow so you have access to the correct "],[10,"code"],[12],[1,"this"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movies = schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(movies);\\n\\n json."],[10,1],[14,0,"hljs-property"],[12],[1,"meta"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"size"],[13],[1," = movies."],[10,1],[14,0,"hljs-property"],[12],[1,"length"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," json;\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"serialize"],[13],[1," helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer."],[13],[1,"\\n"],[10,2],[12],[1,"You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movies = schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(movies, "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie-with-relationship\'"],[13],[1,");\\n\\n json."],[10,1],[14,0,"hljs-property"],[12],[1,"meta"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"size"],[13],[1," = movies."],[10,1],[14,0,"hljs-property"],[12],[1,"length"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," json;\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This route handler would use the "],[10,"code"],[12],[1,"mirage/serializers/movie-with-relationship.js"],[13],[1," serializer to transform the collection of movies into a "],[10,"code"],[12],[1,"json"],[13],[1," payload, which is then modified and then finally returned from the route handler."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn\'t adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models."],[13],[1,"\\n"],[10,2],[12],[1,"The more conventional your backend API is, the less code you\'ll need to write – not only in Mirage, but also in other parts of your Ember application!"],[13],[1,"\\n"],[10,2],[12],[1,"Be sure to check out the "],[1,[28,[35,0],["Serializer","docs.api.item","modules/serializerSerializer#keyForAttribute"],null]],[1," and "],[1,[28,[35,0],["JSONAPISerializer","docs.api.item","modules/serializers/json-api-serializerJSONAPISerializer"],null]],[1," docs to learn about all the hooks available to customize your serializer layer."],[13],[1,"\\n"],[10,2],[12],[1,"Now that we\'ve covered the ins and outs of Mirage\'s data layer, we\'re ready to see how we can use Mirage to effectively test our Ember application."],[13],[1,"\\n"],[13]],[],false,["docs-link"]]',moduleName:"ember-cli-mirage-docs/templates/docs/data-layer/serializers/index.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/getting-started/installation",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"XYN6yblg",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"installation"],[14,0,"docs-md__h1"],[12],[1,"Installation"],[13],[1,"\\n "],[10,2],[12],[1,"To install Mirage, run"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember install ember-cli-mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Ember should install the addon and add a "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to the root of your project."],[13],[1,"\\n"],[10,2],[12],[1,"Check out the "],[1,[28,[35,0],["upgrade guide","docs.getting-started.upgrade-guide"],null]],[1," if you\'re coming from a previous version of Mirage."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-embroider-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-embroider-users"],[14,0,"heading-anchor"],[12],[1,"Note for Embroider users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Embroider does not recognizes changes to Ember CLI Mirage configuration in "],[10,"code"],[12],[1,"mirage/"],[13],[1," folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in "],[10,"code"],[12],[1,"EMBROIDER_REBUILD_ADDONS"],[13],[1," environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-prettier-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-prettier-users"],[14,0,"heading-anchor"],[12],[1,"Note for Prettier users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There\'s an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you\'re using Prettier and install Mirage, you can either"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[1,"pin "],[10,"code"],[12],[1,"eslint-plugin-prettier"],[13],[1," to 2.6.0, or"],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[1,"add the following to "],[10,"code"],[12],[1,".eslintignore"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/mirage\\n"],[13],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"note-for-fastboot-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-fastboot-users"],[14,0,"heading-anchor"],[12],[1,"Note for FastBoot users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot."],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/1411"],[14,0,"docs-md__a"],[12],[1,"FastBoot support"],[13],[1," is a highly requested feature we are working on. In the meantime, you\'ll need to develop your FastBoot pages against a local server."],[13],[1,"\\n"],[10,2],[12],[1,"You can always bypass FastBoot page generation locally by running"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"FASTBOOT_DISABLED=true ember serve\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage will then run in the browser as expected, and you can develop your client app as normal."],[13],[1,"\\n"],[13]],[],false,["docs-link"]]',moduleName:"ember-cli-mirage-docs/templates/docs/getting-started/installation.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"MmDtPME0",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"installation"],[14,0,"docs-md__h1"],[12],[1,"Installation"],[13],[1,"\\n "],[10,2],[12],[1,"To install Mirage, run"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember install ember-cli-mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Ember should install the addon and add a "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to the root of your project. \\nEmber-cli-mirage depends on "],[10,3],[14,6,"https://miragejs.com/"],[14,0,"docs-md__a"],[12],[1,"MirageJS"],[13],[1," as a peer dependency and will add it to your applications "],[10,"code"],[12],[1,"package.json"],[13],[1,". "],[13],[1,"\\n"],[10,2],[12],[1,"Check out the "],[1,[28,[35,0],["upgrade guide","docs.getting-started.upgrade-guide"],null]],[1," if you\'re coming from a previous version of Mirage."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-embroider-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-embroider-users"],[14,0,"heading-anchor"],[12],[1,"Note for Embroider users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Embroider does not recognizes changes to Ember CLI Mirage configuration in "],[10,"code"],[12],[1,"mirage/"],[13],[1," folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in "],[10,"code"],[12],[1,"EMBROIDER_REBUILD_ADDONS"],[13],[1," environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"note-for-prettier-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-prettier-users"],[14,0,"heading-anchor"],[12],[1,"Note for Prettier users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There\'s an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you\'re using Prettier and install Mirage, you can either"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[1,"pin "],[10,"code"],[12],[1,"eslint-plugin-prettier"],[13],[1," to 2.6.0, or"],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[1,"add the following to "],[10,"code"],[12],[1,".eslintignore"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/mirage\\n"],[13],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"note-for-fastboot-users"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#note-for-fastboot-users"],[14,0,"heading-anchor"],[12],[1,"Note for FastBoot users"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot."],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/1411"],[14,0,"docs-md__a"],[12],[1,"FastBoot support"],[13],[1," is a highly requested feature we are working on. In the meantime, you\'ll need to develop your FastBoot pages against a local server."],[13],[1,"\\n"],[10,2],[12],[1,"You can always bypass FastBoot page generation locally by running"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"FASTBOOT_DISABLED=true ember serve\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage will then run in the browser as expected, and you can develop your client app as normal."],[13],[1,"\\n"],[13]],[],false,["docs-link"]]',moduleName:"ember-cli-mirage-docs/templates/docs/getting-started/installation.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/getting-started/overview",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"lRPReY8e",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"overview"],[14,0,"docs-md__h1"],[12],[1,"Overview"],[13],[1,"\\n "],[10,2],[12],[1,"The file mirage/config.js contains the boilerplate code to create a mirage server."],[13],[1,"\\n"],[10,2],[12],[1,"You can customize the server that is created here by following the mirage documentation\\n"],[10,3],[14,6,"https://miragejs.com/docs/getting-started/overview/"],[14,0,"docs-md__a"],[12],[1,"https://miragejs.com/docs/getting-started/overview/"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage lets you simulate API responses by writing "],[10,"strong"],[12],[1,"route handlers"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"The simplest example of a route handler is a function that returns an object:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"namespace"],[13],[1," = "],[10,1],[14,0,"hljs-string"],[12],[1,"\'api\'"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1," } },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Inception\'"],[13],[1," } },\\n { "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Dunkirk\'"],[13],[1," } },\\n ]\\n };\\n });\\n\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now whenever your Ember app makes a GET request to "],[10,"code"],[12],[1,"/api/movies"],[13],[1,", Mirage will respond with this data."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"dynamic-data"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#dynamic-data"],[14,0,"heading-anchor"],[12],[1,"Dynamic data"],[13],[13],[1,"\\n "],[10,2],[12],[1,"This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,"em"],[12],[1,"They\'re inflexible"],[13],[1,". What if you want to change the data for this route in your tests?"],[13],[1,"\\n"],[10,"li"],[12],[10,"em"],[12],[1,"They contain formatting logic"],[13],[1,". Logic that\'s concerned with the shape of your JSON payload (e.g. the "],[10,"code"],[12],[1,"data"],[13],[1," and "],[10,"code"],[12],[1,"attributes"],[13],[1," keys) is now duplicated across all your route handlers."],[13],[1,"\\n"],[10,"li"],[12],[10,"em"],[12],[1,"They\'re too basic."],[13],[1," Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down."],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"Mirage provides a "],[10,"strong"],[12],[1,"data layer"],[13],[1," that lets you write more powerful server implementations. Let\'s see how it works by replacing our basic stub data above."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"creating-a-model"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#creating-a-model"],[14,0,"heading-anchor"],[12],[1,"Creating a model"],[13],[13],[1,"\\n "],[10,2],[12],[1,"First, we\'ll need to tell Mirage that we have a dynamic "],[10,"code"],[12],[1,"Movie"],[13],[1," model."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re using Ember Data and you already have a "],[10,"code"],[12],[1,"Movie"],[13],[1," model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won\'t have any files in the "],[10,"code"],[12],[1,"mirage/models"],[13],[1," directory."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re not using Ember Data, you can use the "],[10,"code"],[12],[1,"mirage-model"],[13],[1," generator to create a model from the command line:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-bash"],[12],[1,"$ ember g mirage-model movie\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This generates the following file:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"writing-a-dynamic-route-handler"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#writing-a-dynamic-route-handler"],[14,0,"heading-anchor"],[12],[1,"Writing a dynamic route handler"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Models let our route handlers take advantage of Mirage\'s "],[10,"em"],[12],[1,"in-memory database"],[13],[1,". The database makes our route handlers dynamic, so we can change the data that\'s returned without having to rewrite the handler."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s update our route handler to be dynamic:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"schema"],[13],[1," argument lets us access our new "],[10,"code"],[12],[1,"Movie"],[13],[1," model. This route will now respond with all the authors in Mirage\'s database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage\'s database, instead of having to write a different version of the handler for each scenario we want to simulate."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"seeding-the-database"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#seeding-the-database"],[14,0,"heading-anchor"],[12],[1,"Seeding the database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Right now, if we sent a request to our new handler above, the response would look something like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /api/movies"],[13],[1,"\\n"],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n]\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"That\'s because Mirage\'s database is empty."],[13],[1,"\\n"],[10,2],[12],[1,"To actually seed our database with fake data, we\'ll use "],[10,"em"],[12],[1,"factories"],[13],[1,". Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s create a factory for our author with"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"$ "],[13],[1,"ember g mirage-factory movie\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/factories/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"title"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"i"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"`Movie "],[10,1],[14,0,"hljs-subst"],[12],[1,"${i}"],[13],[1,"`"],[13],[1,"; "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Movie 1, Movie 2, etc."],[13],[1,"\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"year"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," min = "],[10,1],[14,0,"hljs-number"],[12],[1,"1950"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," max = "],[10,1],[14,0,"hljs-number"],[12],[1,"2019"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Math"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"floor"],[13],[1,"("],[10,1],[14,0,"hljs-title class_"],[12],[1,"Math"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"random"],[13],[1,"() * (max - min + "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,")) + min;\\n },\\n\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This factory creates objects like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"[\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Movie 1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1992"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n },\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Movie 2\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2008"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ..."],[13],[1,"\\n]\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and so on, which will automatically be inserted into the "],[10,"code"],[12],[1,"movies"],[13],[1," database table. The database will assign each record an "],[10,"code"],[12],[1,"id"],[13],[1,", and now we can interact with this data in our route handlers."],[13],[1,"\\n"],[10,2],[12],[1,"To actually use our new factory definition, we can call the "],[10,"code"],[12],[1,"server.create"],[13],[1," and "],[10,"code"],[12],[1,"server.createList"],[13],[1," methods."],[13],[1,"\\n"],[10,2],[12],[1,"To seed our development database, use the function in the "],[10,"code"],[12],[1,"scenarios/default.js"],[13],[1," file:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/scenarios/default.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"server"],[13],[1,") {\\n\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"10"],[13],[1,");\\n\\n};\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now when our Ember app makes a GET request to "],[10,"code"],[12],[1,"/api/movies"],[13],[1," using the route handler above, we\'ll see something that looks like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /api/movies"],[13],[1,"\\n"],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": [\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"movies\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Movie 1\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1992"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n }\\n },\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"movies\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Movie 2\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"year"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"2008"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"rating"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"PG-13\\""],[13],[1,"\\n }\\n },\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ..."],[13],[1,"\\n]\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"As we can see, this response is now influenced by the run-time state of our database."],[13],[1,"\\n"],[10,2],[12],[1,"In acceptance tests, "],[10,"code"],[12],[1,"scenarios/default.js"],[13],[1," is ignored, and instead you can use "],[10,"code"],[12],[1,"this.server"],[13],[1," to setup your database in the state needed for the test:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// tests/acceptance/movies-test.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can view the movies\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"movie\\""],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/home\\""],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"[data-test-id=\'movie-row\']\\""],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"exists"],[13],[1,"({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"count"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1," });\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You can also pass attribute overrides directly to "],[10,"code"],[12],[1,"create"],[13],[1," or "],[10,"code"],[12],[1,"createList"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can view the movie title\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movie = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Interstellar\\""],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"`/movies/"],[10,1],[14,0,"hljs-subst"],[12],[1,"${movie.id}"],[13],[1,"`"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'h1\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"includesText"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Interstellar\\""],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You now have a simple way to set up your Mirage server\'s initial data, both during development and on a per-test basis."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"associations"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#associations"],[14,0,"heading-anchor"],[12],[1,"Associations"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s say your movie has many cast-members. You can declare this relationship in your model:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", hasMany } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"castMembers"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasMany"],[13],[1,"()\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/cast-member.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"movie"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id/cast-members\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," movie = schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"(request."],[10,1],[14,0,"hljs-property"],[12],[1,"params"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," movie."],[10,1],[14,0,"hljs-property"],[12],[1,"castMembers"],[13],[1,";\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and when creating graphs of related data:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can see a movie\'s cast members\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"castMembers"],[13],[1,": [\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-member\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Matthew McConaughey\'"],[13],[1," }),\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-member\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Anne Hathaway\'"],[13],[1," }),\\n server."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'cast-member\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Jessica Chastain\'"],[13],[1," })\\n ]\\n });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/\'"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'li.cast-member\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"exists"],[13],[1,"({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"count"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1," });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage uses foreign keys to keep track of these related models for you, so you don\'t have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage\'s database."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"serializers"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#serializers"],[14,0,"heading-anchor"],[12],[1,"Serializers"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Mirage is designed for you to be able to completely replicate your production server."],[13],[1,"\\n"],[10,2],[12],[1,"So far, we\'ve seen that Mirage\'s default payloads are formatted using the "],[10,3],[14,6,"https://jsonapi.org"],[14,0,"docs-md__a"],[12],[1,"JSON:API"],[13],[1," spec. This spec produces payloads that look like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movies\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"For example, your API responses might look more like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /movies/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"movies"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This is why Mirage "],[10,"em"],[12],[1,"serializers"],[13],[1," exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"keyForAttribute"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"attr"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"dasherize"],[13],[1,"(attr);\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"keyForRelationship"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"attr"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"dasherize"],[13],[1,"(attr);\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage\'s serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/movie.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Serializer"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"include"],[13],[1,": [ "],[10,1],[14,0,"hljs-string"],[12],[1,"\'crewMembers\'"],[13],[1," ]\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"movies"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"find"],[13],[1,"(request."],[10,1],[14,0,"hljs-property"],[12],[1,"params"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n });\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"With the above config, a GET to "],[10,"code"],[12],[1,"/movies/1"],[13],[1," would return automatically include related crew members:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1,"{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"movie"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'crew-members\'"],[13],[1,": [\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie-id\'"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Matthew McConaughey\'"],[13],[1,"\\n },\\n {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie-id\'"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Anne Hathaway\'"],[13],[1,"\\n },\\n ...\\n ]\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the "],[10,3],[14,6,"../api/modules/serializer~Serializer"],[14,0,"docs-md__a"],[12],[1,"serializer guide"],[13],[1," to learn more."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"shorthands"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#shorthands"],[14,0,"heading-anchor"],[12],[1,"Shorthands"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Mirage has "],[10,"em"],[12],[1,"shorthands"],[13],[1," to reduce the code needed for conventional API routes. For example, the route handler"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"schema, request"],[13],[1,") =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," schema."],[10,1],[14,0,"hljs-property"],[12],[1,"authors"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"can be written as"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"There are also shorthands for "],[10,"code"],[12],[1,"post"],[13],[1,", "],[10,"code"],[12],[1,"patch"],[13],[1," (or "],[10,"code"],[12],[1,"put"],[13],[1,"), and "],[10,"code"],[12],[1,"del"],[13],[1," methods. Here\'s a full set of resourceful routes for an "],[10,"code"],[12],[1,"author"],[13],[1," resource:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors/:id\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"post"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"patch"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors/:id\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"del"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/authors/:id\'"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"passthrough"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#passthrough"],[14,0,"heading-anchor"],[12],[1,"Passthrough"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Mirage is a great tool to use even if you\'re working on an existing app, or if you don\'t want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn\'t have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"passthrough"],[13],[1,"();\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now you can develop as you normally would, for example against an existing API."],[13],[1,"\\n"],[10,2],[12],[1,"When it comes time to build a new feature, you don\'t have to wait for the API to be updated. Just define the new route that you need"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/config.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/comments\'"],[13],[1,");\\n\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"passthrough"],[13],[1,"();\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"That should be enough to get you started!"],[13],[1,"\\n"],[10,2],[12],[1,"The rest of the docs are organized by Mirage\'s higher-level concepts:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Route handlers"],[13],[1," contain the logic around what run-time data Mirage uses to respond to requests."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[1,"The "],[10,"strong"],[12],[1,"Data layer"],[13],[1," is how Mirage stores and tracks changes to your data over time."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"Keep reading to learn more!"],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/getting-started/overview.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/getting-started/upgrade-guide/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"qbWLi3z/",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"upgrade-guide"],[14,0,"docs-md__h1"],[12],[1,"Upgrade guide"],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading from an existing version of Mirage, you can run the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"Using npm\\nnpm install -D ember-cli-mirage@X.X.X\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"Using yarn\\nyarn add -D ember-cli-mirage@X.X.X\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"full-changelog"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#full-changelog"],[14,0,"heading-anchor"],[12],[1,"Full Changelog"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You can view all of Mirage\'s release notes on "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/releases"],[14,0,"docs-md__a"],[12],[1,"our Releases page"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"3-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#3-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"3.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Ensure that all the imports are updated for the objects that were moved to MirageJS. \\nThis is generally the imports in the files in the mirage directory."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// from"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"//to"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Previous the file "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," was a exported default function that defined only your routes.\\nSince MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS."],[13],[1,"\\n"],[10,2],[12],[1,"Change the routes function to no longer be exported as the default function and give it a name, we\\nsuggest "],[10,"code"],[12],[1,"routes"],[13],[1,". Add the below boilerplate code to the top of the "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1,". The end\\nresult would look like this."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," {\\n discoverEmberDataModels,\\n} "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," ("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// This would be your old default export function renamed"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The environment variable discoverEmberDataModels is now longer used. If you wish to \\nnot have "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," auto discover the models, just remove the "],[10,"code"],[12],[1,"...discoverEmberDataModels(),"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"2-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#2-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"2.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-update-import-paths-for-miragejs-imports"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-update-import-paths-for-miragejs-imports"],[14,0,"heading-anchor"],[12],[1,"1. Update import paths for miragejs imports"],[13],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"1-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#1-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"1.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-remove-faker-js"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-remove-faker-js"],[14,0,"heading-anchor"],[12],[1,"1. Remove Faker.js"],[13],[13],[1,"\\n "],[10,2],[12],[1,"When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call "],[10,"code"],[12],[1,"app.import"],[13],[1," in order to use the library in your application code."],[13],[1,"\\n"],[10,2],[12],[1,"Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for "],[10,3],[14,6,"https://github.com/Marak/faker.js"],[14,0,"docs-md__a"],[12],[1,"Faker.js"],[13],[1,", a useful library to have alongside your Mirage factory definitions."],[13],[1,"\\n"],[10,2],[12],[1,"There\'s a few problems with this, most notably that users "],[10,"em"],[12],[1,"had"],[13],[1," to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version."],[13],[1,"\\n"],[10,2],[12],[1,"Now, thanks to "],[10,3],[14,6,"https://github.com/ef4/ember-auto-import"],[14,0,"docs-md__a"],[12],[1,"Ember Auto Import"],[13],[1,", this is no longer the case. Using dependencies directly from npm is painless – just "],[10,"code"],[12],[1,"yarn/npm install"],[13],[1," them and "],[10,"code"],[12],[1,"import"],[13],[1," them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you."],[13],[1,"\\n"],[10,2],[12],[1,"This also means that users can easily manage their project\'s version of Faker (and other similar dependencies) independently of the version of Mirage they\'re using."],[13],[1,"\\n"],[10,2],[12],[1,"For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change."],[13],[1,"\\n"],[10,2],[12],[1,"Here are the steps you\'ll need to take to fix this:"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Ember Auto Import (if it\'s not already installed)"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"ember install ember-auto-import\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Faker.js directly from npm:"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"yarn add -D faker\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"or npm install --save-dev faker\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Change all imports of "],[10,"code"],[12],[1,"faker"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-packge"],[13],[1," to import directly from "],[10,"code"],[12],[1,"faker"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[10,1],[14,0,"hljs-deletion"],[12],[1,"- import { Factory, faker } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import { Factory } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import faker from \'faker\';"],[13],[1,"\\n"],[13],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage-faker-codemod"],[14,0,"docs-md__a"],[12],[1,"There is a codemod"],[13],[1," that will do this for you, thanks to the gracious work of "],[10,3],[14,6,"https://github.com/caseywatts"],[14,0,"docs-md__a"],[12],[1,"Casey Watts"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \\"useful\\" additions. I thought this was a good idea at the time... it wasn\'t. 🙈"],[13],[1,"\\n"],[10,2],[12],[1,"You can look at "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/v0.4.15/addon/faker.js"],[14,0,"docs-md__a"],[12],[1,"the module from v0.4.15"],[13],[1," to see that we added the "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1," and "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1," methods, so if you use these methods too, you\'ll need to refactor them."],[13],[1,"\\n"],[10,2],[12],[1,"Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS:"],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.arrayElement"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.random([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.arrayElement([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1,", use the remainder (modulo) operator:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries(i) {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.cycle([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ let countries = [ \'United States of America\', \'Canada\', \'Mexico\' ];"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return countries[i % countries.length];"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.number"],[13],[1," with min and max options:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," age() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.random.number.range(18, 65);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.number({ min: 18, max: 65 });"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like "],[10,3],[14,6,"https://chancejs.com/"],[14,0,"docs-md__a"],[12],[1,"Chance.js"],[13],[1,", and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"2-new-import-for-setupmirage"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#2-new-import-for-setupmirage"],[14,0,"heading-anchor"],[12],[1,"2. New import for setupMirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Before"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," setupMirage "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support/setup-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// After"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support\\""],[13],[1,";\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"heading-anchor"],[12],[1,"3. Remove deprecated forms of "],[10,"code"],[12],[1,"create"],[13],[1,", "],[10,"code"],[12],[1,"createList"],[13],[1," and "],[10,"code"],[12],[1,"normalizedRequestAttrs"],[13],[13],[13],[1,"\\n "],[10,2],[12],[1,"There are several places in Mirage\'s APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we\'re moving to 1.0, we\'re removing this deprecated/unintentional behavior."],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"server.create"],[13],[1," and "],[10,"code"],[12],[1,"server.createList"],[13],[1," were coded to take a singularized model name, e.g. "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,". It just so happens that "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," also works. That pluralized version is now removed from Mirage."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," to "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Note this also applies to "],[10,"code"],[12],[1,"server.createList"],[13],[1," – the correct form is "],[10,"code"],[12],[1,"server.createList(\'user\', 3)"],[13],[1,", and the pluralized form "],[10,"code"],[12],[1,"server.createList(\'users\', 3)"],[13],[1," is now unsupported."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"this.normalizedRequestAttrs"],[13],[1," in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path."],[13],[1,"\\n"],[10,2],[12],[1,"In this case, you can call "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1," to tell Mirage to expect the payload to be for a "],[10,"code"],[12],[1,"blog-post"],[13],[1," model."],[13],[1,"\\n"],[10,2],[12],[1,"This API was intended to be used with dasherized names, because that\'s how compound model names are specified throughout Mirage when they are represented as strings."],[13],[1,"\\n"],[10,2],[12],[1,"It just so happened that "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blogPost\')"],[13],[1," also worked, by chance, until a refactor. So, that behavior was kept but now is being removed."],[13],[1,"\\n"],[10,2],[12],[1,"The correct usage is "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1,". Using the camelized version of the model name is no longer supported."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that\'s the case!"],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"heading-anchor"],[12],[1,"4. The "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," serializer property now defaults to true"],[13],[13],[1,"\\n "],[10,2],[12],[1,"This applies to the ActiveModelSerializer and RestSerializer."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"normalize"],[13],[1," property on serializers helps Mirage\'s shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly."],[13],[1,"\\n"],[10,2],[12],[1,"There was a gap in the default "],[10,"code"],[12],[1,"normalize"],[13],[1," method for a long time, in that it didn\'t take REST payloads that included foreign keys and looked like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," payload = {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"contact"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Link\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n};\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and turn that "],[10,"code"],[12],[1,"address"],[13],[1," key into a proper JSON:API relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'contacts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Link\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'address\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"We added this feature a while ago, and it\'s controlled with the "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn\'t be a breaking change.)"],[13],[1,"\\n"],[10,2],[12],[1,"We\'re now making "],[10,"code"],[12],[1,"true"],[13],[1," the default, which should be the behavior everyone desires (assuming they\'re using shorthands). This is technically a breaking change, though it\'s unlikely to affect most people."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-3-x-0-4-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-3-x-0-4-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.3.x → 0.4 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There is one primary change in 0.4 that could break your 0.3 app."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.3.x, Mirage\'s JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being "],[10,"code"],[12],[1,"included"],[13],[1," in the payload."],[13],[1,"\\n"],[10,2],[12],[1,"This actually goes against JSON:API\'s design. Foreign keys in the payload are known as "],[10,3],[14,6,"http://jsonapi.org/format/#document-resource-object-linkage"],[14,0,"docs-md__a"],[12],[1,"Resource Linkage"],[13],[1," and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document."],[13],[1,"\\n"],[10,2],[12],[1,"By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a "],[10,"code"],[12],[1,"post"],[13],[1," came back like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'users\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and you forgot to "],[10,"code"],[12],[1,"?include=author"],[13],[1," in your GET request, Ember Data would potentially use the "],[10,"code"],[12],[1,"user:1"],[13],[1," foreign key and lazily fetch the "],[10,"code"],[12],[1,"author"],[13],[1," by making a request to "],[10,"code"],[12],[1,"GET /authors/1"],[13],[1,". This is problematic because"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"This is not how foreign keys are intended to be used"],[13],[1,"\\n"],[10,"li"],[12],[1,"It\'d be better to see no data and fix the problem by going back up to your data-loading code and add "],[10,"code"],[12],[1,"?include=author"],[13],[1," to your GET request, or"],[13],[1,"\\n"],[10,"li"],[12],[1,"If you do want your interface to lazily load the author, use resource "],[10,"code"],[12],[1,"links"],[13],[1," instead of the resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"links"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/api/users/1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Resource links can be defined on Mirage serializers using the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel"],[14,0,"docs-md__a"],[12],[1,"links"],[13],[1," method (though "],[10,"code"],[12],[1,"including"],[13],[1," is likely the far more simpler and common approach to fetching related data)."],[13],[1,"\\n"],[10,2],[12],[1,"So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document)."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior is configurable via the "],[10,"code"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," key on your JSONAPISerializers. It is set to "],[10,"code"],[12],[1,"false"],[13],[1," by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to "],[10,"code"],[12],[1,"true"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you do this, I would recommend looking closely at how your real server behaves when serializing resources\' relationships and whether it uses resource "],[10,"code"],[12],[1,"links"],[13],[1," or resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,", and to update your Mirage code accordingly to give you the most faithful representation of your server."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-2-x-0-3-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-2-x-0-3-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.2.x → 0.3 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.2, the following model definitions"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"would have generated a \\"schema\\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from "],[10,"code"],[12],[1,"post"],[13],[1," to "],[10,"code"],[12],[1,"author"],[13],[1,". To have a two-way sync\'d relationship, known as an inverse, you\'d need to define both sides of the relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", hasMany } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"posts"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasMany"],[13],[1,"()\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Practically speaking, to upgrade you\'ll need to go through your code and update relationships that implicitly had inverses (from 0.2.x\'s hasMany and belongsTo behavior) and update them to define both sides."],[13],[1,"\\n"],[10,2],[12],[1,"This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you\'d also need the author to have a "],[10,"code"],[12],[1,"postIds: []"],[13],[1," array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.)"],[13],[1,"\\n"],[10,2],[12],[1,"Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it\'s probably because of something I haven\'t thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help!"],[13],[1,"\\n"],[10,2],[12],[1,"For more information on the motivation behind change, please read the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/blog/2017/01/09/0-3-0-beta-series/"],[14,0,"docs-md__a"],[12],[1,"0-3 beta series release blog post"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-1-x-0-2-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-1-x-0-2-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.1.x → 0.2 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading your Mirage server from v0.1.x to v0.2.x, here\'s what you need to know:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The default Mirage directory has changed."],[13],[1," The default Mirage directory has moved from "],[10,"code"],[12],[1,"/app/mirage"],[13],[1," to "],[10,"code"],[12],[1,"/mirage"],[13],[1,". When you install 0.2.0, the default blueprint will add the "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to your project. You can delete it and move your current Mirage files to the new location with something like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"rm -rf mirage\\nmv app/mirage mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"from the root of your project. Mirage\'s directory is also "],[10,3],[14,6,"../configuration/#directory"],[14,0,"docs-md__a"],[12],[1,"customizable"],[13],[1," (Although you should move it from the "],[10,"code"],[12],[1,"/app"],[13],[1," directory or else it will not be removed from the build in production mode)."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All multiword filenames are dasherized."],[13],[1," In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. "],[10,"code"],[12],[1,"blog_posts: []"],[13],[1,"), just name your file "],[10,"code"],[12],[1,"fixtures/blog_posts.js"],[13],[1,". This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P."],[13],[1,"\\n"],[10,2],[12],[1,"In Mirage 0.2.x, we follow Ember CLI\'s conventions of dasherized filenames. So, you\'ll just need to go through and change"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog_post.js\\n/mirage/fixtures/blog_post.js\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"etc.\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog-post.js\\n/mirage/fixtures/blog-post.js\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You will then use the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"new Serializer layer"],[13],[1," to do things like format keys in your json payloads."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All JavaScript properties are camelCased."],[13],[1," Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be "],[10,"code"],[12],[1,"db.blog_posts"],[13],[1,", and your factory keys might be "],[10,"code"],[12],[1,"first_name() {..}"],[13],[1,". Looks pretty cool right?"],[13],[1,"\\n"],[10,2],[12],[1,"Wrong. We\'re JavaScript developers here, people. It\'s time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.)"],[13],[1,"\\n"],[10,2],[12],[1,"You\'ll need to update your route handlers, which may look like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blog_posts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"author_id"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blogPosts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"authorId"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Note that everything is camelCased, including foreign keys."],[13],[1,"\\n"],[10,2],[12],[1,"Similarly, factories that look like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"first_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"last_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"should be changed to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"lastName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This goes for all attrs that "],[10,"code"],[12],[1,"server.create"],[13],[1," takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Mirage now has its own Model layer (an ORM)."],[13],[1," In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we\'ve introduced Mirage Models, which serve as the new canonical source of truth about your database."],[13],[1,"\\n"],[10,2],[12],[1,"To create a model, use"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember g mirage-model blog-post\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This will create a file like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Having that file sets up the "],[10,"code"],[12],[1,"db.blogPosts"],[13],[1," collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. "],[3," not yet! in 0.6.0 For instance, given the model above, `server.create(\'blog-post\')` would create a blank `blog-post` model. You could then make a factory for models that need more customization. "],[1," Models, factories and fixtures all work together, but now you won\'t be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth."],[13],[1,"\\n"],[10,2],[12],[1,"We needed to add models for "],[10,3],[14,6,"../models/#associations"],[14,0,"docs-md__a"],[12],[1,"association support"],[13],[1," (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the "],[10,3],[14,6,"../models"],[14,0,"docs-md__a"],[12],[1,"models guide"],[13],[1," and "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," to see how having models can simplify your Mirage server."],[13],[1,"\\n"],[10,2],[12],[1,"We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition."],[13],[1,"\\n"],[10,2],[12],[1,"Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The ORM object "],[10,"code"],[12],[1,"schema"],[13],[1," is now injected into route handlers."],[13],[1," In Mirage 0.1.x, the "],[10,"code"],[12],[1,"db"],[13],[1," was the first parameter injected into route handlers:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"db, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now, the "],[10,"code"],[12],[1,"schema"],[13],[1," object is, so you can take advantage of the Model layer. Fortunately, the "],[10,"code"],[12],[1,"db"],[13],[1," hangs directly off of the "],[10,"code"],[12],[1,"schema"],[13],[1,", so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"{ db }, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and then start opting-in to the ORM (and using "],[10,"code"],[12],[1,"schema"],[13],[1,") one route handler at a time."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Specify a Serializer."],[13],[1," If you\'re using shorthands, you\'ll need to pick a serializer in "],[10,"code"],[12],[1,"/mirage/serializers/application.js"],[13],[1,". See the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," for details."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"You can always view the "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/master/CHANGELOG.md"],[14,0,"docs-md__a"],[12],[1,"full changelog"],[13],[1," to see everything that\'s changed. If you think this guide missed a critical part of the upgrade path, please "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/new"],[14,0,"docs-md__a"],[12],[1,"open an issue"],[13],[1,"!"],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/getting-started/upgrade-guide/index.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"4O6+Yk8C",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"upgrade-guide"],[14,0,"docs-md__h1"],[12],[1,"Upgrade guide"],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading from an existing version of Mirage, you can run the following:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"Using npm\\nnpm install -D ember-cli-mirage@X.X.X\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"Using yarn\\nyarn add -D ember-cli-mirage@X.X.X\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"full-changelog"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#full-changelog"],[14,0,"heading-anchor"],[12],[1,"Full Changelog"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You can view all of Mirage\'s release notes on "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/releases"],[14,0,"docs-md__a"],[12],[1,"our Releases page"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"3-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#3-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"3.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Ensure that all the imports are updated for the objects that were moved to MirageJS. \\nThis is generally the imports in the files in the mirage directory."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// from"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"//to"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Previous the file "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," was a exported default function that defined only your routes.\\nSince MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS."],[13],[1,"\\n"],[10,2],[12],[1,"Change the routes function to no longer be exported as the default function and give it a name, we\\nsuggest "],[10,"code"],[12],[1,"routes"],[13],[1,". Add the below boilerplate code to the top of the "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1,". The end\\nresult would look like this."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," {\\n discoverEmberDataModels,\\n} "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," ("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n routes,\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n}\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// This would be your old default export function renamed"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The environment variable discoverEmberDataModels is now longer used. If you wish to \\nnot have "],[10,"code"],[12],[1,"ember-cli-mirage"],[13],[1," auto discover the models, just remove the "],[10,"code"],[12],[1,"...discoverEmberDataModels(),"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"2-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#2-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"2.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-update-import-paths-for-miragejs-imports"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-update-import-paths-for-miragejs-imports"],[14,0,"heading-anchor"],[12],[1,"1. Update import paths for miragejs imports"],[13],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"1-0-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#1-0-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"1.0 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There were a few breaking changes made in the 1.0 release."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"1-remove-faker-js"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#1-remove-faker-js"],[14,0,"heading-anchor"],[12],[1,"1. Remove Faker.js"],[13],[13],[1,"\\n "],[10,2],[12],[1,"When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call "],[10,"code"],[12],[1,"app.import"],[13],[1," in order to use the library in your application code."],[13],[1,"\\n"],[10,2],[12],[1,"Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for "],[10,3],[14,6,"https://github.com/Marak/faker.js"],[14,0,"docs-md__a"],[12],[1,"Faker.js"],[13],[1,", a useful library to have alongside your Mirage factory definitions."],[13],[1,"\\n"],[10,2],[12],[1,"There\'s a few problems with this, most notably that users "],[10,"em"],[12],[1,"had"],[13],[1," to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version."],[13],[1,"\\n"],[10,2],[12],[1,"Now, thanks to "],[10,3],[14,6,"https://github.com/ef4/ember-auto-import"],[14,0,"docs-md__a"],[12],[1,"Ember Auto Import"],[13],[1,", this is no longer the case. Using dependencies directly from npm is painless – just "],[10,"code"],[12],[1,"yarn/npm install"],[13],[1," them and "],[10,"code"],[12],[1,"import"],[13],[1," them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you."],[13],[1,"\\n"],[10,2],[12],[1,"This also means that users can easily manage their project\'s version of Faker (and other similar dependencies) independently of the version of Mirage they\'re using."],[13],[1,"\\n"],[10,2],[12],[1,"For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change."],[13],[1,"\\n"],[10,2],[12],[1,"Here are the steps you\'ll need to take to fix this:"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Ember Auto Import (if it\'s not already installed)"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"ember install ember-auto-import\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Install Faker.js directly from npm:"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"yarn add -D faker\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"\\n# "],[13],[1,"or npm install --save-dev faker\\n"],[13],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"Change all imports of "],[10,"code"],[12],[1,"faker"],[13],[1," from the "],[10,"code"],[12],[1,"ember-cli-packge"],[13],[1," to import directly from "],[10,"code"],[12],[1,"faker"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[10,1],[14,0,"hljs-deletion"],[12],[1,"- import { Factory, faker } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import { Factory } from \'miragejs\';"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ import faker from \'faker\';"],[13],[1,"\\n"],[13],[13],[1,"\\n"],[10,2],[12],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage-faker-codemod"],[14,0,"docs-md__a"],[12],[1,"There is a codemod"],[13],[1," that will do this for you, thanks to the gracious work of "],[10,3],[14,6,"https://github.com/caseywatts"],[14,0,"docs-md__a"],[12],[1,"Casey Watts"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \\"useful\\" additions. I thought this was a good idea at the time... it wasn\'t. 🙈"],[13],[1,"\\n"],[10,2],[12],[1,"You can look at "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/v0.4.15/addon/faker.js"],[14,0,"docs-md__a"],[12],[1,"the module from v0.4.15"],[13],[1," to see that we added the "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1," and "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1," methods, so if you use these methods too, you\'ll need to refactor them."],[13],[1,"\\n"],[10,2],[12],[1,"Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS:"],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.random"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.arrayElement"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.random([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.arrayElement([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.list.cycle"],[13],[1,", use the remainder (modulo) operator:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," countries(i) {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.list.cycle([ \'United States of America\', \'Canada\', \'Mexico\' ]);"],[13],[1,"\\n\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ let countries = [ \'United States of America\', \'Canada\', \'Mexico\' ];"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return countries[i % countries.length];"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"For "],[10,"code"],[12],[1,"faker.random.number.range"],[13],[1,", use "],[10,"code"],[12],[1,"faker.random.number"],[13],[1," with min and max options:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-diff"],[12],[1," age() {\\n"],[10,1],[14,0,"hljs-deletion"],[12],[1,"- return faker.random.number.range(18, 65);"],[13],[1,"\\n"],[10,1],[14,0,"hljs-addition"],[12],[1,"+ return faker.random.number({ min: 18, max: 65 });"],[13],[1,"\\n }\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like "],[10,3],[14,6,"https://chancejs.com/"],[14,0,"docs-md__a"],[12],[1,"Chance.js"],[13],[1,", and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"2-new-import-for-setupmirage"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#2-new-import-for-setupmirage"],[14,0,"heading-anchor"],[12],[1,"2. New import for setupMirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// Before"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," setupMirage "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support/setup-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// After"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage/test-support\\""],[13],[1,";\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#3-remove-deprecated-forms-of-create-createlist-and-normalizedrequestattrs"],[14,0,"heading-anchor"],[12],[1,"3. Remove deprecated forms of "],[10,"code"],[12],[1,"create"],[13],[1,", "],[10,"code"],[12],[1,"createList"],[13],[1," and "],[10,"code"],[12],[1,"normalizedRequestAttrs"],[13],[13],[13],[1,"\\n "],[10,2],[12],[1,"There are several places in Mirage\'s APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we\'re moving to 1.0, we\'re removing this deprecated/unintentional behavior."],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"server.create"],[13],[1," and "],[10,"code"],[12],[1,"server.createList"],[13],[1," were coded to take a singularized model name, e.g. "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,". It just so happens that "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," also works. That pluralized version is now removed from Mirage."],[13],[1,"\\n"],[10,2],[12],[1,"If you\'re running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like "],[10,"code"],[12],[1,"server.create(\'users\')"],[13],[1," to "],[10,"code"],[12],[1,"server.create(\'user\')"],[13],[1,"."],[13],[1,"\\n"],[10,2],[12],[1,"Note this also applies to "],[10,"code"],[12],[1,"server.createList"],[13],[1," – the correct form is "],[10,"code"],[12],[1,"server.createList(\'user\', 3)"],[13],[1,", and the pluralized form "],[10,"code"],[12],[1,"server.createList(\'users\', 3)"],[13],[1," is now unsupported."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"code"],[12],[1,"this.normalizedRequestAttrs"],[13],[1," in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path."],[13],[1,"\\n"],[10,2],[12],[1,"In this case, you can call "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1," to tell Mirage to expect the payload to be for a "],[10,"code"],[12],[1,"blog-post"],[13],[1," model."],[13],[1,"\\n"],[10,2],[12],[1,"This API was intended to be used with dasherized names, because that\'s how compound model names are specified throughout Mirage when they are represented as strings."],[13],[1,"\\n"],[10,2],[12],[1,"It just so happened that "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blogPost\')"],[13],[1," also worked, by chance, until a refactor. So, that behavior was kept but now is being removed."],[13],[1,"\\n"],[10,2],[12],[1,"The correct usage is "],[10,"code"],[12],[1,"this.normalizedRequestAttrs(\'blog-post\')"],[13],[1,". Using the camelized version of the model name is no longer supported."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,2],[12],[1,"If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that\'s the case!"],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#4-the-normalizeids-serializer-property-now-defaults-to-true"],[14,0,"heading-anchor"],[12],[1,"4. The "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," serializer property now defaults to true"],[13],[13],[1,"\\n "],[10,2],[12],[1,"This applies to the ActiveModelSerializer and RestSerializer."],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"normalize"],[13],[1," property on serializers helps Mirage\'s shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly."],[13],[1,"\\n"],[10,2],[12],[1,"There was a gap in the default "],[10,"code"],[12],[1,"normalize"],[13],[1," method for a long time, in that it didn\'t take REST payloads that included foreign keys and looked like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," payload = {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"contact"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Link\\""],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n};\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and turn that "],[10,"code"],[12],[1,"address"],[13],[1," key into a proper JSON:API relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'contacts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Link\'"],[13],[1,"\\n },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"address"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'address\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,"\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"We added this feature a while ago, and it\'s controlled with the "],[10,"code"],[12],[1,"normalizeIds"],[13],[1," property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn\'t be a breaking change.)"],[13],[1,"\\n"],[10,2],[12],[1,"We\'re now making "],[10,"code"],[12],[1,"true"],[13],[1," the default, which should be the behavior everyone desires (assuming they\'re using shorthands). This is technically a breaking change, though it\'s unlikely to affect most people."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-3-x-0-4-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-3-x-0-4-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.3.x → 0.4 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"There is one primary change in 0.4 that could break your 0.3 app."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.3.x, Mirage\'s JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being "],[10,"code"],[12],[1,"included"],[13],[1," in the payload."],[13],[1,"\\n"],[10,2],[12],[1,"This actually goes against JSON:API\'s design. Foreign keys in the payload are known as "],[10,3],[14,6,"http://jsonapi.org/format/#document-resource-object-linkage"],[14,0,"docs-md__a"],[12],[1,"Resource Linkage"],[13],[1," and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document."],[13],[1,"\\n"],[10,2],[12],[1,"By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a "],[10,"code"],[12],[1,"post"],[13],[1," came back like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'users\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and you forgot to "],[10,"code"],[12],[1,"?include=author"],[13],[1," in your GET request, Ember Data would potentially use the "],[10,"code"],[12],[1,"user:1"],[13],[1," foreign key and lazily fetch the "],[10,"code"],[12],[1,"author"],[13],[1," by making a request to "],[10,"code"],[12],[1,"GET /authors/1"],[13],[1,". This is problematic because"],[13],[1,"\\n\\n "],[10,"ol"],[14,0,"docs-list-decimal"],[12],[10,"li"],[12],[1,"This is not how foreign keys are intended to be used"],[13],[1,"\\n"],[10,"li"],[12],[1,"It\'d be better to see no data and fix the problem by going back up to your data-loading code and add "],[10,"code"],[12],[1,"?include=author"],[13],[1," to your GET request, or"],[13],[1,"\\n"],[10,"li"],[12],[1,"If you do want your interface to lazily load the author, use resource "],[10,"code"],[12],[1,"links"],[13],[1," instead of the resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,":"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// GET /posts/1"],[13],[1,"\\n{\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"data"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"type"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'posts\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"id"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'1\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"attributes"],[13],[1,": { ... },\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"relationships"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"links"],[13],[1,": {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"related"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/api/users/1\'"],[13],[1,"\\n }\\n }\\n }\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Resource links can be defined on Mirage serializers using the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/docs/v0.3.x/serializers/#linksmodel"],[14,0,"docs-md__a"],[12],[1,"links"],[13],[1," method (though "],[10,"code"],[12],[1,"including"],[13],[1," is likely the far more simpler and common approach to fetching related data)."],[13],[1,"\\n"],[10,2],[12],[1,"So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document)."],[13],[1,"\\n"],[10,2],[12],[1,"This behavior is configurable via the "],[10,"code"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," key on your JSONAPISerializers. It is set to "],[10,"code"],[12],[1,"false"],[13],[1," by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to "],[10,"code"],[12],[1,"true"],[13],[1,":"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/serializers/application.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"JSON"],[13],[1,"APISerializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you do this, I would recommend looking closely at how your real server behaves when serializing resources\' relationships and whether it uses resource "],[10,"code"],[12],[1,"links"],[13],[1," or resource linkage "],[10,"code"],[12],[1,"data"],[13],[1,", and to update your Mirage code accordingly to give you the most faithful representation of your server."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-2-x-0-3-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-2-x-0-3-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.2.x → 0.3 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API."],[13],[1,"\\n"],[10,2],[12],[1,"In 0.2, the following model definitions"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"would have generated a \\"schema\\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from "],[10,"code"],[12],[1,"post"],[13],[1," to "],[10,"code"],[12],[1,"author"],[13],[1,". To have a two-way sync\'d relationship, known as an inverse, you\'d need to define both sides of the relationship:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/author.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", hasMany } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"posts"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasMany"],[13],[1,"()\\n});\\n\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// mirage/models/post.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,", belongsTo } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"author"],[13],[1,": "],[10,1],[14,0,"hljs-title function_"],[12],[1,"belongsTo"],[13],[1,"()\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Practically speaking, to upgrade you\'ll need to go through your code and update relationships that implicitly had inverses (from 0.2.x\'s hasMany and belongsTo behavior) and update them to define both sides."],[13],[1,"\\n"],[10,2],[12],[1,"This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you\'d also need the author to have a "],[10,"code"],[12],[1,"postIds: []"],[13],[1," array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.)"],[13],[1,"\\n"],[10,2],[12],[1,"Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it\'s probably because of something I haven\'t thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help!"],[13],[1,"\\n"],[10,2],[12],[1,"For more information on the motivation behind change, please read the "],[10,3],[14,6,"http://www.ember-cli-mirage.com/blog/2017/01/09/0-3-0-beta-series/"],[14,0,"docs-md__a"],[12],[1,"0-3 beta series release blog post"],[13],[1,"."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"0-1-x-0-2-upgrade-guide"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#0-1-x-0-2-upgrade-guide"],[14,0,"heading-anchor"],[12],[1,"0.1.x → 0.2 Upgrade guide"],[13],[13],[1,"\\n "],[10,2],[12],[1,"If you\'re upgrading your Mirage server from v0.1.x to v0.2.x, here\'s what you need to know:"],[13],[1,"\\n\\n "],[10,"ul"],[14,0,"docs-list-disc"],[12],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The default Mirage directory has changed."],[13],[1," The default Mirage directory has moved from "],[10,"code"],[12],[1,"/app/mirage"],[13],[1," to "],[10,"code"],[12],[1,"/mirage"],[13],[1,". When you install 0.2.0, the default blueprint will add the "],[10,"code"],[12],[1,"/mirage"],[13],[1," directory to your project. You can delete it and move your current Mirage files to the new location with something like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"rm -rf mirage\\nmv app/mirage mirage\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"from the root of your project. Mirage\'s directory is also "],[10,3],[14,6,"../configuration/#directory"],[14,0,"docs-md__a"],[12],[1,"customizable"],[13],[1," (Although you should move it from the "],[10,"code"],[12],[1,"/app"],[13],[1," directory or else it will not be removed from the build in production mode)."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All multiword filenames are dasherized."],[13],[1," In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. "],[10,"code"],[12],[1,"blog_posts: []"],[13],[1,"), just name your file "],[10,"code"],[12],[1,"fixtures/blog_posts.js"],[13],[1,". This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P."],[13],[1,"\\n"],[10,2],[12],[1,"In Mirage 0.2.x, we follow Ember CLI\'s conventions of dasherized filenames. So, you\'ll just need to go through and change"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog_post.js\\n/mirage/fixtures/blog_post.js\\n"],[10,1],[14,0,"hljs-meta prompt_"],[12],[1,"# "],[13],[1,"etc.\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-sh"],[12],[1,"/mirage/factories/blog-post.js\\n/mirage/fixtures/blog-post.js\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"You will then use the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"new Serializer layer"],[13],[1," to do things like format keys in your json payloads."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"All JavaScript properties are camelCased."],[13],[1," Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be "],[10,"code"],[12],[1,"db.blog_posts"],[13],[1,", and your factory keys might be "],[10,"code"],[12],[1,"first_name() {..}"],[13],[1,". Looks pretty cool right?"],[13],[1,"\\n"],[10,2],[12],[1,"Wrong. We\'re JavaScript developers here, people. It\'s time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.)"],[13],[1,"\\n"],[10,2],[12],[1,"You\'ll need to update your route handlers, which may look like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blog_posts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"author_id"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," posts = db."],[10,1],[14,0,"hljs-property"],[12],[1,"blogPosts"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"p"],[13],[1," =>"],[13],[1," p."],[10,1],[14,0,"hljs-property"],[12],[1,"authorId"],[13],[1," === "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Note that everything is camelCased, including foreign keys."],[13],[1,"\\n"],[10,2],[12],[1,"Similarly, factories that look like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"first_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"last_name"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"should be changed to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Factory"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n },\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"lastName"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," faker."],[10,1],[14,0,"hljs-property"],[12],[1,"name"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"firstName"],[13],[1,"();\\n }\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This goes for all attrs that "],[10,"code"],[12],[1,"server.create"],[13],[1," takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Mirage now has its own Model layer (an ORM)."],[13],[1," In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we\'ve introduced Mirage Models, which serve as the new canonical source of truth about your database."],[13],[1,"\\n"],[10,2],[12],[1,"To create a model, use"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[12],[1,"ember g mirage-model blog-post\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This will create a file like"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"ember-cli-mirage\\""],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Model"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"extend"],[13],[1,"({});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Having that file sets up the "],[10,"code"],[12],[1,"db.blogPosts"],[13],[1," collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. "],[3," not yet! in 0.6.0 For instance, given the model above, `server.create(\'blog-post\')` would create a blank `blog-post` model. You could then make a factory for models that need more customization. "],[1," Models, factories and fixtures all work together, but now you won\'t be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth."],[13],[1,"\\n"],[10,2],[12],[1,"We needed to add models for "],[10,3],[14,6,"../models/#associations"],[14,0,"docs-md__a"],[12],[1,"association support"],[13],[1," (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the "],[10,3],[14,6,"../models"],[14,0,"docs-md__a"],[12],[1,"models guide"],[13],[1," and "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," to see how having models can simplify your Mirage server."],[13],[1,"\\n"],[10,2],[12],[1,"We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition."],[13],[1,"\\n"],[10,2],[12],[1,"Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"The ORM object "],[10,"code"],[12],[1,"schema"],[13],[1," is now injected into route handlers."],[13],[1," In Mirage 0.1.x, the "],[10,"code"],[12],[1,"db"],[13],[1," was the first parameter injected into route handlers:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"db, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now, the "],[10,"code"],[12],[1,"schema"],[13],[1," object is, so you can take advantage of the Model layer. Fortunately, the "],[10,"code"],[12],[1,"db"],[13],[1," hangs directly off of the "],[10,"code"],[12],[1,"schema"],[13],[1,", so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/posts\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"{ db }, request"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// work with db"],[13],[1,"\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"and then start opting-in to the ORM (and using "],[10,"code"],[12],[1,"schema"],[13],[1,") one route handler at a time."],[13],[1,"\\n"],[13],[1,"\\n"],[10,"li"],[12],[10,2],[12],[10,"strong"],[12],[1,"Specify a Serializer."],[13],[1," If you\'re using shorthands, you\'ll need to pick a serializer in "],[10,"code"],[12],[1,"/mirage/serializers/application.js"],[13],[1,". See the "],[10,3],[14,6,"../serializers"],[14,0,"docs-md__a"],[12],[1,"serializers guide"],[13],[1," for details."],[13],[1,"\\n"],[13],[1,"\\n"],[13],[1,"\\n "],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"You can always view the "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/blob/master/CHANGELOG.md"],[14,0,"docs-md__a"],[12],[1,"full changelog"],[13],[1," to see everything that\'s changed. If you think this guide missed a critical part of the upgrade path, please "],[10,3],[14,6,"https://github.com/miragejs/ember-cli-mirage/issues/new"],[14,0,"docs-md__a"],[12],[1,"open an issue"],[13],[1,"!"],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/getting-started/upgrade-guide/index.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/getting-started/upgrade-guide/v2-deprecations",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"alsCvPd9",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"deprecations-added-in-v2-x-of-ember-cli-mirage"],[14,0,"docs-md__h1"],[12],[1,"Deprecations Added in v2.x of ember-cli-mirage"],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"miragejs-re-exports"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#miragejs-re-exports"],[14,0,"heading-anchor"],[12],[1,"miragejs re-exports"],[13],[13],[1,"\\n \\n "],[10,"h2"],[14,1,"only-exporting-routes-as-the-default-function"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#only-exporting-routes-as-the-default-function"],[14,0,"heading-anchor"],[12],[1,"only exporting routes as the default function"],[13],[13],[1,"\\n "],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/getting-started/upgrade-guide/v2-deprecations.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/getting-started/what-is-mirage",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 @@ -257,7 +257,7 @@ var s=(0,t.createTemplateFactory)({id:"MDfHqQWz",block:'[[[10,0],[14,0,"docs-md" e.default=s})),define("ember-cli-mirage-docs/templates/docs/testing/assertions",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"b57OGOsl",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"assertions"],[14,0,"docs-md__h1"],[12],[1,"Assertions"],[13],[1,"\\n "],[10,2],[12],[1,"Most of your tests will assert against your Ember app\'s UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you\'ll assert that your UI is in the state you expect it to be."],[13],[1,"\\n"],[10,2],[12],[1,"But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server."],[13],[1,"\\n"],[10,2],[12],[1,"To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"asserting-against-mirage-s-database"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#asserting-against-mirage-s-database"],[14,0,"heading-anchor"],[12],[1,"Asserting against Mirage\'s database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage\'s database. If the correct data makes it there, you\'ll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect."],[13],[1,"\\n"],[10,2],[12],[1,"Here\'s an example:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can change the lesson\'s title\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'lesson\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'My First Lesson\'"],[13],[1," })\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.Edit\'"],[13],[1,")\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Updated lesson\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.Save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Assert against our app\'s UI"],[13],[1,"\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'h1\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"hasText"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Updated lesson\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Also check that the data was \\"persisted\\" to our backend"],[13],[1,"\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"db"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"lessons"],[13],[1,"["],[10,1],[14,0,"hljs-number"],[12],[1,"0"],[13],[1,"]."],[10,1],[14,0,"hljs-property"],[12],[1,"title"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Updated lesson\'"],[13],[1,");\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This is a great way to gain some extra confidence that your Ember app is sending over the data you expect."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"asserting-against-mirage-models"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#asserting-against-mirage-models"],[14,0,"heading-anchor"],[12],[1,"Asserting against Mirage Models"],[13],[13],[1,"\\n "],[10,2],[12],[1,"It can also be useful to assert against Mirage\'s ORM models, to verify things like updates to your model\'s relationships:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'I can add a tag to a post\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," programming = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'tag\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"name"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Programming\'"],[13],[1," });\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," post = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'post\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"`/posts/"],[10,1],[14,0,"hljs-subst"],[12],[1,"${post.id}"],[13],[1,"/edit`"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"select"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.tags\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Programming\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"()."],[10,1],[14,0,"hljs-title function_"],[12],[1,"includesText"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Saved!\'"],[13],[1,");\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"(post."],[10,1],[14,0,"hljs-title function_"],[12],[1,"reload"],[13],[1,"()."],[10,1],[14,0,"hljs-property"],[12],[1,"tagIds"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"includes"],[13],[1,"(programming."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,"));\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The "],[10,"code"],[12],[1,"reload"],[13],[1," method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected."],[13],[1,"\\n"],[10,2],[12],[1,"Asserting against models is basically another way to verify Mirage\'s database data is correct."],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"asserting-against-handled-requests-and-responses"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#asserting-against-handled-requests-and-responses"],[14,0,"heading-anchor"],[12],[1,"Asserting against handled requests and responses"],[13],[13],[1,"\\n "],[10,2],[12],[1,"You can also assert against the actual HTTP requests and responses that are made during your test."],[13],[1,"\\n"],[10,2],[12],[1,"To do this, first enable "],[10,3],[14,6,"https://github.com/pretenderjs/pretender#tracking-requests"],[14,0,"docs-md__a"],[12],[1,"Pretender\'s "],[10,"code"],[12],[1,"trackedRequests"],[13],[1," feature"],[13],[1," by enabling the "],[10,"code"],[12],[1,"trackRequests"],[13],[1," environment option:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// config/environment.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"exports"],[13],[1," = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"environment"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"if"],[13],[1," (environment === "],[10,1],[14,0,"hljs-string"],[12],[1,"\'test\'"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable constant_"],[12],[1,"ENV"],[13],[1,"["],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,"] = {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"trackRequests"],[13],[1,": "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,"\\n };\\n }\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"This feature is disabled by default to avoid memory issues during long development sessions."],[13],[1,"\\n"],[10,2],[12],[1,"Now Mirage will track every request (along with the associated response) and make them available to you via "],[10,"code"],[12],[1,"server.pretender.handledRequests"],[13],[1,". That way you can assert against requests in that array at the end of your test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"I can filter the table\\""],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"5"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"genre"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Sci-Fi\'"],[13],[1," });\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"createList"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"3"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"genre"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Drama\'"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"visit"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'/\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"select"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.genre\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Sci-Fi\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Assert against our app\'s UI"],[13],[1,"\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"dom"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'tr\'"],[13],[1,")."],[10,1],[14,0,"hljs-title function_"],[12],[1,"exists"],[13],[1,"({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"count"],[13],[1,": "],[10,1],[14,0,"hljs-number"],[12],[1,"5"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Also assert against the HTTP request count & query"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," requests = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"pretender"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"handledRequests"],[13],[1,";\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"(requests."],[10,1],[14,0,"hljs-property"],[12],[1,"length"],[13],[1,", "],[10,1],[14,0,"hljs-number"],[12],[1,"1"],[13],[1,");\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"deepEqual"],[13],[1,"(requests["],[10,1],[14,0,"hljs-number"],[12],[1,"0"],[13],[1,"]."],[10,1],[14,0,"hljs-property"],[12],[1,"queryParams"],[13],[1,", { "],[10,1],[14,0,"hljs-string"],[12],[1,"\'filter[genre]\'"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Sci-Fi\'"],[13],[1," });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"In general we recommend asserting against Mirage\'s database and your UI, as the specifics of your app\'s HTTP requests should be considered implementation details of the behavior you\'re actually interested in verifying. But there\'s certainly valid reasons to drop down and assert against HTTP data."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"And with that, you\'ve completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage\'s various classes."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/testing/assertions.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/testing/integration-and-unit-tests",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -var s=(0,t.createTemplateFactory)({id:"EuqvmdU0",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"integration-and-unit-tests"],[14,0,"docs-md__h1"],[12],[1,"Integration and unit tests"],[13],[1,"\\n "],[10,2],[12],[1,"While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s say you have a data-fetching component, and you want to write a "],[10,3],[14,6,"https://guides.emberjs.com/release/testing/#toc_rendering-tests"],[14,0,"docs-md__a"],[12],[1,"rendering test"],[13],[1," to verify its behavior."],[13],[1,"\\n"],[10,2],[12],[1,"You can import and use the "],[10,"code"],[12],[1,"setupMirage"],[13],[1," function directly in your rendering test, and use Mirage just like you would in an acceptance test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can fetch records\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n

{{model.title}}

\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," file, you can use "],[10,"code"],[12],[1,"this.server"],[13],[1," to setup new routes."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it renders an error state\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"(\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," ({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"errors"],[13],[1,": [ "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Something went wrong\'"],[13],[1," ]}),\\n "],[10,1],[14,0,"hljs-number"],[12],[1,"500"],[13],[1,"\\n );\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n {{#if error}}\\n

Whoops!

\\n {{/if}}\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Whoops!\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"creating-ember-data-models-on-the-client-with-mirage"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#creating-ember-data-models-on-the-client-with-mirage"],[14,0,"heading-anchor"],[12],[1,"Creating Ember Data models on the client with Mirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some."],[13],[1,"\\n"],[10,2],[12],[1,"For example, let\'s say we were writing a rendering test to verify the behavior of our "],[10,"code"],[12],[1,""],[13],[1," component:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// get the article"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"How might we test this?"],[13],[1,"\\n"],[10,2],[12],[1,"It might be tempting to use Mirage\'s "],[10,"code"],[12],[1,"server.create"],[13],[1,", since you probably already have factories defined:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"But you shouldn\'t do this."],[13],[1,"\\n"],[10,2],[12],[1,"Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don\'t actually know anything about your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage models exist solely in your \\"backend\\", and are only useful in helping you create your mock server definition."],[13],[1,"\\n"],[10,2],[12],[1,"The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server."],[13],[1,"\\n"],[10,2],[12],[1,"So, in the same way that you wouldn\'t create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// `article` is a Mirage model. It should never be consumed directly by Ember code."],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,");\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n`"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"So, how might we get an article materialized into Ember Data\'s store so we can test this component, while still leveraging our Mirage factory definitions?"],[13],[1,"\\n"],[10,2],[12],[1,"Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"using-findrecord-and-findall"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#using-findrecord-and-findall"],[14,0,"heading-anchor"],[12],[1,"Using findRecord and findAll"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The first approach is to lookup Ember Data\'s store, and use it to find the record (just like your Ember application\'s routes do):"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 1: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"findRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"writing-a-helper-to-push-mirage-s-database"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#writing-a-helper-to-push-mirage-s-database"],[14,0,"heading-anchor"],[12],[1,"Writing a helper to push Mirage\'s database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The second approach is to make a helper that serializers Mirage\'s database into JSON and pushes that JSON into your Ember Data store."],[13],[1,"\\n"],[10,2],[12],[1,"The actual logic might depend on the configuration of your Mirage server, but if you\'re following all of Mirage\'s conventions it should look roughly like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// your-app/tests/helpers/push-mirage-into-store.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { getContext } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { run } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/runloop\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," context = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getContext"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = context."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Object"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"keys"],[13],[1,"(context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,")\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"key"],[13],[1," =>"],[13],[1," context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[key]."],[10,1],[14,0,"hljs-property"],[12],[1,"all"],[13],[1," !== "],[10,1],[14,0,"hljs-literal"],[12],[1,"undefined"],[13],[1,") "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Get the resources"],[13],[1,"\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"forEach"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"resource"],[13],[1," =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," models = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[resource]."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," modelName = models."],[10,1],[14,0,"hljs-property"],[12],[1,"modelName"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serializer = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"serializerOrRegistry"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serializerFor"],[13],[1,"(modelName);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," originalAlwaysIncludeLinkageData = serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,";\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = serializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(models);\\n\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = originalAlwaysIncludeLinkageData;\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"run"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushPayload"],[13],[1,"(json);\\n });\\n });\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now in your test, call your helper to seed Ember Data\'s store, and then use "],[10,"code"],[12],[1,"peekRecord"],[13],[1," to materialize and work with Ember Data records:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," pushMirageIntoStore "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'YOUR-APP/tests/helpers/push-mirage-into-store\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 2: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushMirageIntoStore"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," article = store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"peekRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"set"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", article);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Something like "],[10,"code"],[12],[1,"pushMirageIntoStore"],[13],[1," will probably make its way into Mirage at some point."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"Now that you\'ve seen how to use "],[10,"code"],[12],[1,"setupMirage"],[13],[1," outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server!"],[13],[1,"\\n"],[10,2],[12],[1,"Next, we discuss some ways you can go about asserting against your Mirage mock server."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/testing/integration-and-unit-tests.hbs",isStrictMode:!1}) +var s=(0,t.createTemplateFactory)({id:"N7gNWAhd",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"integration-and-unit-tests"],[14,0,"docs-md__h1"],[12],[1,"Integration and unit tests"],[13],[1,"\\n "],[10,2],[12],[1,"While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests."],[13],[1,"\\n"],[10,2],[12],[1,"Let\'s say you have a data-fetching component, and you want to write a "],[10,3],[14,6,"https://guides.emberjs.com/release/testing/#toc_rendering-tests"],[14,0,"docs-md__a"],[12],[1,"rendering test"],[13],[1," to verify its behavior."],[13],[1,"\\n"],[10,2],[12],[1,"You can import and use the "],[10,"code"],[12],[1,"setupMirage"],[13],[1," function directly in your rendering test, and use Mirage just like you would in an acceptance test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can fetch records\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'movie\'"],[13],[1,", { "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1," });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n

{{model.title}}

\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Interstellar\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your "],[10,"code"],[12],[1,"mirage/config.js"],[13],[1," file, you can use "],[10,"code"],[12],[1,"this.server"],[13],[1," to setup new routes."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | FindRecord\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it renders an error state\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"(\\n "],[10,1],[14,0,"hljs-string"],[12],[1,"\'/movies/:id\'"],[13],[1,",\\n "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," ({ "],[10,1],[14,0,"hljs-attr"],[12],[1,"errors"],[13],[1,": [ "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Something went wrong\'"],[13],[1," ]}),\\n "],[10,1],[14,0,"hljs-number"],[12],[1,"500"],[13],[1,"\\n );\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n {{#if error}}\\n

Whoops!

\\n {{/if}}\\n
\\n `"],[13],[1,");\\n\\n assert."],[10,1],[14,0,"hljs-title function_"],[12],[1,"equal"],[13],[1,"("],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"element"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"textContent"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Whoops!\'"],[13],[1,");\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h2"],[14,1,"creating-ember-data-models-on-the-client-with-mirage"],[14,0,"docs-md__h2"],[12],[10,3],[14,6,"#creating-ember-data-models-on-the-client-with-mirage"],[14,0,"heading-anchor"],[12],[1,"Creating Ember Data models on the client with Mirage"],[13],[13],[1,"\\n "],[10,2],[12],[1,"Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some."],[13],[1,"\\n"],[10,2],[12],[1,"For example, let\'s say we were writing a rendering test to verify the behavior of our "],[10,"code"],[12],[1,""],[13],[1," component:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// get the article"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"How might we test this?"],[13],[1,"\\n"],[10,2],[12],[1,"It might be tempting to use Mirage\'s "],[10,"code"],[12],[1,"server.create"],[13],[1,", since you probably already have factories defined:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"But you shouldn\'t do this."],[13],[1,"\\n"],[10,2],[12],[1,"Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don\'t actually know anything about your Ember app."],[13],[1,"\\n"],[10,2],[12],[1,"Mirage models exist solely in your \\"backend\\", and are only useful in helping you create your mock server definition."],[13],[1,"\\n"],[10,2],[12],[1,"The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server."],[13],[1,"\\n"],[10,2],[12],[1,"So, in the same way that you wouldn\'t create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// 🔴 Don\'t do this"],[13],[1,"\\n"],[10,1],[14,0,"hljs-comment"],[12],[1,"// `article` is a Mirage model. It should never be consumed directly by Ember code."],[13],[1,"\\n"],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,");\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n`"],[13],[1,");\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"So, how might we get an article materialized into Ember Data\'s store so we can test this component, while still leveraging our Mirage factory definitions?"],[13],[1,"\\n"],[10,2],[12],[1,"Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this."],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"using-findrecord-and-findall"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#using-findrecord-and-findall"],[14,0,"heading-anchor"],[12],[1,"Using findRecord and findAll"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The first approach is to lookup Ember Data\'s store, and use it to find the record (just like your Ember application\'s routes do):"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 1: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"findRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n\\n "],[10,"h3"],[14,1,"writing-a-helper-to-push-mirage-s-database"],[14,0,"docs-md__h3"],[12],[10,3],[14,6,"#writing-a-helper-to-push-mirage-s-database"],[14,0,"heading-anchor"],[12],[1,"Writing a helper to push Mirage\'s database"],[13],[13],[1,"\\n "],[10,2],[12],[1,"The second approach is to make a helper that serializers Mirage\'s database into JSON and pushes that JSON into your Ember Data store."],[13],[1,"\\n"],[10,2],[12],[1,"The actual logic might depend on the configuration of your Mirage server, but if you\'re following all of Mirage\'s conventions it should look roughly like this:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-comment"],[12],[1,"// your-app/tests/helpers/push-mirage-into-store.js"],[13],[1,"\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { getContext } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { run } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/runloop\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"export"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"default"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," context = "],[10,1],[14,0,"hljs-title function_"],[12],[1,"getContext"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = context."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-title class_"],[12],[1,"Object"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"keys"],[13],[1,"(context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,")\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"filter"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"key"],[13],[1," =>"],[13],[1," context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[key]."],[10,1],[14,0,"hljs-property"],[12],[1,"all"],[13],[1," !== "],[10,1],[14,0,"hljs-literal"],[12],[1,"undefined"],[13],[1,") "],[10,1],[14,0,"hljs-comment"],[12],[1,"// Get the resources"],[13],[1,"\\n ."],[10,1],[14,0,"hljs-title function_"],[12],[1,"forEach"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[10,1],[14,0,"hljs-params"],[12],[1,"resource"],[13],[1," =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," models = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"schema"],[13],[1,"[resource]."],[10,1],[14,0,"hljs-title function_"],[12],[1,"all"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," modelName = models."],[10,1],[14,0,"hljs-property"],[12],[1,"modelName"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serializer = context."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"serializerOrRegistry"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serializerFor"],[13],[1,"(modelName);\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," originalAlwaysIncludeLinkageData = serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1,";\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = "],[10,1],[14,0,"hljs-literal"],[12],[1,"true"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," json = serializer."],[10,1],[14,0,"hljs-title function_"],[12],[1,"serialize"],[13],[1,"(models);\\n\\n serializer."],[10,1],[14,0,"hljs-property"],[12],[1,"alwaysIncludeLinkageData"],[13],[1," = originalAlwaysIncludeLinkageData;\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"run"],[13],[1,"("],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushPayload"],[13],[1,"(json);\\n });\\n });\\n}\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Now in your test, call your helper to seed Ember Data\'s store, and then use "],[10,"code"],[12],[1,"peekRecord"],[13],[1," to materialize and work with Ember Data records:"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"module"],[13],[1," } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupRenderingTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { click, fillIn } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'@ember/test-helpers\'"],[13],[1,";\\n"],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," pushMirageIntoStore "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'YOUR-APP/tests/helpers/push-mirage-into-store\'"],[13],[1,";\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Integration | Component | ArticleForm\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupRenderingTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'it can edit an article\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// ✅ Option 2: Use the store to find the record"],[13],[1,"\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," serverArticle = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"server"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"create"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", {\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"title"],[13],[1,": "],[10,1],[14,0,"hljs-string"],[12],[1,"\'Old title\'"],[13],[1,"\\n });\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"pushMirageIntoStore"],[13],[1,"();\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," store = "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"owner"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"lookup"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'service:store\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"article"],[13],[1," = store."],[10,1],[14,0,"hljs-title function_"],[12],[1,"peekRecord"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'article\'"],[13],[1,", serverArticle."],[10,1],[14,0,"hljs-property"],[12],[1,"id"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"render"],[13],[1,"(hbs"],[10,1],[14,0,"hljs-string"],[12],[1,"`\\n \\n `"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"fillIn"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'input\'"],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\'New title\'"],[13],[1,");\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"await"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"click"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'.save\'"],[13],[1,");\\n\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// assert the model was saved"],[13],[1,"\\n });\\n});\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"Something like "],[10,"code"],[12],[1,"pushMirageIntoStore"],[13],[1," will probably make its way into Mirage at some point."],[13],[1,"\\n"],[10,"hr"],[14,0,"docs-md__hr"],[12],[13],[10,2],[12],[1,"Now that you\'ve seen how to use "],[10,"code"],[12],[1,"setupMirage"],[13],[1," outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server!"],[13],[1,"\\n"],[10,2],[12],[1,"Next, we discuss some ways you can go about asserting against your Mirage mock server."],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/testing/integration-and-unit-tests.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/docs/testing/setup-mirage",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 var s=(0,t.createTemplateFactory)({id:"SJZrnIUa",block:'[[[10,0],[14,0,"docs-md"],[12],[1,"\\n "],[10,"h1"],[14,1,"setupmirage-test-helper"],[14,0,"docs-md__h1"],[12],[1,"setupMirage test helper"],[13],[1,"\\n "],[10,2],[12],[1,"In your tests (acceptance, integration and unit) you can import the "],[10,"code"],[12],[1,"setupMirage"],[13],[1," test helper to start the Mirage server. Passing the hooks from the test module allows the mirage server to be created and shutdown before and after each test."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks);\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'my first test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// test code"],[13],[1,"\\n });\\n });\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"The second parameter (optional) allows defining the mirage server to be used for this set of tests."],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," makeServer "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'app-name/mirage/config\'"],[13],[1,"; "],[10,1],[14,0,"hljs-comment"],[12],[1,"// replace app-name with your app name"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks, { makeServer });\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'my first test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// test code"],[13],[1,"\\n });\\n });\\n"],[13],[13],[1,"\\n"],[10,2],[12],[1,"If it is not desirable to use the default config from the mirage directory you could import any other file that implements the same function, or even define the function locally or inline"],[13],[1,"\\n"],[10,"pre"],[14,0,"docs-md__code"],[12],[10,"code"],[14,0,"language-js"],[12],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupApplicationTest } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-qunit\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { setupMirage } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage/test-support\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { discoverEmberDataModels } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'ember-cli-mirage\'"],[13],[1,";\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"import"],[13],[1," { createServer } "],[10,1],[14,0,"hljs-keyword"],[12],[1,"from"],[13],[1," "],[10,1],[14,0,"hljs-string"],[12],[1,"\'miragejs\'"],[13],[1,";\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"const"],[13],[1," makeServer = "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"config"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"let"],[13],[1," finalConfig = {\\n ...config,\\n "],[10,1],[14,0,"hljs-attr"],[12],[1,"models"],[13],[1,": { ..."],[10,1],[14,0,"hljs-title function_"],[12],[1,"discoverEmberDataModels"],[13],[1,"(), ...config."],[10,1],[14,0,"hljs-property"],[12],[1,"models"],[13],[1," },\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"routes"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[13],[1,") {\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"namespace"],[13],[1," = "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"api\\""],[13],[1,"\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-property"],[12],[1,"timing"],[13],[1," = "],[10,1],[14,0,"hljs-number"],[12],[1,"2000"],[13],[1,"\\n\\n "],[10,1],[14,0,"hljs-variable language_"],[12],[1,"this"],[13],[1,"."],[10,1],[14,0,"hljs-title function_"],[12],[1,"get"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\\"/movies\\""],[13],[1,", "],[10,1],[14,0,"hljs-function"],[12],[1,"() =>"],[13],[1," {\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," ["],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Interstellar\\""],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Inception\\""],[13],[1,", "],[10,1],[14,0,"hljs-string"],[12],[1,"\\"Dunkirk\\""],[13],[1,"]\\n })\\n }\\n };\\n\\n "],[10,1],[14,0,"hljs-keyword"],[12],[1,"return"],[13],[1," "],[10,1],[14,0,"hljs-title function_"],[12],[1,"createServer"],[13],[1,"(finalConfig);\\n }\\n\\n"],[10,1],[14,0,"hljs-title function_"],[12],[1,"module"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'Acceptance | Homepage test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"hooks"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupApplicationTest"],[13],[1,"(hooks);\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"setupMirage"],[13],[1,"(hooks, { makeServer });\\n\\n "],[10,1],[14,0,"hljs-title function_"],[12],[1,"test"],[13],[1,"("],[10,1],[14,0,"hljs-string"],[12],[1,"\'my first test\'"],[13],[1,", "],[10,1],[14,0,"hljs-keyword"],[12],[1,"async"],[13],[1," "],[10,1],[14,0,"hljs-keyword"],[12],[1,"function"],[13],[1,"("],[10,1],[14,0,"hljs-params"],[12],[1,"assert"],[13],[1,") {\\n "],[10,1],[14,0,"hljs-comment"],[12],[1,"// test code"],[13],[1,"\\n });\\n });\\n"],[13],[13],[1,"\\n"],[13]],[],false,[]]',moduleName:"ember-cli-mirage-docs/templates/docs/testing/setup-mirage.hbs",isStrictMode:!1}) e.default=s})),define("ember-cli-mirage-docs/templates/index",["exports","@ember/template-factory"],(function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 diff --git a/versions/master/assets/vendor-b8ab54957db71ef413fea7af5f51932a.js b/versions/master/assets/vendor-4644b75e144ac992042ed72206ce7dfc.js similarity index 99% rename from versions/master/assets/vendor-b8ab54957db71ef413fea7af5f51932a.js rename to versions/master/assets/vendor-4644b75e144ac992042ed72206ce7dfc.js index 0c67c9494..8a2a33dd0 100644 --- a/versions/master/assets/vendor-b8ab54957db71ef413fea7af5f51932a.js +++ b/versions/master/assets/vendor-4644b75e144ac992042ed72206ce7dfc.js @@ -6710,7 +6710,7 @@ let o=this.args.model var c,d,h,p,f,m e.default=u,(0,t.setComponentTemplate)(l,u)})),define("ember-cli-addon-docs/components/docs-viewer/x-nav-list/index",["exports","@ember/component","@ember/component/template-only","@ember/template-factory"],(function(e,t,r,n){"use strict" Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0 -const i=(0,n.createTemplateFactory)({id:"Bjfn/ei7",block:'[[[11,"ul"],[17,1],[12],[1,"\\n "],[18,2,[[28,[37,1],null,[["item"],[[50,"docs-viewer/x-nav-item",0,null,null]]]]]],[1,"\\n"],[13]],["&attrs","&default"],false,["yield","hash","component"]]',moduleName:"ember-cli-addon-docs/components/docs-viewer/x-nav-list/index.hbs",isStrictMode:!1}) +const i=(0,n.createTemplateFactory)({id:"0oWkQpa2",block:'[[[11,"ul"],[16,0,[30,1]],[17,2],[12],[1,"\\n "],[18,3,[[28,[37,1],null,[["item"],[[50,"docs-viewer/x-nav-item",0,null,null]]]]]],[1,"\\n"],[13]],["@class","&attrs","&default"],false,["yield","hash","component"]]',moduleName:"ember-cli-addon-docs/components/docs-viewer/x-nav-list/index.hbs",isStrictMode:!1}) var o=(0,t.setComponentTemplate)(i,(0,r.default)()) e.default=o})),define("ember-cli-addon-docs/components/docs-viewer/x-nav/index",["exports","@ember/component","@ember/service","@glimmer/component","@glimmer/tracking","tracked-toolbox","@ember/string","ember-cli-addon-docs/utils/computed","ember-cli-addon-docs/-private/config","@ember/template-factory"],(function(e,t,r,n,i,o,s,a,l,u){"use strict" var c,d,h,p,f,m,b diff --git a/versions/master/docs/ember-cli-mirage.json b/versions/master/docs/ember-cli-mirage.json index a4d3fec7e..bb2188008 100644 --- a/versions/master/docs/ember-cli-mirage.json +++ b/versions/master/docs/ember-cli-mirage.json @@ -1 +1 @@ -{"jsonapi":{"version":"1.0"},"data":{"type":"project","id":"ember-cli-mirage","attributes":{"name":"ember-cli-mirage","version":"0.0.0","navigationIndex":[{"type":"modules","items":[{"id":"ember-cli-mirage/ember-data","path":"modules/ember-cli-mirage/ember-data","name":"ember-cli-mirage/ember-data"},{"id":"ember-cli-mirage/serializers/ember-data-serializer","path":"modules/ember-cli-mirage/serializers/ember-data-serializer","name":"ember-cli-mirage/serializers/ember-data-serializer"}]}]},"relationships":{"modules":{"data":[{"type":"module","id":"ember-cli-mirage/ember-data"},{"type":"module","id":"ember-cli-mirage/serializers/ember-data-serializer"}]}}},"included":[{"type":"module","id":"ember-cli-mirage/ember-data","attributes":{"file":"ember-cli-mirage/ember-data","functions":[{"name":"discoverEmberDataModels","description":"

Get all mirage models for each of the ember-data models

\n
","lineNumber":65,"access":"public","tags":[{"name":"method","value":"discoverEmberDataModels"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"models","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"},{"name":"applyEmberDataSerializers","description":"

Generate mirage serializers for each of the ember-data serializers\nif a mirage serializer already exists, apply the ember-data transforms

\n
","lineNumber":158,"access":"public","tags":[{"name":"method","value":"applyEmberDataSerializers"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"serializers","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"}],"variables":[]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}},{"type":"module","id":"ember-cli-mirage/serializers/ember-data-serializer","attributes":{"file":"ember-cli-mirage/serializers/ember-data-serializer","functions":[],"variables":[{"name":"EmberDataSerializer","description":"

This serializer does not use following mirage properties to control how things are serialized

\n
attrs - see `serialize` on the transform property\nembed - see `serialize` on the transform property\nserializeIds - see serialize on the transform property\n
\n

The above configuration was applied to every property on the serializer, whereas the transforms allows you\nto specify a value for each property or relation.

\n

This serializer uses a property transforms that follows the Ember Data serializer format of attrs to specify the\nserialization (attrs is already in use by mirageJs).

\n

The startMirage has been modified to also generate serializers from the Ember Data serializers supporting\nthe key and the serialize/deserialize properties with the value of (true/ids/records). If a serializer is\nalready present in the mirage directory, the transforms will be added to it. If that serializer is not\na serializer of this type, there will be no effect. Ensure that your serializers and/or the application\nserializer in the mirage directory is a type of this serializer

\n
","lineNumber":33,"access":"public","tags":[{"name":"constructor","value":""}],"file":"ember-cli-mirage/serializers/ember-data-serializer","type":"any","exportType":"default"}]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}}]} +{"jsonapi":{"version":"1.0"},"data":{"type":"project","id":"ember-cli-mirage","attributes":{"name":"ember-cli-mirage","version":"0.0.0","navigationIndex":[{"type":"modules","items":[{"id":"ember-cli-mirage/ember-data","path":"modules/ember-cli-mirage/ember-data","name":"ember-cli-mirage/ember-data"},{"id":"ember-cli-mirage/serializers/ember-data-serializer","path":"modules/ember-cli-mirage/serializers/ember-data-serializer","name":"ember-cli-mirage/serializers/ember-data-serializer"}]}]},"relationships":{"modules":{"data":[{"type":"module","id":"ember-cli-mirage/ember-data"},{"type":"module","id":"ember-cli-mirage/serializers/ember-data-serializer"}]}}},"included":[{"type":"module","id":"ember-cli-mirage/ember-data","attributes":{"file":"ember-cli-mirage/ember-data","functions":[{"name":"discoverEmberDataModels","description":"

Get all mirage models for each of the ember-data models

\n
","lineNumber":65,"access":"public","tags":[{"name":"method","value":"discoverEmberDataModels"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"models","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"},{"name":"applyEmberDataSerializers","description":"

Generate mirage serializers for each of the ember-data serializers\nif a mirage serializer already exists, apply the ember-data transforms

\n
","lineNumber":158,"access":"public","tags":[{"name":"method","value":"applyEmberDataSerializers"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"serializers","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"}],"variables":[]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}},{"type":"module","id":"ember-cli-mirage/serializers/ember-data-serializer","attributes":{"file":"ember-cli-mirage/serializers/ember-data-serializer","functions":[],"variables":[{"name":"EmberDataSerializer","description":"

This serializer does not use following mirage properties to control how things are serialized

\n
attrs - see `serialize` on the transform property\nembed - see `serialize` on the transform property\nserializeIds - see serialize on the transform property\n
\n

The above configuration was applied to every property on the serializer, whereas the transforms allows you\nto specify a value for each property or relation.

\n

This serializer uses a property transforms that follows the Ember Data serializer format of attrs to specify the\nserialization (attrs is already in use by mirageJs).

\n

The startMirage has been modified to also generate serializers from the Ember Data serializers supporting\nthe key and the serialize/deserialize properties with the value of (true/ids/records). If a serializer is\nalready present in the mirage directory, the transforms will be added to it. If that serializer is not\na serializer of this type, there will be no effect. Ensure that your serializers and/or the application\nserializer in the mirage directory is a type of this serializer

\n
","lineNumber":32,"access":"public","tags":[{"name":"constructor","value":""}],"file":"ember-cli-mirage/serializers/ember-data-serializer","type":"any","exportType":"default"}]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}}]} diff --git a/versions/master/ember-cli-addon-docs/search-index.json b/versions/master/ember-cli-addon-docs/search-index.json index 906d33996..86745da0c 100644 --- a/versions/master/ember-cli-addon-docs/search-index.json +++ b/versions/master/ember-cli-addon-docs/search-index.json @@ -1 +1 @@ -{"index":{"version":"2.3.9","fields":["title","text","keywords"],"fieldVectors":[["title/template:application",[]],["text/template:application",[0,3.205]],["keywords/template:application",[]],["title/template:blog",[]],["text/template:blog",[]],["keywords/template:blog",[]],["title/template:blog/detail",[]],["text/template:blog/detail",[1,0.544,2,1.89,3,4.505,4,2.045,5,5.549,6,2.869,7,5.549,8,5.549]],["keywords/template:blog/detail",[]],["title/template:blog/error",[9,1.592,10,2.303]],["text/template:blog/error",[9,3.199,10,4.628]],["keywords/template:blog/error",[]],["title/template:blog/index",[0,2.129]],["text/template:blog/index",[0,3.205]],["keywords/template:blog/index",[]],["title/template:docs",[]],["text/template:docs",[]],["keywords/template:docs",[]],["title/template:docs/advanced/customizing-the-inflector",[11,0.953,12,2.303]],["text/template:docs/advanced/customizing-the-inflector",[1,0.683,11,2.045,12,5.575,13,0.634,14,0.676,15,0.988,16,1.285,17,2.509,18,2.509,19,2.509,20,0.861,21,6.288,22,5.437,23,0.824,24,1.077,25,5.575,26,0.676,27,4.407,28,3.979,29,1.267,30,5.505,31,4.407,32,1.76,33,2.509,34,2.387,35,2.509,36,5.505,37,3.483,38,1.619,39,5.505,40,0.588,41,2.788,42,2.601,43,1.911,44,2.198,45,5.505,46,3.63,47,1.624,48,1.388,49,1.911,50,1.015,51,2.788,52,1.285,53,2.509,54,3.143,55,1.188,56,1.605,57,1.501,58,1.501,59,2.082,60,2.509,61,4.407,62,4.407,63,3.926,64,3.63,65,1.911,66,4.407,67,0.988,68,0.861,69,3.104,70,1.501,71,2.788,72,4.407,73,2.509,74,4.407,75,1.099,76,4.407,77,2.604,78,2.198,79,1.188,80,2.788,81,1.388,82,2.788,83,2.509,84,1.624,85,2.788,86,2.788,87,1.501,88,1.099,89,1.911,90,3.926,91,2.082,92,2.509,93,3.63]],["keywords/template:docs/advanced/customizing-the-inflector",[]],["title/template:docs/advanced/environment-options",[94,1.213,95,0.953]],["text/template:docs/advanced/environment-options",[1,0.702,4,1.822,13,0.543,14,0.775,15,0.995,23,0.92,24,0.995,26,0.827,33,2.814,35,2.123,38,1.333,40,0.619,44,1.489,56,1.087,67,0.669,73,2.123,77,1.617,81,1.557,83,2.814,92,2.123,94,2.837,95,2.011,96,2.093,97,1.557,98,5.2,99,2.123,100,5.2,101,1.616,102,1.616,103,3.668,104,2.228,105,1.102,106,1.059,107,3.526,108,1.791,109,3.729,110,3.729,111,1.006,112,1.374,113,1.27,114,5.2,115,3.071,116,2.556,117,2.359,118,1.928,119,0.792,120,3.071,121,3.071,122,3.955,123,4.567,124,3.071,125,2.123,126,2.814,127,3.071,128,2.144,129,2.123,130,2.66,131,3.526,132,2.144,133,2.66,134,2.66,135,2.359,136,3.324,137,2.359,138,1.084,139,0.93,140,2.359,141,2.336,142,1.974,143,1.374,144,1.974,145,1.087,146,1.762,147,2.123,148,1.087,149,4.943,150,1.495,151,1.928,152,3.509,153,3.729,154,1.489,155,2.123,156,1.928,157,1.617,158,0.729,159,3.729,160,3.071,161,3.729,162,3.729,163,3.729,164,1.557,165,3.071,166,2.123,167,1.928,168,3.729,169,3.729,170,3.729,171,2.79,172,2.123,173,1.684,174,2.66,175,2.359,176,2.359,177,4.071,178,1.374,179,2.359,180,1.087,181,3.071,182,1.762,183,1.232,184,4.943,185,3.071,186,2.359,187,3.729,188,3.729,189,3.729,190,0.859,191,3.071,192,2.66,193,3.729,194,1.762]],["keywords/template:docs/advanced/environment-options",[]],["title/template:docs/advanced/mocking-guids",[52,0.815,195,1.321]],["text/template:docs/advanced/mocking-guids",[1,0.698,11,1.902,13,0.659,14,0.553,23,0.675,24,0.809,26,0.553,29,1.038,40,0.442,50,1.46,52,1.768,59,2.13,67,0.809,69,2.331,70,1.536,96,1.902,97,1.42,139,1.512,150,1.216,195,2.638,196,6.339,197,1.955,198,3.713,199,4.509,200,5.467,201,2.567,202,3.216,203,3.713,204,2.853,205,1.911,206,1.383,207,2.23,208,4.509,209,2.638,210,2.066,211,3.713,212,4.122,213,3.713,214,2.853,215,6.065,216,3.216,217,4.509,218,4.509,219,2.421,220,1.536,221,2.638,222,1.801,223,2.331,224,2.567,225,4.521,226,1.42,227,4.509,228,6.065,229,4.509,230,4.509,231,4.509,232,5.583,233,3.713,234,4.509,235,4.509,236,3.713,237,4.598,238,2.421,239,4.509,240,4.509,241,4.509,242,4.509,243,4.509]],["keywords/template:docs/advanced/mocking-guids",[]],["title/template:docs/advanced/server-configuration",[56,0.815,105,0.502]],["text/template:docs/advanced/server-configuration",[1,0.7,11,1.04,13,0.582,14,0.789,15,1.119,20,0.977,23,1.009,24,1.028,26,0.779,29,1.481,40,0.68,44,1.22,48,0.962,55,0.824,56,1.457,57,1.04,67,1.096,68,1.283,70,1.703,75,1.246,78,2.492,79,0.824,88,1.075,91,1.443,101,1.257,103,1.739,105,1.138,106,0.548,108,0.89,111,1.163,112,1.126,113,1.04,116,3.158,125,1.739,128,1.325,134,3.076,135,3.163,136,3.662,137,3.163,138,1.271,139,1.246,140,3.163,148,0.89,158,0.597,164,0.962,166,1.739,167,2.23,171,2.362,172,2.846,173,1.469,178,1.126,179,2.729,180,1.257,181,2.516,182,1.443,183,0.762,190,0.703,194,1.443,206,0.916,220,1.469,223,1.579,244,2.19,245,1.621,246,2.516,247,2.516,248,1.579,249,1.216,250,1.257,251,3.076,252,1.933,253,2.584,254,1.739,255,3.076,256,3.055,257,3.055,258,3.055,259,3.552,260,2.179,261,3.055,262,2.846,263,1.22,264,3.076,265,2.516,266,1.359,267,2.516,268,1.325,269,1.933,270,1.722,271,3.055,272,1.22,273,3.552,274,1.443,275,0.962,276,2.179,277,1.04,278,3.055,279,2.179,280,3.055,281,2.516,282,3.055,283,3.055,284,2.516,285,1.04,286,1.126,287,2.516,288,3.055,289,3.055,290,1.933,291,2.179,292,1.589,293,2.179,294,1.443,295,3.055,296,1.739,297,2.516,298,3.055,299,3.055,300,1.589,301,3.055,302,2.179,303,1.933,304,1.933,305,1.126,306,3.552,307,2.179,308,2.179,309,2.179,310,1.739,311,3.055,312,1.842,313,1.443,314,1.22,315,2.516,316,2.179,317,2.516,318,1.22,319,3.552,320,3.055,321,1.443,322,1.579,323,1.579,324,2.516,325,2.516,326,2.516,327,2.516,328,1.443,329,2.516,330,1.04,331,1.443,332,2.179,333,4.117,334,3.163,335,1.151,336,4.999,337,2.516,338,1.797,339,3.552,340,1.933,341,2.179,342,1.739,343,1.933,344,1.443,345,1.739,346,2.846,347,3.565,348,2.455,349,1.739,350,1.325,351,1.22,352,3.055,353,3.877,354,1.325,355,3.163,356,2.516,357,2.891,358,1.579,359,2.516,360,3.055,361,3.055,362,3.055,363,3.055]],["keywords/template:docs/advanced/server-configuration",[]],["title/template:docs/advanced/simulating-cookie-responses",[144,0.892,364,1.272,365,1.84]],["text/template:docs/advanced/simulating-cookie-responses",[1,0.683,13,0.488,14,0.612,37,3.153,40,0.581,68,0.974,88,1.479,96,2.234,97,1.57,138,0.974,139,1.242,144,2.53,180,1.453,190,1.147,206,1.26,222,1.99,250,1.453,269,3.153,276,3.554,364,3.378,365,5.401,366,4.104,367,2.354,368,5.218,369,4.983,370,3.153,371,4.983,372,2.369,373,4.983,374,4.983,375,4.983,376,3.554,377,4.983,378,4.983,379,4.983,380,5.933,381,4.983,382,4.104,383,4.983,384,4.983,385,4.983,386,4.983,387,4.983,388,4.983,389,3.153,390,4.983,391,4.983,392,2.837,393,4.983]],["keywords/template:docs/advanced/simulating-cookie-responses",[]],["title/template:docs/advanced/switching-between-scenarios",[394,1.413,395,0.969,396,1.055]],["text/template:docs/advanced/switching-between-scenarios",[1,0.697,4,2.136,13,0.568,14,0.501,16,1.191,18,2.325,20,0.798,24,0.941,26,0.795,29,1.408,32,1.631,40,0.645,50,0.94,55,1.101,56,1.529,67,1.04,68,1.025,71,4.002,81,1.826,94,1.771,95,1.391,96,1.391,99,2.987,101,1.919,105,1.04,106,1.161,107,2.913,108,1.689,111,1.101,113,1.787,115,5.037,116,2.112,126,2.325,139,1.018,164,1.826,166,2.325,171,1.93,175,2.584,190,0.94,201,2.987,206,0.867,226,1.287,233,3.364,249,0.867,275,1.653,286,1.505,292,1.505,300,1.505,318,1.631,330,1.787,372,1.631,394,3.319,395,1.771,396,3.264,397,3.364,398,4.321,399,2.275,400,1.505,401,2.584,402,1.391,403,1.505,404,2.584,405,1.771,406,2.913,407,3.364,408,4.085,409,2.889,410,2.325,411,5.246,412,2.584,413,4.085,414,1.771,415,2.112,416,4.085,417,2.112,418,4.085,419,1.391,420,4.085,421,4.085,422,4.085,423,2.913,424,2.913,425,5.795,426,4.085,427,4.085,428,3.364,429,3.364,430,5.246,431,4.085,432,6.116,433,4.773,434,5.795,435,4.085,436,4.085,437,2.479,438,4.085,439,4.085,440,3.364,441,4.085,442,3.364,443,4.085,444,2.584]],["keywords/template:docs/advanced/switching-between-scenarios",[]],["title/template:docs/data-layer/database",[50,0.861]],["text/template:docs/data-layer/database",[1,0.698,6,2.154,13,0.624,14,0.652,15,1.105,16,1.214,24,0.747,26,0.511,38,1.433,40,0.521,50,1.569,52,1.214,58,1.419,67,0.747,69,2.154,70,1.419,89,1.807,97,1.313,102,1.214,105,0.747,106,0.747,126,2.372,128,1.807,138,1.143,139,1.039,141,1.968,142,1.664,146,1.968,147,2.372,150,1.716,152,2.636,158,0.814,180,1.549,190,0.959,198,3.431,202,2.972,204,2.636,205,2.005,206,0.885,207,2.122,226,1.843,245,1.039,250,1.705,263,1.664,270,1.664,274,1.968,275,1.313,292,1.535,312,2.156,313,1.968,331,1.968,335,1.223,367,1.968,372,2.46,399,1.807,400,1.535,409,2.51,415,2.154,437,1.968,445,4.166,446,1.664,447,2.636,448,3.431,449,2.372,450,2.972,451,4.166,452,2.154,453,2.51,454,2.372,455,2.271,456,1.958,457,2.636,458,2.122,459,2.972,460,1.807,461,1.968,462,2.972,463,2.537,464,2.05,465,2.122,466,3.025,467,3.025,468,2.372,469,4.166,470,1.968,471,1.419,472,1.535,473,1.419,474,3.431,475,1.664,476,2.636,477,4.166,478,2.372,479,2.636,480,2.972,481,2.636,482,4.166,483,2.372,484,1.807,485,1.807,486,2.764,487,4.166,488,4.166,489,5.313,490,5.313,491,4.166,492,4.166,493,4.166,494,2.636]],["keywords/template:docs/data-layer/database",[]],["title/template:docs/data-layer/factories",[495,1.274]],["text/template:docs/data-layer/factories",[1,0.705,2,2.181,3,2.093,4,0.832,9,0.76,11,0.455,13,0.627,14,0.424,15,0.957,16,0.389,20,0.755,23,0.779,24,0.693,25,1.099,26,0.753,29,1.412,32,1.172,40,0.46,47,1.272,48,1.64,50,1.165,52,0.389,54,1.611,55,1.266,57,0.769,58,0.769,60,0.76,65,0.579,67,1.108,68,0.441,70,0.455,71,0.844,75,1.261,77,0.579,79,1.13,81,0.711,83,0.76,87,0.455,88,1.113,90,0.952,91,1.067,94,0.579,96,1.599,97,0.42,99,1.286,101,1.302,104,1.176,105,0.957,106,1.108,108,1.588,111,1.266,112,1.082,113,0.455,118,0.69,119,0.89,128,1.497,132,0.579,133,2.093,138,0.261,139,1.113,141,1.387,142,0.533,145,1.302,146,1.387,148,1.126,150,0.931,154,1.783,156,1.167,157,1.497,158,0.956,164,0.42,167,0.69,172,1.286,173,1,176,0.844,178,0.832,183,1.298,186,1.857,190,0.795,194,0.631,197,0.579,202,0.952,205,1.848,206,0.89,207,1.542,209,1.067,210,1.723,219,0.579,220,1,222,1.172,223,0.69,224,1.286,226,1.68,238,0.979,244,1.856,245,1.59,249,1.157,253,0.69,260,0.952,262,0.76,264,0.952,266,0.711,270,1.674,275,1.217,277,0.455,279,0.952,285,1.176,286,0.492,291,0.952,293,0.952,294,1.387,296,1.671,297,1.099,300,1.423,303,1.429,304,0.844,305,0.832,308,0.952,309,0.952,310,1.286,313,1.631,314,0.533,315,1.099,318,1.953,321,1.387,322,1.167,323,0.69,324,5.294,328,1.631,330,2.129,335,0.307,340,0.844,344,2.31,346,0.76,349,0.76,350,1.497,351,1.542,372,0.533,382,1.099,394,1.429,396,2.31,397,1.099,399,1.818,400,1.272,402,1.315,403,1.082,404,0.844,409,1.387,412,1.429,414,0.979,417,1.785,419,1,433,2.844,437,1.824,442,3.18,446,0.533,447,0.844,452,1.517,455,0.492,456,0.832,458,0.533,461,0.631,463,2.777,464,2.017,465,1.783,470,0.631,471,1.723,472,1.545,473,1.773,475,0.533,478,0.76,483,1.671,484,1.273,485,1.273,486,1.387,494,0.844,495,2.27,496,0.76,497,3.452,498,0.844,499,2.417,500,1.611,501,1.167,502,1.335,503,3.861,504,1.099,505,0.952,506,0.952,507,0.533,508,1.335,509,1.429,510,1.335,511,1.335,512,1.981,513,0.844,514,1.785,515,1.674,516,1.802,517,1.335,518,0.844,519,1.335,520,0.952,521,1.517,522,1.966,523,2.185,524,3.677,525,0.952,526,1.335,527,1.857,528,2.417,529,1.099,530,1.099,531,1.099,532,2.391,533,1.167,534,3.608,535,2.258,536,3.348,537,2.754,538,0.902,539,1.335,540,1.429,541,1.099,542,2.258,543,1.335,544,1.335,545,0.952,546,0.69,547,1.099,548,2.463,549,3.512,550,0.69,551,1.86,552,1.335,553,1.86,554,1.067,555,1.611,556,1.335,557,2.463,558,3.375,559,2.185,560,1.86,561,2.258,562,1.335,563,1.335,564,2.417,565,2.258,566,1.335,567,1.335,568,1.429,569,0.844,570,1.099,571,0.952,572,1.335,573,1.335,574,1.335,575,1.335,576,1.335,577,1.335,578,1.335,579,3.094,580,1.273,581,1.099,582,2.417,583,1.857,584,2.652,585,1.335,586,1.611,587,2.258,588,1.099,589,0.952,590,3.861,591,1.335,592,1.335,593,1.335,594,1.335,595,1.86,596,1.335,597,1.335,598,1.335,599,1.335,600,1.335,601,1.335,602,1.335,603,1.335,604,1.335,605,2.194,606,0.844,607,1.335,608,3.677,609,1.099,610,1.86,611,0.952,612,1.86,613,1.335,614,1.167,615,1.335,616,1.517,617,1.335,618,2.825,619,1.335,620,2.258,621,0.76,622,0.631,623,5.798,624,2.615,625,0.69,626,1.335,627,0.952,628,1.335,629,1.335,630,0.844,631,1.335,632,1.335,633,2.258,634,0.844,635,0.579,636,1.099,637,0.952,638,1.335,639,0.952,640,0.952,641,3.185,642,0.69,643,2.704,644,1.335,645,4.89,646,3.453,647,2.417,648,3.452,649,1.335,650,1.099,651,1.099,652,1.335,653,4.694,654,0.631,655,0.952,656,1.172,657,1.099,658,0.952,659,1.286,660,3.861,661,0.631,662,1.335,663,2.935,664,0.952,665,0.69,666,0.579,667,2.258,668,1.335,669,1.335,670,1.286,671,1.517,672,1.335,673,1.335,674,0.76,675,1.86,676,1.099,677,0.69,678,1.335,679,4.694,680,2.093,681,2.093,682,1.86,683,2.258,684,2.258,685,2.258,686,0.844,687,1.335,688,0.952,689,2.935,690,1.335,691,1.335,692,1.335,693,2.258,694,1.429,695,2.258,696,2.935,697,0.76,698,1.335,699,1.099,700,1.099,701,1.335,702,1.335,703,0.76,704,1.335,705,0.76,706,1.099,707,1.611,708,2.258,709,1.335,710,1.335,711,1.335,712,1.099,713,1.335,714,0.952,715,1.335,716,1.335,717,1.335,718,1.335,719,1.335,720,3.453,721,1.335,722,1.335,723,1.099,724,0.844,725,0.844,726,1.335,727,1.671,728,1.335,729,0.979,730,1.335,731,0.844,732,2.093,733,1.099,734,0.844,735,0.844,736,0.952,737,1.099,738,1.099,739,0.631,740,1.099,741,0.952,742,0.69,743,0.952,744,1.335,745,1.335,746,0.952,747,1.099,748,1.335,749,0.844,750,1.099,751,1.335,752,0.952,753,1.335,754,1.335,755,2.935,756,2.258,757,2.258,758,2.258,759,1.099,760,0.76,761,1.335,762,0.844,763,1.335,764,1.099,765,1.099,766,1.099,767,0.952,768,0.844,769,1.099,770,0.952,771,1.099,772,1.335,773,1.335,774,1.099]],["keywords/template:docs/data-layer/factories",[]],["title/template:docs/data-layer/fixtures",[323,1.933]],["text/template:docs/data-layer/fixtures",[1,0.705,2,1.754,4,1.726,11,0.926,13,0.641,14,0.672,15,1.085,20,0.532,23,0.924,26,0.789,28,1.721,32,1.585,34,2.233,40,0.604,43,1.18,47,1.726,48,0.857,50,1.261,55,0.733,56,0.793,57,0.926,65,1.18,67,1.152,75,1.685,79,0.733,84,1.002,87,1.351,88,0.678,101,1.827,102,0.793,106,0.712,108,0.793,111,0.733,119,0.578,129,1.549,132,1.721,145,1.596,148,1.157,150,1.263,154,1.585,156,1.406,164,1.25,183,1.563,195,1.285,200,2.24,201,1.549,205,2.12,206,0.995,209,1.285,210,1.351,220,1.351,222,1.585,226,1.25,245,0.989,249,0.578,266,1.476,270,1.086,275,1.25,286,1.002,305,2.274,312,1.002,314,1.086,321,1.285,322,2.422,323,3.48,330,1.351,335,1.079,338,1.07,345,1.549,359,2.24,399,1.18,401,1.721,402,0.926,409,1.285,412,2.511,419,0.926,437,2.213,446,1.086,455,1.726,456,1.726,459,1.94,461,1.285,462,1.94,464,1.622,470,2.701,471,2.188,472,1.462,473,1.351,483,1.549,484,1.18,485,1.18,486,1.285,495,1.595,515,1.585,521,2.662,523,2.964,529,2.24,532,1.086,546,1.406,554,1.285,558,1.721,559,1.721,580,1.18,588,2.24,605,1.18,616,1.406,618,1.721,622,2.788,630,1.721,634,1.721,635,1.721,636,3.268,637,2.83,643,2.213,661,1.285,666,1.18,676,2.24,727,2.667,729,1.18,738,2.24,742,1.406,749,2.511,760,1.549,775,2.72,776,2.259,777,3.968,778,2.72,779,2.24,780,2.72,781,2.72,782,1.94,783,4.509,784,3.968,785,3.968,786,2.051,787,1.721,788,1.94,789,2.72,790,2.24,791,2.24,792,2.72,793,6.268,794,2.72,795,2.72,796,2.72,797,5.149,798,2.72,799,2.72,800,2.72,801,2.72,802,2.72,803,2.72,804,2.72,805,2.72,806,2.72,807,2.72,808,2.72,809,2.72,810,2.72,811,2.72,812,2.72,813,2.72,814,2.72,815,3.268,816,3.341,817,2.72,818,2.24,819,1.875,820,4.684,821,2.24,822,1.549,823,2.72,824,2.24,825,2.72,826,2.72,827,2.72,828,2.72,829,2.24,830,2.24,831,2.422,832,3.968,833,5.716,834,2.24,835,5.149,836,2.72,837,2.662,838,4.241,839,5.149,840,3.905,841,2.72,842,1.002,843,1.721,844,2.259,845,1.18,846,2.72,847,2.72,848,1.285,849,3.968,850,3.968,851,1.721,852,1.721,853,2.72,854,1.721,855,2.24,856,2.72,857,2.24,858,2.24,859,1.721,860,3.268,861,2.72,862,2.24,863,2.72,864,2.24,865,2.72]],["keywords/template:docs/data-layer/fixtures",[]],["title/template:docs/data-layer/models",[23,0.56]],["text/template:docs/data-layer/models",[1,0.688,2,1.699,6,1.953,13,0.621,14,0.757,15,1.001,16,1.454,19,2.151,20,0.974,23,1.051,24,0.895,26,0.685,28,2.391,29,0.87,38,1.019,40,0.605,49,2.574,52,1.101,65,1.639,67,1.001,70,1.287,75,0.942,77,1.639,87,1.287,97,1.571,101,1.454,104,1.287,105,0.895,118,1.953,119,1.059,138,0.974,139,1.243,145,1.454,146,1.785,148,1.101,150,1.345,158,0.974,173,1.287,176,3.155,178,1.393,180,1.454,182,1.785,183,1.538,210,1.287,212,2.391,220,2.159,244,1.287,245,1.611,248,1.953,249,1.346,250,1.454,255,2.695,263,1.509,272,1.991,277,1.287,292,1.838,294,1.785,300,1.393,312,2.057,318,1.509,328,1.785,338,1.019,342,2.151,350,1.639,354,1.639,372,2.37,395,1.639,402,1.287,403,1.393,409,2.356,410,2.151,419,1.287,437,2.356,455,1.838,456,1.393,458,2.229,460,1.639,464,1.571,474,3.112,475,1.509,495,1.699,500,2.695,507,1.509,514,2.578,515,1.509,522,2.151,527,3.532,546,1.953,614,3.069,640,2.695,647,3.112,656,1.991,665,1.953,680,2.695,681,2.695,682,3.112,686,2.391,697,2.151,831,1.953,844,2.151,851,3.155,866,2.151,867,3.778,868,2.695,869,3.778,870,3.778,871,3.112,872,3.112,873,2.695,874,1.393,875,2.695,876,2.695,877,2.391,878,3.112,879,2.886,880,3.778,881,2.391,882,2.391,883,3.778,884,3.112,885,3.778,886,3.778,887,3.778,888,3.112,889,3.778,890,3.112,891,3.778,892,3.778,893,3.155,894,3.112,895,3.532,896,3.112,897,3.778,898,3.778,899,4.987,900,3.778,901,3.778,902,3.778,903,3.778,904,3.557,905,3.778,906,3.778,907,3.778,908,2.391,909,3.778,910,2.391]],["keywords/template:docs/data-layer/models",[]],["title/template:docs/data-layer/orm",[455,1.378]],["text/template:docs/data-layer/orm",[1,0.707,13,0.558,14,0.546,15,1.157,16,0.595,20,1.046,23,0.991,24,0.573,26,0.593,29,1.024,32,0.815,37,1.292,38,1.381,40,0.618,43,1.706,47,1.887,48,1.006,49,0.885,50,1.275,55,0.551,56,0.595,57,1.088,58,1.34,60,1.162,67,0.798,70,0.695,73,1.818,75,1.381,79,0.861,80,1.292,81,0.643,84,0.752,86,1.292,87,0.695,88,1.276,89,1.385,96,0.695,97,0.643,101,0.595,102,0.595,104,0.695,105,0.706,111,0.551,112,1.64,113,0.695,119,1.176,138,1.159,139,1.204,143,0.752,144,2.045,145,0.931,148,1.56,150,1.061,151,1.651,158,0.399,164,1.239,173,1.088,178,1.177,180,1.56,182,2.102,183,1.608,190,0.735,192,3.173,195,1.509,197,0.885,205,2.114,206,0.433,207,1.571,210,1.515,212,2.021,219,0.885,221,1.509,236,2.63,238,0.885,244,1.515,245,1.276,249,1.087,250,1.73,263,0.815,266,0.643,270,0.815,277,1.088,286,0.752,292,1.177,305,1.887,307,1.456,312,0.752,313,0.964,318,1.275,321,0.964,328,1.858,330,0.695,335,0.47,338,1.381,345,1.162,348,1.818,350,0.885,358,2.034,367,1.509,370,1.292,394,1.292,395,0.885,400,0.752,402,0.695,403,1.177,405,0.885,410,1.162,419,1.515,446,1.571,449,1.162,453,0.964,455,2.325,456,0.752,458,0.815,460,1.385,462,1.456,463,2.83,464,2.004,465,2.273,466,1.162,467,1.162,471,2.107,472,1.64,473,1.515,475,0.815,476,2.021,496,1.162,497,1.681,498,1.292,501,1.055,505,1.456,507,1.275,509,1.292,512,1.509,513,1.292,515,2.137,516,0.752,520,2.278,521,2.034,527,1.292,532,2.496,534,3.816,536,3.652,537,3.652,538,0.815,550,1.055,586,1.456,605,1.929,606,2.489,608,4.217,609,1.681,610,3.24,611,1.456,612,4.795,614,2.647,616,2.034,621,1.162,622,1.858,635,0.885,642,1.651,643,0.964,650,1.681,654,2.102,656,1.571,658,1.456,659,1.818,661,1.858,666,0.885,674,1.162,688,1.456,694,1.292,697,1.818,703,1.162,727,1.818,729,1.385,739,0.964,760,1.818,762,1.292,770,1.456,819,2.281,842,1.64,843,1.292,844,1.162,845,2.469,848,1.509,857,1.681,859,1.292,860,1.681,866,1.162,874,1.177,884,1.681,890,1.681,911,2.278,912,1.681,913,2.041,914,2.021,915,2.021,916,2.041,917,2.041,918,2.041,919,1.681,920,1.681,921,1.681,922,1.681,923,2.041,924,2.041,925,3.934,926,1.651,927,1.818,928,3.194,929,2.041,930,3.055,931,3.194,932,3.194,933,2.041,934,1.292,935,5.12,936,5.12,937,5.12,938,2.041,939,2.041,940,3.194,941,2.041,942,1.681,943,2.041,944,2.041,945,2.041,946,2.041,947,1.456,948,1.681,949,3.194,950,5.537,951,3.194,952,3.816,953,2.041,954,1.681,955,2.278,956,2.806,957,2.278,958,1.456,959,2.278,960,2.041,961,1.456,962,2.63,963,3.194,964,1.681,965,2.041,966,1.456,967,3.194,968,1.681,969,1.162,970,2.278,971,2.63,972,1.681,973,1.292,974,1.456,975,1.055,976,2.041,977,2.041,978,2.041,979,3.194,980,2.041,981,1.456,982,2.041,983,1.681,984,2.041,985,1.055,986,1.681,987,2.041,988,3.934,989,3.934,990,3.934,991,3.934,992,3.194,993,3.194,994,3.934,995,3.934,996,1.681,997,2.041,998,2.041,999,2.041,1000,2.041,1001,2.041,1002,2.041,1003,1.681,1004,2.041,1005,2.041,1006,2.041,1007,1.162]],["keywords/template:docs/data-layer/orm",[]],["title/template:docs/data-layer/relationships",[183,0.932]],["text/template:docs/data-layer/relationships",[0,1.501,1,0.705,2,1.321,3,4.705,11,0.898,13,0.53,14,0.324,15,0.696,16,1.131,17,1.501,20,0.899,23,1.025,24,0.91,26,0.804,29,1.168,32,1.053,40,0.451,47,1.43,48,0.831,49,2.2,50,0.607,52,0.769,59,1.246,63,1.881,65,1.144,67,1.176,75,1.147,78,1.838,79,0.711,80,1.669,82,1.669,84,1.43,87,0.898,88,0.967,90,1.881,91,1.833,95,1.567,96,1.567,102,0.769,104,1.567,111,0.711,119,0.824,126,1.501,130,2.767,147,2.208,154,1.838,164,1.598,173,1.321,178,0.972,179,1.669,180,0.769,183,1.663,205,1.703,206,1.34,207,1.053,220,2.043,221,1.246,222,1.549,224,1.501,245,1.147,248,1.363,249,1.273,254,1.501,266,0.831,272,1.053,274,2.174,275,1.598,285,1.926,292,1.43,296,2.208,300,1.43,305,1.696,314,1.053,321,2.94,322,3.301,330,1.321,335,0.893,338,1.046,342,1.501,350,2.2,351,1.838,354,1.682,395,1.144,403,0.972,405,1.144,419,0.898,452,1.363,455,0.972,456,0.972,457,1.669,458,1.053,460,1.144,464,1.222,471,1.728,472,1.993,473,1.567,495,0.898,514,1.363,515,1.053,521,3.388,538,1.053,580,1.144,605,1.682,614,2.006,616,1.363,622,2.174,635,2.2,639,1.881,641,1.881,643,2.94,651,3.195,656,2.258,657,2.172,665,1.363,666,1.682,670,2.62,677,1.363,680,2.767,681,2.767,714,1.881,729,1.144,739,1.833,822,1.501,831,3.334,834,2.172,840,1.881,844,2.889,845,2.601,851,1.669,852,1.669,854,1.669,859,3.577,877,2.454,878,3.79,879,1.363,910,1.669,926,1.363,981,1.881,1008,2.637,1009,2.172,1010,2.637,1011,1.881,1012,5.074,1013,4.601,1014,2.637,1015,2.637,1016,3.879,1017,2.637,1018,2.637,1019,2.637,1020,2.637,1021,3.79,1022,2.637,1023,3.79,1024,2.637,1025,4.814,1026,2.637,1027,2.637,1028,2.637,1029,3.879,1030,4.601,1031,2.637,1032,2.637,1033,2.637,1034,2.637,1035,2.637,1036,2.454,1037,5.406,1038,2.637,1039,2.637,1040,4.601,1041,2.637,1042,2.637,1043,1.669,1044,3.879,1045,3.879,1046,2.637,1047,2.637,1048,2.637,1049,3.879,1050,2.637,1051,5.845,1052,2.172,1053,3.879,1054,2.637,1055,2.637,1056,2.637,1057,2.637,1058,2.637,1059,1.881,1060,2.637,1061,2.637,1062,2.637,1063,2.637,1064,2.637,1065,2.637,1066,3.879,1067,3.879,1068,3.879,1069,2.637,1070,2.637,1071,2.637,1072,2.637,1073,2.637,1074,2.637,1075,2.637,1076,2.637,1077,3.879,1078,2.637,1079,3.879,1080,1.363]],["keywords/template:docs/data-layer/relationships",[]],["title/template:docs/data-layer/serializers/ember-data-serializer",[]],["text/template:docs/data-layer/serializers/ember-data-serializer",[1,0.667,13,0.661,14,0.767,15,1.155,19,2.467,20,0.847,23,0.936,24,0.778,26,0.731,29,1.254,40,0.667,47,1.597,67,0.977,68,1.221,75,1.08,78,2.175,105,0.977,119,1.157,145,1.263,148,1.263,197,1.879,204,3.447,205,2.029,238,1.879,266,2.029,268,1.879,269,2.742,286,2.196,305,2.303,314,1.731,338,1.86,340,3.447,344,2.047,346,2.467,347,4.458,348,3.842,350,2.974,351,1.731,354,2.584,355,3.447,357,4.317,367,2.047,400,1.597,419,1.476,538,1.731,582,5.148,659,2.467,852,2.742,874,2.196,1007,2.467,1025,3.569,1081,3.885,1082,4.334,1083,3.569,1084,3.569,1085,4.334,1086,6.25,1087,5.447,1088,3.569,1089,4.334,1090,3.569,1091,4.334,1092,4.334]],["keywords/template:docs/data-layer/serializers/ember-data-serializer",[]],["title/template:docs/data-layer/serializers/index",[338,1.008]],["text/template:docs/data-layer/serializers/index",[1,0.702,9,1.43,11,1.96,13,0.649,14,0.791,15,1.12,16,1.444,17,2.13,20,0.968,23,0.885,24,0.802,26,0.742,29,1.325,34,1.09,38,1.498,40,0.519,42,1.187,44,1.494,48,0.791,49,2.298,52,0.732,54,1.792,55,0.677,57,0.856,58,1.275,67,0.997,68,0.491,70,2.014,75,1.115,79,0.677,80,2.83,84,1.379,86,1.59,87,0.856,88,1.321,89,1.623,95,0.856,101,0.732,102,0.732,103,1.43,104,0.856,106,0.451,111,0.677,113,0.856,119,1.052,121,2.069,125,1.43,138,1.035,139,1.474,144,1.494,145,1.544,146,1.187,147,2.13,148,1.304,150,1.429,151,2.312,154,1.003,155,1.43,157,1.09,158,1.181,180,0.732,182,1.187,183,1.435,185,2.069,186,1.59,190,0.862,197,1.09,205,1.904,206,0.533,210,1.275,211,3.683,213,2.069,219,1.623,220,1.275,221,1.768,244,1.523,245,0.933,248,1.299,249,1.125,250,1.544,254,1.43,263,1.003,270,1.003,272,1.003,275,1.179,285,1.275,286,1.379,300,1.379,304,2.368,309,3.534,310,1.43,312,0.926,313,1.187,318,1.003,331,1.187,335,1.22,338,1.879,340,1.59,341,1.792,342,1.43,344,1.187,347,1.792,348,2.13,351,1.494,354,1.09,355,1.59,357,1.684,358,2.872,370,1.59,372,1.003,400,1.379,402,1.275,403,1.826,417,1.299,419,0.856,446,1.786,450,1.792,453,1.187,456,0.926,457,1.59,463,2.621,464,1.409,465,1.979,468,2.13,470,1.187,471,1.805,472,0.926,473,0.856,481,1.59,496,1.43,507,2.298,512,2.113,515,1.494,516,1.379,532,1.979,533,1.299,534,1.792,546,1.299,568,1.59,580,1.09,581,2.069,583,1.59,605,2.298,614,1.299,616,1.299,624,2.562,625,1.299,635,1.623,654,1.187,658,1.792,661,2.341,665,2.312,666,1.09,670,1.43,671,1.299,729,1.09,733,2.069,739,1.187,743,1.792,762,2.368,768,2.368,776,1.43,819,2.855,821,2.069,829,2.069,837,1.299,842,0.926,845,2.496,851,1.59,874,2.301,879,1.935,881,2.368,893,1.59,894,2.069,895,2.368,908,1.59,911,2.669,914,1.59,915,2.368,919,2.069,920,2.069,926,1.935,927,2.821,952,3.19,955,1.792,957,1.792,969,1.43,972,2.069,973,2.368,974,2.669,975,2.872,985,1.935,1043,1.59,1080,2.312,1081,2.669,1093,2.512,1094,2.069,1095,4.081,1096,2.069,1097,2.512,1098,2.512,1099,2.069,1100,2.512,1101,2.069,1102,2.512,1103,3.082,1104,2.512,1105,2.512,1106,2.512,1107,1.792,1108,1.792,1109,2.069,1110,2.512,1111,1.792,1112,2.512,1113,2.069,1114,2.512,1115,2.512,1116,2.512,1117,4.472,1118,3.742,1119,2.512,1120,2.512,1121,2.069,1122,2.512,1123,2.512,1124,2.512,1125,2.069,1126,2.069,1127,2.512,1128,2.512,1129,2.669,1130,2.512,1131,2.069,1132,3.683,1133,2.512,1134,2.069,1135,2.069,1136,3.082,1137,2.069,1138,2.512,1139,2.512,1140,2.512,1141,2.069,1142,2.069,1143,2.512,1144,2.512,1145,2.512,1146,2.069,1147,2.368,1148,3.082,1149,3.742,1150,3.742,1151,2.069,1152,2.512,1153,2.512,1154,2.512,1155,2.512,1156,2.512,1157,2.512,1158,2.512]],["keywords/template:docs/data-layer/serializers/index",[]],["title/module:ember-cli-mirage/ember-data",[1159,4.312]],["text/module:ember-cli-mirage/ember-data",[]],["keywords/module:ember-cli-mirage/ember-data",[136,0.103,353,0.154]],["title/module:ember-cli-mirage/serializers/ember-data-serializer",[1160,4.312]],["text/module:ember-cli-mirage/serializers/ember-data-serializer",[]],["keywords/module:ember-cli-mirage/serializers/ember-data-serializer",[357,0.223]],["title/template:docs/getting-started/installation",[569,2.366]],["text/template:docs/getting-started/installation",[1,0.441,13,0.546,14,0.834,16,1.311,20,0.879,26,0.552,38,1.503,40,0.682,56,1.766,78,1.795,81,1.995,82,3.527,84,2.054,88,1.121,94,1.95,99,2.56,105,1,108,1.766,112,1.657,119,1.286,122,3.207,128,1.95,142,1.795,155,3.449,158,1.184,164,1.756,166,2.56,171,2.124,174,3.207,175,2.845,201,3.173,210,1.531,223,2.324,251,4.32,268,1.95,276,3.207,277,1.898,292,2.232,330,2.063,343,2.845,376,3.975,392,2.56,402,1.531,403,1.657,423,3.207,461,2.124,479,2.845,569,4.119,580,1.95,627,3.207,661,2.633,664,3.207,665,2.324,822,2.56,837,2.324,1009,3.703,1161,4.59,1162,5.573,1163,4.496,1164,4.496,1165,4.496,1166,4.496,1167,6.057,1168,3.703,1169,4.496,1170,4.496,1171,4.496,1172,4.496,1173,4.496,1174,4.496,1175,4.496,1176,6.634,1177,2.845,1178,4.496,1179,3.703,1180,3.527,1181,3.975,1182,4.496,1183,4.496]],["keywords/template:docs/getting-started/installation",[]],["title/template:docs/getting-started/overview",[1184,3.079]],["text/template:docs/getting-started/overview",[1,0.706,2,0.623,4,1.348,6,1.513,11,1.246,13,0.61,14,0.707,15,1.179,19,1.041,20,0.954,23,0.914,24,0.75,26,0.674,29,1.226,32,0.73,33,1.666,34,0.793,38,1.552,40,0.638,42,1.382,43,1.984,44,1.827,47,1.541,48,0.922,50,1.371,51,1.157,52,0.533,53,1.041,55,1.128,57,1.246,58,1.814,59,0.864,67,0.92,68,0.954,69,0.945,73,1.666,75,1.405,79,1.316,84,1.078,87,1.425,88,1.405,89,1.814,91,0.864,96,0.997,101,1.219,102,0.533,105,0.956,106,0.876,108,1.219,111,0.789,112,1.799,116,0.945,117,1.157,119,0.888,124,1.505,125,1.041,128,1.269,129,1.041,132,0.793,138,1.279,139,1.484,142,0.73,143,0.674,144,2.127,145,1.334,147,1.666,148,1.423,150,1.436,151,1.513,156,0.945,157,1.587,158,0.954,160,2.41,165,1.505,171,0.864,172,2.083,173,1.246,178,1.348,180,1.334,183,1.217,190,0.842,192,1.304,194,1.382,195,0.864,197,1.269,204,1.157,205,1.813,206,1.131,207,1.169,209,0.864,210,1.425,216,1.304,219,0.793,220,0.997,222,0.73,224,1.041,226,0.922,237,1.505,238,0.793,244,1.663,245,1.328,249,0.888,250,1.845,252,1.157,255,1.304,262,2.083,263,0.73,268,0.793,270,0.73,272,1.461,274,0.864,275,0.922,277,1.246,284,1.505,286,0.674,294,0.864,305,1.078,308,1.304,312,0.674,314,1.169,318,1.461,321,1.382,322,1.513,328,1.382,331,0.864,334,1.157,335,1.18,338,1.481,343,1.157,344,0.864,350,0.793,351,0.73,355,1.157,358,0.945,364,2.083,370,1.851,372,0.73,395,0.793,396,0.864,399,1.587,401,1.157,402,1.246,404,1.157,409,1.382,414,1.269,415,0.945,419,0.623,437,0.864,446,1.461,447,2.315,448,1.505,449,1.041,452,2.524,453,0.864,454,1.041,455,0.674,456,1.348,460,0.793,461,1.382,463,2.86,464,1.775,465,1.949,466,1.041,467,1.041,468,1.666,471,2.027,472,1.686,473,1.425,475,0.73,484,1.587,485,1.587,486,1.729,495,1.746,498,1.157,501,0.945,507,1.461,512,1.976,515,1.67,516,0.674,518,1.157,520,2.087,521,1.892,522,1.041,523,1.157,524,1.505,528,1.505,532,2.127,538,1.169,540,1.157,545,1.304,546,1.513,547,1.505,548,1.304,549,1.157,550,0.945,551,1.505,554,1.729,555,1.304,557,1.304,568,1.157,579,1.157,584,1.157,589,1.304,605,1.814,616,0.945,618,1.157,622,0.864,624,0.945,625,0.945,634,1.851,635,1.269,642,1.513,643,1.729,654,0.864,655,1.304,656,1.169,666,0.793,671,0.945,677,0.945,686,1.157,697,1.041,705,1.041,706,1.505,707,1.304,724,1.157,725,1.157,727,2.083,729,1.587,731,1.157,734,1.157,735,1.157,742,1.513,752,2.087,759,1.505,766,1.505,771,1.505,787,1.851,818,1.505,819,2.306,831,1.892,837,0.945,842,0.674,845,2.223,848,1.382,862,1.505,864,1.505,866,1.041,873,3.264,874,0.674,875,1.304,876,2.087,908,1.157,911,2.61,915,2.315,926,1.513,927,2.083,930,1.157,934,1.851,956,1.304,958,1.304,962,1.505,964,1.505,968,1.505,973,1.157,975,1.892,985,0.945,996,1.505,1080,0.945,1094,2.41,1095,3.013,1099,1.505,1108,1.304,1109,1.505,1125,2.41,1126,1.505,1132,1.505,1134,1.505,1135,2.41,1137,1.505,1147,1.157,1184,1.505,1185,1.828,1186,1.505,1187,2.41,1188,4.183,1189,1.828,1190,1.828,1191,1.828,1192,1.828,1193,1.304,1194,1.828,1195,1.828,1196,1.505,1197,1.828,1198,1.828,1199,1.828,1200,1.828,1201,1.505,1202,4.576,1203,3.013,1204,1.828,1205,2.41,1206,1.828,1207,1.828,1208,4.576,1209,4.576,1210,2.926,1211,2.926,1212,1.828,1213,1.828,1214,1.304,1215,1.157,1216,0.945,1217,1.041,1218,1.304,1219,1.157,1220,1.304,1221,1.157,1222,2.61,1223,1.828,1224,1.828,1225,1.828,1226,2.087,1227,1.304,1228,1.505,1229,1.828,1230,1.505,1231,1.828,1232,1.828,1233,1.828,1234,2.41,1235,2.926,1236,1.828,1237,1.828,1238,1.828,1239,3.659,1240,2.926,1241,2.926,1242,2.926,1243,2.926,1244,1.828,1245,1.828,1246,1.828,1247,2.41,1248,1.304,1249,1.505,1250,1.505,1251,2.926,1252,1.828,1253,1.828,1254,1.828,1255,1.828,1256,1.828,1257,1.828,1258,2.926,1259,1.505,1260,3.659,1261,1.828,1262,1.505,1263,1.304,1264,1.304,1265,1.157,1266,1.505,1267,1.505,1268,1.828,1269,1.828,1270,1.304,1271,1.505,1272,1.157,1273,1.304,1274,1.828,1275,2.926,1276,1.828,1277,1.828,1278,1.505,1279,2.41,1280,1.828,1281,1.828,1282,1.304,1283,1.828]],["keywords/template:docs/getting-started/overview",[]],["title/template:docs/getting-started/upgrade-guide/index",[52,0.815,316,1.995]],["text/template:docs/getting-started/upgrade-guide/index",[0,0.752,1,0.697,2,1.811,4,1.074,6,1.157,9,1.953,13,0.636,14,0.637,15,1.05,16,1.215,18,1.659,19,0.752,20,1.061,23,0.953,24,0.402,26,0.733,28,1.417,29,1.452,32,1.163,33,0.752,34,0.971,35,1.275,37,0.836,38,1.035,40,0.642,42,2.45,43,1.263,44,0.894,46,1.844,47,1.638,48,1.081,49,2.027,50,1.121,51,0.836,52,1.512,53,2.185,55,0.604,56,0.385,57,1.168,58,0.45,59,0.624,60,1.275,64,1.088,65,1.263,67,0.974,68,0.913,70,0.45,73,0.752,75,1.354,77,0.573,78,1.945,79,1.198,81,0.705,83,0.752,84,1.415,85,1.417,86,0.836,87,0.45,88,1.423,93,1.088,94,0.573,95,0.763,96,1.168,97,0.416,99,0.752,101,1.512,102,0.385,104,1.168,105,0.748,106,0.237,107,0.942,108,0.653,111,0.356,112,2.256,113,1.592,114,1.088,116,1.157,117,1.417,119,1.129,125,1.275,126,0.752,128,1.488,129,0.752,131,1.597,132,0.573,135,0.836,136,2.056,137,0.836,138,1.039,139,1.379,140,0.836,142,0.528,143,0.487,145,1.215,148,1,150,1.035,151,2.748,154,1.163,155,1.275,157,1.263,158,0.815,164,1.314,166,2.185,167,0.683,171,1.97,173,1.168,174,0.942,175,1.417,177,1.844,178,0.825,180,1.119,183,1.442,190,1.076,191,1.088,194,0.624,197,0.971,201,1.275,205,1.472,206,0.885,209,0.624,210,1.42,212,1.417,214,1.417,216,0.942,220,1.307,221,1.376,222,0.894,223,1.985,226,1.081,238,0.573,244,1.513,245,0.855,249,0.943,250,1.295,251,0.942,253,0.683,259,1.088,262,2.185,264,0.942,266,0.416,267,1.088,268,0.971,270,0.528,272,1.163,273,1.088,274,0.624,275,0.416,277,1.168,279,1.597,281,1.088,285,0.45,287,1.088,290,0.836,292,1.074,293,1.597,294,1.058,296,1.275,300,1.415,303,1.417,305,2.073,307,0.942,310,1.275,312,1.415,313,1.058,314,1.37,316,4.012,317,1.088,318,1.163,321,1.814,322,1.506,323,1.985,325,1.088,326,1.088,327,3.66,328,1.376,329,1.088,330,0.992,331,1.376,332,0.942,335,0.96,338,1.464,341,2.738,342,1.275,343,3.436,345,1.659,346,1.275,348,0.752,349,0.752,350,1.665,351,0.894,354,0.573,356,1.088,358,1.773,366,1.088,367,0.624,389,2.17,392,0.752,395,0.573,399,0.971,400,1.415,402,0.992,403,1.074,405,0.573,406,2.078,419,1.592,424,1.597,440,1.088,444,0.836,446,1.37,447,0.836,454,1.659,455,1.537,459,0.942,460,1.488,461,1.376,470,0.624,471,1.766,472,0.487,473,0.992,475,1.163,476,0.836,481,1.417,495,1.811,496,0.752,501,1.773,505,1.597,506,0.942,507,0.528,509,1.417,513,0.836,514,0.683,516,1.074,518,0.836,521,1.985,522,1.275,525,1.597,532,1.163,538,0.528,545,1.597,546,0.683,549,1.417,550,0.683,554,0.624,555,1.597,559,0.836,560,4.473,568,0.836,569,2.957,570,2.825,571,2.738,580,0.573,584,0.836,589,0.942,595,1.844,605,1.927,621,0.752,622,2.208,624,0.683,625,1.157,627,1.597,634,1.417,635,0.573,637,1.597,642,1.157,643,0.624,648,2.825,654,1.058,655,0.942,656,1.774,659,0.752,661,0.624,664,1.597,670,1.275,671,0.683,674,0.752,677,1.157,686,0.836,688,1.597,694,0.836,705,0.752,707,0.942,714,0.942,725,0.836,731,2.811,742,1.157,743,0.942,746,0.942,747,1.844,749,0.836,764,1.088,768,0.836,770,0.942,776,0.752,783,1.844,786,1.773,788,0.942,790,2.399,791,2.399,815,2.825,816,2.446,819,1.814,831,2.681,837,0.683,840,0.942,842,0.825,843,1.417,845,1.665,848,1.058,852,1.843,854,0.836,855,1.088,858,1.844,859,1.417,866,1.659,873,0.942,874,0.487,876,0.942,877,1.417,882,0.836,896,1.844,904,0.942,908,0.836,914,0.836,921,1.088,926,0.683,927,2.53,934,1.843,947,1.597,952,1.597,955,1.597,966,0.942,969,0.752,973,1.417,974,0.942,975,2.416,983,1.088,985,1.157,1003,1.088,1007,1.953,1011,0.942,1021,3.66,1036,1.417,1043,1.417,1052,1.088,1059,0.942,1081,1.597,1083,1.088,1084,1.088,1088,1.844,1090,1.088,1103,1.088,1108,2.078,1111,1.597,1131,1.844,1136,3.849,1141,1.088,1142,1.088,1161,1.844,1177,1.843,1180,0.836,1187,1.088,1201,1.844,1203,1.844,1205,1.844,1216,1.773,1217,0.752,1248,0.942,1259,1.088,1265,1.417,1273,0.942,1284,4.17,1285,2.913,1286,2.239,1287,2.913,1288,2.239,1289,4.443,1290,1.088,1291,3.838,1292,1.088,1293,1.321,1294,3.838,1295,1.321,1296,2.399,1297,1.321,1298,1.321,1299,3.838,1300,1.321,1301,1.321,1302,1.321,1303,1.321,1304,2.239,1305,3.161,1306,0.942,1307,1.321,1308,2.239,1309,3.43,1310,1.321,1311,1.321,1312,1.088,1313,2.239,1314,1.321,1315,1.321,1316,1.321,1317,1.321,1318,2.239,1319,1.321,1320,1.321,1321,1.321,1322,1.088,1323,1.321,1324,2.913,1325,3.43,1326,1.321,1327,1.321,1328,2.913,1329,2.913,1330,2.239,1331,3.838,1332,1.321,1333,2.239,1334,3.43,1335,3.43,1336,1.321,1337,1.321,1338,1.321,1339,1.321,1340,1.321,1341,2.239,1342,1.321,1343,2.239,1344,1.321,1345,1.321,1346,1.088,1347,1.321,1348,1.321,1349,4.17,1350,1.321,1351,2.239,1352,1.321,1353,1.597,1354,1.088,1355,3.43,1356,2.239,1357,1.321,1358,1.321,1359,1.321,1360,1.321,1361,1.321,1362,1.321,1363,1.321,1364,1.321,1365,2.239,1366,2.913,1367,2.239,1368,1.321,1369,1.321,1370,1.321,1371,1.321,1372,1.321,1373,1.321,1374,2.239,1375,2.239,1376,2.239,1377,1.321,1378,1.321,1379,1.844,1380,1.321,1381,1.321,1382,1.088,1383,1.321,1384,1.088,1385,1.321,1386,1.088,1387,2.913,1388,2.913,1389,3.43,1390,1.321,1391,4.87,1392,0.942,1393,1.088,1394,1.321,1395,1.321,1396,2.239,1397,1.321,1398,2.239,1399,1.321,1400,1.321,1401,2.239,1402,1.321,1403,1.321,1404,1.321,1405,2.399,1406,1.321,1407,1.321,1408,1.321,1409,1.321,1410,2.239,1411,1.088,1412,1.321,1413,1.321,1414,2.913,1415,1.321,1416,1.321,1417,1.321,1418,3.43,1419,2.239,1420,1.321,1421,1.321,1422,1.321,1423,1.321,1424,1.321,1425,1.321,1426,1.321,1427,1.321,1428,1.088,1429,1.321,1430,1.088,1431,1.321,1432,1.321,1433,1.321,1434,1.321,1435,1.321,1436,1.321,1437,1.321,1438,1.321,1439,3.838,1440,1.321,1441,1.321,1442,1.321,1443,1.321,1444,1.321,1445,1.321,1446,1.321,1447,2.239,1448,2.239,1449,1.321,1450,1.321,1451,1.321,1452,1.321,1453,1.321,1454,2.239,1455,1.321,1456,1.321,1457,1.321,1458,1.321,1459,1.321,1460,1.321,1461,1.321,1462,2.239,1463,1.321,1464,0.942,1465,1.321,1466,1.321,1467,1.321,1468,1.321,1469,1.321,1470,1.321,1471,1.321,1472,1.321,1473,3.43,1474,1.321,1475,1.088,1476,1.088,1477,1.321,1478,1.321,1479,1.088,1480,1.321,1481,2.239,1482,2.239,1483,1.321,1484,1.088,1485,1.321,1486,1.321,1487,1.321,1488,1.321,1489,1.321,1490,1.321,1491,1.844,1492,2.239,1493,1.321,1494,1.321,1495,1.321,1496,1.321,1497,1.321,1498,1.321,1499,1.321,1500,1.321]],["keywords/template:docs/getting-started/upgrade-guide/index",[]],["title/template:docs/getting-started/upgrade-guide/v2-deprecations",[78,0.743,314,0.743,1353,1.326,1501,1.531]],["text/template:docs/getting-started/upgrade-guide/v2-deprecations",[26,0.68,67,0.994,68,1.082,78,2.212,138,1.082,244,1.887,314,2.212,319,4.562,1353,3.951,1501,4.562]],["keywords/template:docs/getting-started/upgrade-guide/v2-deprecations",[]],["title/template:docs/getting-started/what-is-mirage",[40,0.366]],["text/template:docs/getting-started/what-is-mirage",[13,0.604,14,0.799,15,1.105,20,0.814,23,0.624,33,3.025,34,1.807,38,1.577,40,0.672,41,2.636,48,1.313,50,1.223,55,1.123,56,1.214,68,0.814,70,1.81,79,1.716,81,1.313,89,1.807,92,2.372,102,1.549,103,2.372,104,1.419,105,1.167,106,0.953,108,1.897,113,1.419,118,2.154,119,1.242,138,0.814,142,1.664,143,2.398,144,1.664,158,1.244,183,1.039,190,1.223,195,3.007,207,1.664,226,1.313,248,2.154,249,0.885,262,3.33,268,1.807,285,1.419,286,1.535,303,2.636,323,2.154,335,0.959,338,1.123,364,3.025,376,2.972,396,1.968,403,1.535,405,1.807,410,2.372,415,2.154,449,2.372,450,2.972,452,2.747,453,1.968,479,2.636,495,1.992,506,2.972,507,2.46,509,2.636,554,2.51,571,4.394,642,3.024,654,1.968,674,2.372,677,3.185,697,3.025,749,2.636,760,2.372,767,2.972,774,3.431,819,1.968,842,1.535,893,2.636,912,3.431,957,2.972,961,2.972,985,2.154,986,3.431,1107,2.972,1111,2.972,1181,2.972,1193,2.972,1270,3.789,1282,2.972,1306,2.972,1386,3.431,1392,2.972,1405,3.431,1502,4.818,1503,4.166,1504,5.85,1505,4.166,1506,4.166,1507,4.166,1508,4.166,1509,4.166,1510,3.431,1511,5.313,1512,5.313,1513,4.166,1514,3.431,1515,4.166,1516,4.166,1517,4.166,1518,4.166,1519,4.166]],["keywords/template:docs/getting-started/what-is-mirage",[]],["title/template:docs/route-handlers/functions",[68,0.731]],["text/template:docs/route-handlers/functions",[1,0.708,2,1.833,4,1.295,11,1.197,13,0.633,14,0.687,15,1.06,16,1.24,20,0.831,23,0.526,24,1.004,26,0.661,29,0.532,34,1.524,35,2.705,38,1.783,40,0.417,41,1.463,43,1.003,44,2.041,49,1.524,53,2.001,55,0.948,56,0.674,57,1.964,58,1.741,59,1.092,65,1.003,67,0.631,68,1.27,75,1.185,77,1.003,79,0.948,81,0.728,87,0.787,88,0.576,92,2.421,95,1.197,96,1.618,97,1.34,105,0.415,106,0.966,108,0.674,111,0.948,112,0.852,117,1.463,119,1.143,132,1.524,138,1.278,139,1.64,143,0.852,144,2.234,145,0.674,146,1.092,148,0.674,150,0.623,151,1.195,155,1.316,157,2.061,158,1.127,164,0.728,172,2.421,178,0.852,180,1.631,183,0.876,190,0.979,205,1.34,206,0.746,207,0.923,209,1.092,214,1.463,219,1.003,220,1.906,223,1.195,225,1.649,238,1.003,244,0.787,245,0.576,249,0.746,250,1.85,263,0.923,266,1.107,268,2.061,269,2.224,270,1.898,275,1.107,277,1.197,285,1.964,286,1.295,290,1.463,292,0.852,294,1.092,300,0.852,304,1.463,305,1.751,318,1.698,330,1.618,331,1.092,332,1.649,334,1.463,335,0.979,337,2.895,338,1.452,339,1.904,344,1.661,351,0.923,354,2.061,358,1.195,364,1.316,368,3.913,372,2.041,389,2.691,400,1.295,403,0.852,405,1.844,417,1.195,419,0.787,444,3.234,446,1.898,452,2.643,453,1.092,454,1.316,456,0.852,458,0.923,463,1.844,464,1.107,465,1.698,466,2.421,467,2.421,468,3.186,471,1.741,472,0.852,473,0.787,479,1.463,498,2.224,501,1.195,516,1.567,518,1.463,532,1.404,533,2.199,538,0.923,541,1.904,554,1.092,558,1.463,559,1.463,579,2.224,583,1.463,611,1.649,614,1.195,621,1.316,622,2.009,700,1.904,703,2.001,723,3.913,724,1.463,732,1.649,739,1.092,741,1.649,816,1.649,837,1.195,845,1.524,848,1.092,866,1.316,868,1.649,874,1.984,875,1.649,879,1.817,881,2.691,882,1.463,895,2.691,910,1.463,914,1.463,927,1.316,930,1.463,948,1.904,956,1.649,959,2.507,961,1.649,966,1.649,969,1.316,970,2.507,971,1.904,1011,1.649,1036,2.224,1059,1.649,1096,1.904,1121,1.904,1129,3.033,1146,2.895,1147,2.691,1148,2.895,1177,1.463,1180,2.224,1234,1.904,1262,1.904,1263,3.389,1264,2.507,1265,1.463,1266,1.904,1267,1.904,1272,1.463,1278,1.904,1279,1.904,1292,2.895,1305,1.904,1312,1.904,1322,2.895,1354,4.21,1475,1.904,1476,1.904,1484,1.904,1491,1.904,1520,3.515,1521,2.895,1522,2.895,1523,2.312,1524,2.312,1525,4.752,1526,2.312,1527,2.312,1528,2.312,1529,2.312,1530,3.033,1531,3.515,1532,1.904,1533,1.904,1534,2.312,1535,2.312,1536,2.312,1537,2.312,1538,2.312,1539,4.752,1540,4.253,1541,2.312,1542,2.312,1543,2.312,1544,2.312,1545,2.312,1546,2.312,1547,2.312,1548,3.515,1549,2.312,1550,2.312,1551,3.515,1552,2.312,1553,2.312,1554,3.515,1555,2.312,1556,2.312,1557,2.312,1558,2.312,1559,2.312,1560,2.312,1561,1.904,1562,2.312,1563,2.312,1564,2.312,1565,1.904,1566,2.312,1567,2.312,1568,2.312,1569,2.312,1570,2.312,1571,2.312,1572,2.895,1573,2.895,1574,2.895,1575,3.515,1576,1.904,1577,2.312,1578,2.312,1579,2.312,1580,2.312,1581,2.312,1582,2.312,1583,3.515,1584,2.895,1585,2.312,1586,2.312,1587,2.312,1588,2.312,1589,2.312,1590,2.312,1591,2.312,1592,2.312,1593,2.312]],["keywords/template:docs/route-handlers/functions",[]],["title/template:docs/route-handlers/shorthands",[43,1.622]],["text/template:docs/route-handlers/shorthands",[1,0.706,2,1.782,11,0.958,13,0.567,14,0.499,15,0.995,18,3.159,20,0.795,23,0.866,24,0.857,26,0.345,35,3.395,38,1.725,40,0.513,42,2.884,43,3.023,49,2.406,50,0.936,65,1.22,68,0.795,75,1.304,89,1.22,91,1.329,95,2.119,102,0.82,104,1.385,105,0.505,111,0.759,119,1.178,138,1.13,139,1.551,143,1.037,145,1.392,146,1.329,148,1.392,154,1.907,157,1.22,158,0.795,167,1.454,173,0.958,179,1.78,180,1.617,182,1.329,183,0.701,190,0.648,205,1.879,206,0.863,221,2.256,224,2.315,245,1.383,249,1.321,250,1.617,252,2.573,266,0.886,268,1.763,285,1.626,290,1.78,291,2.9,292,1.498,294,1.329,302,2.006,305,1.037,330,2.119,335,0.648,338,1.096,354,2.071,389,3.511,396,1.329,400,1.037,412,2.573,415,1.454,446,1.624,456,1.037,457,1.78,458,1.123,460,1.763,463,1.763,468,2.315,475,1.123,480,2.9,494,1.78,525,3.957,532,1.123,533,3.156,553,3.349,554,1.329,579,1.78,583,1.78,605,1.22,606,1.78,625,1.454,656,1.907,670,3.159,677,1.454,694,1.78,699,2.317,703,1.601,705,1.601,712,5.028,725,3.021,750,2.317,765,2.317,788,2.006,819,1.921,822,1.601,845,2.698,874,1.498,877,3.659,879,1.454,881,2.573,882,2.573,904,2.9,915,1.78,926,1.454,930,1.78,934,1.78,947,2.9,958,2.006,959,2.006,969,2.315,970,3.731,975,2.468,985,2.102,1007,1.601,1080,2.468,1113,3.932,1129,3.957,1147,1.78,1263,2.006,1264,2.006,1265,2.573,1273,2.006,1282,2.006,1379,4.308,1393,3.932,1502,2.317,1510,2.317,1521,2.317,1522,3.349,1572,2.317,1573,2.317,1574,3.349,1576,2.317,1584,5.202,1594,2.813,1595,2.813,1596,2.813,1597,5.963,1598,2.813,1599,2.813,1600,4.066,1601,2.813,1602,4.066,1603,5.783,1604,2.813,1605,4.066,1606,5.231,1607,2.813,1608,4.066,1609,6.105,1610,2.813,1611,2.813,1612,2.813,1613,2.813,1614,4.775,1615,2.813,1616,2.813,1617,2.813,1618,2.813,1619,2.813,1620,2.813,1621,2.813,1622,2.813,1623,2.813,1624,2.813,1625,2.813,1626,4.066,1627,2.813,1628,2.813]],["keywords/template:docs/route-handlers/shorthands",[]],["title/template:docs/testing/acceptance-tests",[106,0.502,414,1.213]],["text/template:docs/testing/acceptance-tests",[1,0.695,2,0.93,4,1.901,6,2.96,13,0.593,14,0.673,15,0.49,16,0.796,17,1.555,20,0.534,22,2.25,23,0.409,24,0.842,26,0.576,29,1.394,40,0.593,41,1.729,42,1.291,44,1.091,48,0.861,50,1.081,52,0.796,53,1.555,55,0.737,57,1.356,58,0.93,60,2.266,63,1.948,67,0.714,68,0.534,69,2.058,70,0.93,79,1.266,81,1.254,82,1.729,84,1.007,85,2.519,87,1.356,88,0.681,89,1.185,91,1.291,94,1.185,97,1.479,101,1.369,105,1.108,106,1.273,108,1.369,112,1.731,113,0.93,118,1.412,119,0.845,132,1.185,138,1.072,141,2.438,145,1.723,150,0.737,152,2.519,154,1.091,156,2.96,157,1.726,158,0.918,164,1.254,173,0.93,176,1.729,178,1.007,186,1.729,190,1.081,194,1.291,203,2.25,206,0.845,210,0.93,222,1.091,225,1.948,226,1.625,244,0.93,245,0.992,247,2.25,248,1.412,249,0.845,250,1.504,253,2.667,260,2.839,263,1.091,266,1.254,272,1.59,274,1.291,275,1.479,277,0.93,296,2.266,300,1.007,312,1.467,330,2.013,331,2.438,344,1.291,346,1.555,349,1.555,351,1.875,372,1.59,395,1.185,396,2.591,398,3.867,399,1.185,400,1.007,401,1.729,402,0.93,404,1.729,405,1.185,409,1.291,414,2.036,417,2.428,423,1.948,424,1.948,437,1.291,454,1.555,458,1.091,461,1.881,463,2.788,464,1.804,465,1.875,470,2.438,473,0.93,475,1.091,476,2.519,478,2.673,483,3.122,484,2.563,485,2.627,486,2.964,494,1.729,495,1.868,501,1.412,512,1.291,514,2.058,515,1.59,516,1.007,523,1.729,530,2.25,532,1.091,548,1.948,549,1.729,557,1.948,580,1.185,584,1.729,618,3.908,621,2.266,624,1.412,625,1.412,630,1.729,639,1.948,642,1.412,654,1.291,656,1.091,659,1.555,666,1.185,671,2.058,675,3.278,703,2.673,727,2.673,729,1.185,731,2.519,732,3.68,734,2.519,735,2.971,736,3.349,737,3.867,739,1.291,740,2.25,741,1.948,746,1.948,767,1.948,769,2.25,776,1.555,782,1.948,786,2.058,787,1.729,822,2.266,824,2.25,831,2.058,838,2.25,842,1.007,848,1.291,893,1.729,954,3.278,981,1.948,1101,2.25,1107,1.948,1214,1.948,1215,1.729,1216,2.058,1217,1.555,1218,1.948,1219,1.729,1220,1.948,1221,1.729,1222,1.948,1226,3.68,1227,1.948,1228,2.25,1250,2.25,1270,1.948,1272,3.265,1290,2.25,1411,2.25,1479,2.25,1530,1.948,1565,2.25,1629,3.98,1630,2.732,1631,2.25,1632,2.732,1633,2.732,1634,2.732,1635,3.98,1636,2.732,1637,2.732,1638,2.25,1639,3.98,1640,2.732,1641,2.732,1642,4.696,1643,2.732,1644,4.696,1645,2.732,1646,2.732,1647,2.732,1648,2.25,1649,2.732,1650,2.732,1651,2.732,1652,2.732,1653,2.732,1654,2.732,1655,3.278,1656,3.98,1657,2.25,1658,2.732,1659,1.948,1660,3.98,1661,1.948,1662,2.732,1663,2.732,1664,2.732,1665,2.732,1666,2.732,1667,2.732,1668,3.98,1669,3.98,1670,3.98,1671,2.732,1672,2.732,1673,2.519]],["keywords/template:docs/testing/acceptance-tests",[]],["title/template:docs/testing/assertions",[141,1.767]],["text/template:docs/testing/assertions",[1,0.695,2,1.566,13,0.514,14,0.727,15,1.162,16,1.34,17,1.907,23,0.846,24,0.601,26,0.411,32,1.338,38,1.721,40,0.6,47,1.234,50,1.364,51,2.119,52,0.976,55,1.524,56,0.976,59,1.582,75,0.835,79,1.24,83,1.907,88,0.835,92,2.618,94,1.994,95,1.566,97,1.055,98,2.759,100,2.759,103,2.618,104,1.141,105,0.825,106,1.063,108,0.976,112,1.234,113,1.141,119,0.711,122,2.389,123,3.787,127,2.759,128,1.994,129,1.907,130,2.389,131,3.279,132,1.994,133,2.389,138,1.026,141,3.26,142,2.713,143,2.083,144,2.097,145,1.34,148,0.976,150,1.65,152,3.576,154,1.338,156,2.714,158,1.196,164,1.055,183,0.835,206,0.711,209,2.172,210,1.141,214,2.119,219,1.453,220,1.141,226,1.449,250,1.34,252,2.119,254,1.907,263,2.257,265,2.759,277,1.141,313,1.582,335,0.771,349,1.907,367,1.582,410,1.907,415,1.732,417,1.732,428,2.759,429,2.759,453,1.582,455,1.234,464,1.449,471,1.141,473,1.141,478,3.217,480,4.031,481,3.748,483,1.907,484,2.277,485,2.277,486,3.059,496,1.907,499,5.161,507,2.097,512,1.582,514,1.732,516,1.695,527,2.119,531,2.759,536,3.279,537,3.745,538,1.836,540,2.119,550,1.732,558,2.909,564,2.759,580,1.453,641,2.389,643,1.582,656,2.097,661,2.67,665,1.732,671,1.732,674,1.907,736,3.279,739,1.582,742,1.732,752,2.389,776,1.907,779,2.759,787,2.119,842,1.234,854,2.119,874,1.234,879,1.732,895,2.119,922,2.759,975,1.732,1007,1.907,1023,2.759,1080,1.732,1168,2.759,1177,2.119,1186,2.759,1222,3.279,1226,3.279,1247,2.759,1271,2.759,1306,2.389,1464,2.389,1638,2.759,1648,2.759,1659,2.389,1661,3.279,1674,3.349,1675,3.349,1676,5.25,1677,3.349,1678,3.349,1679,5.651,1680,3.349,1681,3.349,1682,3.349,1683,3.349,1684,5.25,1685,3.349,1686,3.349,1687,3.349,1688,3.349,1689,3.349,1690,3.349,1691,3.349,1692,3.349,1693,3.349,1694,3.349,1695,3.349,1696,3.349,1697,3.349,1698,3.349,1699,3.349,1700,3.349,1701,3.349,1702,3.349,1703,3.349,1704,2.759]],["keywords/template:docs/testing/assertions",[]],["title/template:docs/testing/integration-and-unit-tests",[106,0.401,786,1.155,1673,1.413]],["text/template:docs/testing/integration-and-unit-tests",[1,0.708,4,1.374,13,0.625,14,0.791,15,0.995,18,2.539,20,0.489,23,0.973,24,0.449,26,0.307,29,1.524,34,1.084,38,0.674,40,0.641,42,1.181,44,0.998,47,0.921,50,0.859,55,1.426,56,0.729,58,1.801,67,0.449,68,0.729,69,1.293,79,1.202,81,1.405,84,0.921,85,2.359,88,1.112,95,1.27,97,0.788,101,0.729,102,0.729,104,1.27,105,0.949,106,1.145,111,1.006,113,1.27,119,0.947,138,0.871,141,2.498,142,1.489,143,0.921,150,1.333,158,0.729,173,1.27,180,0.729,182,1.181,190,0.576,194,1.181,195,1.762,197,1.084,206,1.177,207,2.112,221,1.181,222,0.998,226,0.788,238,1.084,245,1.232,249,0.947,250,0.729,253,2.556,254,1.423,266,0.788,272,0.998,274,2.335,277,0.852,285,1.519,300,1.374,302,1.783,310,1.423,312,1.822,328,1.762,335,0.576,338,1.006,345,1.423,392,1.423,399,1.084,405,1.084,406,1.783,407,2.059,414,1.934,449,3.436,458,0.998,460,1.084,464,1.965,465,1.489,470,1.181,471,0.852,472,0.921,475,0.998,478,2.123,484,2.405,485,2.405,486,3.09,495,1.27,500,3.526,504,2.059,507,0.998,512,1.762,515,1.489,516,0.921,522,1.423,533,1.293,538,1.489,540,1.582,550,1.293,586,1.783,606,3.128,630,1.582,635,1.084,640,1.783,729,1.934,734,1.582,760,1.423,782,1.783,786,1.928,842,0.921,843,1.582,844,1.423,848,2.107,868,1.783,871,5.136,872,2.059,874,1.643,888,2.059,910,1.582,942,2.059,1036,1.582,1151,2.059,1179,2.059,1215,3.128,1216,2.867,1217,2.814,1219,3.509,1221,3.509,1227,1.783,1248,1.783,1249,2.059,1272,3.128,1296,3.672,1346,2.059,1382,2.059,1392,1.783,1428,3.071,1430,2.059,1464,1.783,1514,2.059,1530,1.783,1561,2.059,1655,2.059,1657,2.059,1659,3.526,1661,3.526,1673,2.359,1705,2.5,1706,4.943,1707,4.943,1708,5.545,1709,5.745,1710,5.545,1711,5.545,1712,5.745,1713,3.729,1714,3.729,1715,2.5,1716,3.729,1717,2.5,1718,2.5,1719,2.5,1720,2.5,1721,2.5,1722,6.144,1723,6.494,1724,5.288,1725,2.5,1726,4.943,1727,4.943,1728,2.5,1729,2.5,1730,3.729,1731,4.459,1732,2.5,1733,3.729,1734,3.729,1735,4.459,1736,3.729,1737,3.729,1738,2.5,1739,3.729,1740,3.729,1741,2.5,1742,2.5,1743,3.729,1744,2.5,1745,2.5,1746,2.5,1747,2.5,1748,2.5,1749,2.5,1750,2.5,1751,2.5,1752,2.5,1753,3.729,1754,4.459,1755,2.5,1756,2.5,1757,2.5,1758,4.459,1759,2.5,1760,2.5]],["keywords/template:docs/testing/integration-and-unit-tests",[]],["title/template:docs/testing/setup-mirage",[106,0.401,285,0.761,1216,1.155]],["text/template:docs/testing/setup-mirage",[1,0.708,13,0.519,23,0.621,26,0.509,29,1.578,40,0.603,68,1.036,71,2.626,75,1.035,77,1.8,78,1.657,95,1.413,96,1.413,101,1.21,105,1.048,106,1.251,111,1.119,116,2.74,134,2.96,135,2.626,136,3.176,137,2.626,138,0.811,139,1.321,140,2.626,158,0.811,171,1.961,190,1.344,219,1.8,244,1.413,245,1.035,246,5.067,249,1.125,253,2.145,266,1.307,275,1.307,285,1.805,306,3.418,333,3.418,334,2.626,335,0.955,367,2.504,402,1.413,414,1.8,444,2.626,465,1.657,466,2.362,467,2.362,484,2.532,485,2.532,516,2.152,533,2.145,624,2.145,705,2.362,735,3.694,786,2.145,842,1.529,1181,2.96,1214,4.164,1215,3.694,1216,3.286,1217,3.324,1218,4.164,1219,3.694,1220,4.164,1221,3.694,1384,3.418,1532,3.418,1533,3.418,1631,4.809,1673,2.626,1761,4.15,1762,4.15,1763,4.15,1764,4.15]],["keywords/template:docs/testing/setup-mirage",[]],["title/template:index",[102,1.09]],["text/template:index",[1,0.515,13,0.515,48,1.657,57,1.791,58,1.791,68,1.028,77,2.281,81,1.657,102,1.533,106,1.099,108,1.533,118,2.719,120,4.332,143,1.938,158,1.197,167,2.719,226,1.657,249,1.117,335,1.211,392,2.994,414,2.281,495,1.791,513,3.328,724,3.328,742,2.719,762,3.328,768,3.328,830,4.332,1043,3.328,1080,2.719,1193,3.751,1196,4.332,1230,4.332,1765,5.26,1766,5.26,1767,5.26,1768,5.26,1769,5.26]],["keywords/template:index",[]],["title/template:not-found",[1770,3.079]],["text/template:not-found",[272,2.228,666,2.419,1180,3.53,1704,4.595,1770,4.595,1771,5.579]],["keywords/template:not-found",[]],["title/template:templates/application",[]],["text/template:templates/application",[0,3.205]],["keywords/template:templates/application",[]],["title/template:templates/blog",[]],["text/template:templates/blog",[]],["keywords/template:templates/blog",[]],["title/template:templates/blog/detail",[]],["text/template:templates/blog/detail",[1,0.544,2,1.89,3,4.505,4,2.045,5,5.549,6,2.869,7,5.549,8,5.549]],["keywords/template:templates/blog/detail",[]],["title/template:templates/blog/error",[9,1.592,10,2.303]],["text/template:templates/blog/error",[9,3.199,10,4.628]],["keywords/template:templates/blog/error",[]],["title/template:templates/blog/index",[0,2.129]],["text/template:templates/blog/index",[0,3.205]],["keywords/template:templates/blog/index",[]],["title/template:templates/docs",[]],["text/template:templates/docs",[]],["keywords/template:templates/docs",[]],["title/template:templates/docs/advanced/customizing-the-inflector",[11,0.953,12,2.303]],["text/template:templates/docs/advanced/customizing-the-inflector",[1,0.683,11,2.045,12,5.575,13,0.634,14,0.676,15,0.988,16,1.285,17,2.509,18,2.509,19,2.509,20,0.861,21,6.288,22,5.437,23,0.824,24,1.077,25,5.575,26,0.676,27,4.407,28,3.979,29,1.267,30,5.505,31,4.407,32,1.76,33,2.509,34,2.387,35,2.509,36,5.505,37,3.483,38,1.619,39,5.505,40,0.588,41,2.788,42,2.601,43,1.911,44,2.198,45,5.505,46,3.63,47,1.624,48,1.388,49,1.911,50,1.015,51,2.788,52,1.285,53,2.509,54,3.143,55,1.188,56,1.605,57,1.501,58,1.501,59,2.082,60,2.509,61,4.407,62,4.407,63,3.926,64,3.63,65,1.911,66,4.407,67,0.988,68,0.861,69,3.104,70,1.501,71,2.788,72,4.407,73,2.509,74,4.407,75,1.099,76,4.407,77,2.604,78,2.198,79,1.188,80,2.788,81,1.388,82,2.788,83,2.509,84,1.624,85,2.788,86,2.788,87,1.501,88,1.099,89,1.911,90,3.926,91,2.082,92,2.509,93,3.63]],["keywords/template:templates/docs/advanced/customizing-the-inflector",[]],["title/template:templates/docs/advanced/environment-options",[94,1.213,95,0.953]],["text/template:templates/docs/advanced/environment-options",[1,0.702,4,1.822,13,0.543,14,0.775,15,0.995,23,0.92,24,0.995,26,0.827,33,2.814,35,2.123,38,1.333,40,0.619,44,1.489,56,1.087,67,0.669,73,2.123,77,1.617,81,1.557,83,2.814,92,2.123,94,2.837,95,2.011,96,2.093,97,1.557,98,5.2,99,2.123,100,5.2,101,1.616,102,1.616,103,3.668,104,2.228,105,1.102,106,1.059,107,3.526,108,1.791,109,3.729,110,3.729,111,1.006,112,1.374,113,1.27,114,5.2,115,3.071,116,2.556,117,2.359,118,1.928,119,0.792,120,3.071,121,3.071,122,3.955,123,4.567,124,3.071,125,2.123,126,2.814,127,3.071,128,2.144,129,2.123,130,2.66,131,3.526,132,2.144,133,2.66,134,2.66,135,2.359,136,3.324,137,2.359,138,1.084,139,0.93,140,2.359,141,2.336,142,1.974,143,1.374,144,1.974,145,1.087,146,1.762,147,2.123,148,1.087,149,4.943,150,1.495,151,1.928,152,3.509,153,3.729,154,1.489,155,2.123,156,1.928,157,1.617,158,0.729,159,3.729,160,3.071,161,3.729,162,3.729,163,3.729,164,1.557,165,3.071,166,2.123,167,1.928,168,3.729,169,3.729,170,3.729,171,2.79,172,2.123,173,1.684,174,2.66,175,2.359,176,2.359,177,4.071,178,1.374,179,2.359,180,1.087,181,3.071,182,1.762,183,1.232,184,4.943,185,3.071,186,2.359,187,3.729,188,3.729,189,3.729,190,0.859,191,3.071,192,2.66,193,3.729,194,1.762]],["keywords/template:templates/docs/advanced/environment-options",[]],["title/template:templates/docs/advanced/mocking-guids",[52,0.815,195,1.321]],["text/template:templates/docs/advanced/mocking-guids",[1,0.698,11,1.902,13,0.659,14,0.553,23,0.675,24,0.809,26,0.553,29,1.038,40,0.442,50,1.46,52,1.768,59,2.13,67,0.809,69,2.331,70,1.536,96,1.902,97,1.42,139,1.512,150,1.216,195,2.638,196,6.339,197,1.955,198,3.713,199,4.509,200,5.467,201,2.567,202,3.216,203,3.713,204,2.853,205,1.911,206,1.383,207,2.23,208,4.509,209,2.638,210,2.066,211,3.713,212,4.122,213,3.713,214,2.853,215,6.065,216,3.216,217,4.509,218,4.509,219,2.421,220,1.536,221,2.638,222,1.801,223,2.331,224,2.567,225,4.521,226,1.42,227,4.509,228,6.065,229,4.509,230,4.509,231,4.509,232,5.583,233,3.713,234,4.509,235,4.509,236,3.713,237,4.598,238,2.421,239,4.509,240,4.509,241,4.509,242,4.509,243,4.509]],["keywords/template:templates/docs/advanced/mocking-guids",[]],["title/template:templates/docs/advanced/server-configuration",[56,0.815,105,0.502]],["text/template:templates/docs/advanced/server-configuration",[1,0.7,11,1.04,13,0.582,14,0.789,15,1.119,20,0.977,23,1.009,24,1.028,26,0.779,29,1.481,40,0.68,44,1.22,48,0.962,55,0.824,56,1.457,57,1.04,67,1.096,68,1.283,70,1.703,75,1.246,78,2.492,79,0.824,88,1.075,91,1.443,101,1.257,103,1.739,105,1.138,106,0.548,108,0.89,111,1.163,112,1.126,113,1.04,116,3.158,125,1.739,128,1.325,134,3.076,135,3.163,136,3.662,137,3.163,138,1.271,139,1.246,140,3.163,148,0.89,158,0.597,164,0.962,166,1.739,167,2.23,171,2.362,172,2.846,173,1.469,178,1.126,179,2.729,180,1.257,181,2.516,182,1.443,183,0.762,190,0.703,194,1.443,206,0.916,220,1.469,223,1.579,244,2.19,245,1.621,246,2.516,247,2.516,248,1.579,249,1.216,250,1.257,251,3.076,252,1.933,253,2.584,254,1.739,255,3.076,256,3.055,257,3.055,258,3.055,259,3.552,260,2.179,261,3.055,262,2.846,263,1.22,264,3.076,265,2.516,266,1.359,267,2.516,268,1.325,269,1.933,270,1.722,271,3.055,272,1.22,273,3.552,274,1.443,275,0.962,276,2.179,277,1.04,278,3.055,279,2.179,280,3.055,281,2.516,282,3.055,283,3.055,284,2.516,285,1.04,286,1.126,287,2.516,288,3.055,289,3.055,290,1.933,291,2.179,292,1.589,293,2.179,294,1.443,295,3.055,296,1.739,297,2.516,298,3.055,299,3.055,300,1.589,301,3.055,302,2.179,303,1.933,304,1.933,305,1.126,306,3.552,307,2.179,308,2.179,309,2.179,310,1.739,311,3.055,312,1.842,313,1.443,314,1.22,315,2.516,316,2.179,317,2.516,318,1.22,319,3.552,320,3.055,321,1.443,322,1.579,323,1.579,324,2.516,325,2.516,326,2.516,327,2.516,328,1.443,329,2.516,330,1.04,331,1.443,332,2.179,333,4.117,334,3.163,335,1.151,336,4.999,337,2.516,338,1.797,339,3.552,340,1.933,341,2.179,342,1.739,343,1.933,344,1.443,345,1.739,346,2.846,347,3.565,348,2.455,349,1.739,350,1.325,351,1.22,352,3.055,353,3.877,354,1.325,355,3.163,356,2.516,357,2.891,358,1.579,359,2.516,360,3.055,361,3.055,362,3.055,363,3.055]],["keywords/template:templates/docs/advanced/server-configuration",[]],["title/template:templates/docs/advanced/simulating-cookie-responses",[144,0.892,364,1.272,365,1.84]],["text/template:templates/docs/advanced/simulating-cookie-responses",[1,0.683,13,0.488,14,0.612,37,3.153,40,0.581,68,0.974,88,1.479,96,2.234,97,1.57,138,0.974,139,1.242,144,2.53,180,1.453,190,1.147,206,1.26,222,1.99,250,1.453,269,3.153,276,3.554,364,3.378,365,5.401,366,4.104,367,2.354,368,5.218,369,4.983,370,3.153,371,4.983,372,2.369,373,4.983,374,4.983,375,4.983,376,3.554,377,4.983,378,4.983,379,4.983,380,5.933,381,4.983,382,4.104,383,4.983,384,4.983,385,4.983,386,4.983,387,4.983,388,4.983,389,3.153,390,4.983,391,4.983,392,2.837,393,4.983]],["keywords/template:templates/docs/advanced/simulating-cookie-responses",[]],["title/template:templates/docs/advanced/switching-between-scenarios",[394,1.413,395,0.969,396,1.055]],["text/template:templates/docs/advanced/switching-between-scenarios",[1,0.697,4,2.136,13,0.568,14,0.501,16,1.191,18,2.325,20,0.798,24,0.941,26,0.795,29,1.408,32,1.631,40,0.645,50,0.94,55,1.101,56,1.529,67,1.04,68,1.025,71,4.002,81,1.826,94,1.771,95,1.391,96,1.391,99,2.987,101,1.919,105,1.04,106,1.161,107,2.913,108,1.689,111,1.101,113,1.787,115,5.037,116,2.112,126,2.325,139,1.018,164,1.826,166,2.325,171,1.93,175,2.584,190,0.94,201,2.987,206,0.867,226,1.287,233,3.364,249,0.867,275,1.653,286,1.505,292,1.505,300,1.505,318,1.631,330,1.787,372,1.631,394,3.319,395,1.771,396,3.264,397,3.364,398,4.321,399,2.275,400,1.505,401,2.584,402,1.391,403,1.505,404,2.584,405,1.771,406,2.913,407,3.364,408,4.085,409,2.889,410,2.325,411,5.246,412,2.584,413,4.085,414,1.771,415,2.112,416,4.085,417,2.112,418,4.085,419,1.391,420,4.085,421,4.085,422,4.085,423,2.913,424,2.913,425,5.795,426,4.085,427,4.085,428,3.364,429,3.364,430,5.246,431,4.085,432,6.116,433,4.773,434,5.795,435,4.085,436,4.085,437,2.479,438,4.085,439,4.085,440,3.364,441,4.085,442,3.364,443,4.085,444,2.584]],["keywords/template:templates/docs/advanced/switching-between-scenarios",[]],["title/template:templates/docs/api/item",[]],["text/template:templates/docs/api/item",[]],["keywords/template:templates/docs/api/item",[]],["title/template:templates/docs/data-layer/database",[50,0.861]],["text/template:templates/docs/data-layer/database",[1,0.698,6,2.154,13,0.624,14,0.652,15,1.105,16,1.214,24,0.747,26,0.511,38,1.433,40,0.521,50,1.569,52,1.214,58,1.419,67,0.747,69,2.154,70,1.419,89,1.807,97,1.313,102,1.214,105,0.747,106,0.747,126,2.372,128,1.807,138,1.143,139,1.039,141,1.968,142,1.664,146,1.968,147,2.372,150,1.716,152,2.636,158,0.814,180,1.549,190,0.959,198,3.431,202,2.972,204,2.636,205,2.005,206,0.885,207,2.122,226,1.843,245,1.039,250,1.705,263,1.664,270,1.664,274,1.968,275,1.313,292,1.535,312,2.156,313,1.968,331,1.968,335,1.223,367,1.968,372,2.46,399,1.807,400,1.535,409,2.51,415,2.154,437,1.968,445,4.166,446,1.664,447,2.636,448,3.431,449,2.372,450,2.972,451,4.166,452,2.154,453,2.51,454,2.372,455,2.271,456,1.958,457,2.636,458,2.122,459,2.972,460,1.807,461,1.968,462,2.972,463,2.537,464,2.05,465,2.122,466,3.025,467,3.025,468,2.372,469,4.166,470,1.968,471,1.419,472,1.535,473,1.419,474,3.431,475,1.664,476,2.636,477,4.166,478,2.372,479,2.636,480,2.972,481,2.636,482,4.166,483,2.372,484,1.807,485,1.807,486,2.764,487,4.166,488,4.166,489,5.313,490,5.313,491,4.166,492,4.166,493,4.166,494,2.636]],["keywords/template:templates/docs/data-layer/database",[]],["title/template:templates/docs/data-layer/factories",[495,1.274]],["text/template:templates/docs/data-layer/factories",[1,0.705,2,2.181,3,2.093,4,0.832,9,0.76,11,0.455,13,0.627,14,0.424,15,0.957,16,0.389,20,0.755,23,0.779,24,0.693,25,1.099,26,0.753,29,1.412,32,1.172,40,0.46,47,1.272,48,1.64,50,1.165,52,0.389,54,1.611,55,1.266,57,0.769,58,0.769,60,0.76,65,0.579,67,1.108,68,0.441,70,0.455,71,0.844,75,1.261,77,0.579,79,1.13,81,0.711,83,0.76,87,0.455,88,1.113,90,0.952,91,1.067,94,0.579,96,1.599,97,0.42,99,1.286,101,1.302,104,1.176,105,0.957,106,1.108,108,1.588,111,1.266,112,1.082,113,0.455,118,0.69,119,0.89,128,1.497,132,0.579,133,2.093,138,0.261,139,1.113,141,1.387,142,0.533,145,1.302,146,1.387,148,1.126,150,0.931,154,1.783,156,1.167,157,1.497,158,0.956,164,0.42,167,0.69,172,1.286,173,1,176,0.844,178,0.832,183,1.298,186,1.857,190,0.795,194,0.631,197,0.579,202,0.952,205,1.848,206,0.89,207,1.542,209,1.067,210,1.723,219,0.579,220,1,222,1.172,223,0.69,224,1.286,226,1.68,238,0.979,244,1.856,245,1.59,249,1.157,253,0.69,260,0.952,262,0.76,264,0.952,266,0.711,270,1.674,275,1.217,277,0.455,279,0.952,285,1.176,286,0.492,291,0.952,293,0.952,294,1.387,296,1.671,297,1.099,300,1.423,303,1.429,304,0.844,305,0.832,308,0.952,309,0.952,310,1.286,313,1.631,314,0.533,315,1.099,318,1.953,321,1.387,322,1.167,323,0.69,324,5.294,328,1.631,330,2.129,335,0.307,340,0.844,344,2.31,346,0.76,349,0.76,350,1.497,351,1.542,372,0.533,382,1.099,394,1.429,396,2.31,397,1.099,399,1.818,400,1.272,402,1.315,403,1.082,404,0.844,409,1.387,412,1.429,414,0.979,417,1.785,419,1,433,2.844,437,1.824,442,3.18,446,0.533,447,0.844,452,1.517,455,0.492,456,0.832,458,0.533,461,0.631,463,2.777,464,2.017,465,1.783,470,0.631,471,1.723,472,1.545,473,1.773,475,0.533,478,0.76,483,1.671,484,1.273,485,1.273,486,1.387,494,0.844,495,2.27,496,0.76,497,3.452,498,0.844,499,2.417,500,1.611,501,1.167,502,1.335,503,3.861,504,1.099,505,0.952,506,0.952,507,0.533,508,1.335,509,1.429,510,1.335,511,1.335,512,1.981,513,0.844,514,1.785,515,1.674,516,1.802,517,1.335,518,0.844,519,1.335,520,0.952,521,1.517,522,1.966,523,2.185,524,3.677,525,0.952,526,1.335,527,1.857,528,2.417,529,1.099,530,1.099,531,1.099,532,2.391,533,1.167,534,3.608,535,2.258,536,3.348,537,2.754,538,0.902,539,1.335,540,1.429,541,1.099,542,2.258,543,1.335,544,1.335,545,0.952,546,0.69,547,1.099,548,2.463,549,3.512,550,0.69,551,1.86,552,1.335,553,1.86,554,1.067,555,1.611,556,1.335,557,2.463,558,3.375,559,2.185,560,1.86,561,2.258,562,1.335,563,1.335,564,2.417,565,2.258,566,1.335,567,1.335,568,1.429,569,0.844,570,1.099,571,0.952,572,1.335,573,1.335,574,1.335,575,1.335,576,1.335,577,1.335,578,1.335,579,3.094,580,1.273,581,1.099,582,2.417,583,1.857,584,2.652,585,1.335,586,1.611,587,2.258,588,1.099,589,0.952,590,3.861,591,1.335,592,1.335,593,1.335,594,1.335,595,1.86,596,1.335,597,1.335,598,1.335,599,1.335,600,1.335,601,1.335,602,1.335,603,1.335,604,1.335,605,2.194,606,0.844,607,1.335,608,3.677,609,1.099,610,1.86,611,0.952,612,1.86,613,1.335,614,1.167,615,1.335,616,1.517,617,1.335,618,2.825,619,1.335,620,2.258,621,0.76,622,0.631,623,5.798,624,2.615,625,0.69,626,1.335,627,0.952,628,1.335,629,1.335,630,0.844,631,1.335,632,1.335,633,2.258,634,0.844,635,0.579,636,1.099,637,0.952,638,1.335,639,0.952,640,0.952,641,3.185,642,0.69,643,2.704,644,1.335,645,4.89,646,3.453,647,2.417,648,3.452,649,1.335,650,1.099,651,1.099,652,1.335,653,4.694,654,0.631,655,0.952,656,1.172,657,1.099,658,0.952,659,1.286,660,3.861,661,0.631,662,1.335,663,2.935,664,0.952,665,0.69,666,0.579,667,2.258,668,1.335,669,1.335,670,1.286,671,1.517,672,1.335,673,1.335,674,0.76,675,1.86,676,1.099,677,0.69,678,1.335,679,4.694,680,2.093,681,2.093,682,1.86,683,2.258,684,2.258,685,2.258,686,0.844,687,1.335,688,0.952,689,2.935,690,1.335,691,1.335,692,1.335,693,2.258,694,1.429,695,2.258,696,2.935,697,0.76,698,1.335,699,1.099,700,1.099,701,1.335,702,1.335,703,0.76,704,1.335,705,0.76,706,1.099,707,1.611,708,2.258,709,1.335,710,1.335,711,1.335,712,1.099,713,1.335,714,0.952,715,1.335,716,1.335,717,1.335,718,1.335,719,1.335,720,3.453,721,1.335,722,1.335,723,1.099,724,0.844,725,0.844,726,1.335,727,1.671,728,1.335,729,0.979,730,1.335,731,0.844,732,2.093,733,1.099,734,0.844,735,0.844,736,0.952,737,1.099,738,1.099,739,0.631,740,1.099,741,0.952,742,0.69,743,0.952,744,1.335,745,1.335,746,0.952,747,1.099,748,1.335,749,0.844,750,1.099,751,1.335,752,0.952,753,1.335,754,1.335,755,2.935,756,2.258,757,2.258,758,2.258,759,1.099,760,0.76,761,1.335,762,0.844,763,1.335,764,1.099,765,1.099,766,1.099,767,0.952,768,0.844,769,1.099,770,0.952,771,1.099,772,1.335,773,1.335,774,1.099]],["keywords/template:templates/docs/data-layer/factories",[]],["title/template:templates/docs/data-layer/fixtures",[323,1.933]],["text/template:templates/docs/data-layer/fixtures",[1,0.705,2,1.754,4,1.726,11,0.926,13,0.641,14,0.672,15,1.085,20,0.532,23,0.924,26,0.789,28,1.721,32,1.585,34,2.233,40,0.604,43,1.18,47,1.726,48,0.857,50,1.261,55,0.733,56,0.793,57,0.926,65,1.18,67,1.152,75,1.685,79,0.733,84,1.002,87,1.351,88,0.678,101,1.827,102,0.793,106,0.712,108,0.793,111,0.733,119,0.578,129,1.549,132,1.721,145,1.596,148,1.157,150,1.263,154,1.585,156,1.406,164,1.25,183,1.563,195,1.285,200,2.24,201,1.549,205,2.12,206,0.995,209,1.285,210,1.351,220,1.351,222,1.585,226,1.25,245,0.989,249,0.578,266,1.476,270,1.086,275,1.25,286,1.002,305,2.274,312,1.002,314,1.086,321,1.285,322,2.422,323,3.48,330,1.351,335,1.079,338,1.07,345,1.549,359,2.24,399,1.18,401,1.721,402,0.926,409,1.285,412,2.511,419,0.926,437,2.213,446,1.086,455,1.726,456,1.726,459,1.94,461,1.285,462,1.94,464,1.622,470,2.701,471,2.188,472,1.462,473,1.351,483,1.549,484,1.18,485,1.18,486,1.285,495,1.595,515,1.585,521,2.662,523,2.964,529,2.24,532,1.086,546,1.406,554,1.285,558,1.721,559,1.721,580,1.18,588,2.24,605,1.18,616,1.406,618,1.721,622,2.788,630,1.721,634,1.721,635,1.721,636,3.268,637,2.83,643,2.213,661,1.285,666,1.18,676,2.24,727,2.667,729,1.18,738,2.24,742,1.406,749,2.511,760,1.549,775,2.72,776,2.259,777,3.968,778,2.72,779,2.24,780,2.72,781,2.72,782,1.94,783,4.509,784,3.968,785,3.968,786,2.051,787,1.721,788,1.94,789,2.72,790,2.24,791,2.24,792,2.72,793,6.268,794,2.72,795,2.72,796,2.72,797,5.149,798,2.72,799,2.72,800,2.72,801,2.72,802,2.72,803,2.72,804,2.72,805,2.72,806,2.72,807,2.72,808,2.72,809,2.72,810,2.72,811,2.72,812,2.72,813,2.72,814,2.72,815,3.268,816,3.341,817,2.72,818,2.24,819,1.875,820,4.684,821,2.24,822,1.549,823,2.72,824,2.24,825,2.72,826,2.72,827,2.72,828,2.72,829,2.24,830,2.24,831,2.422,832,3.968,833,5.716,834,2.24,835,5.149,836,2.72,837,2.662,838,4.241,839,5.149,840,3.905,841,2.72,842,1.002,843,1.721,844,2.259,845,1.18,846,2.72,847,2.72,848,1.285,849,3.968,850,3.968,851,1.721,852,1.721,853,2.72,854,1.721,855,2.24,856,2.72,857,2.24,858,2.24,859,1.721,860,3.268,861,2.72,862,2.24,863,2.72,864,2.24,865,2.72]],["keywords/template:templates/docs/data-layer/fixtures",[]],["title/template:templates/docs/data-layer/models",[23,0.56]],["text/template:templates/docs/data-layer/models",[1,0.688,2,1.699,6,1.953,13,0.621,14,0.757,15,1.001,16,1.454,19,2.151,20,0.974,23,1.051,24,0.895,26,0.685,28,2.391,29,0.87,38,1.019,40,0.605,49,2.574,52,1.101,65,1.639,67,1.001,70,1.287,75,0.942,77,1.639,87,1.287,97,1.571,101,1.454,104,1.287,105,0.895,118,1.953,119,1.059,138,0.974,139,1.243,145,1.454,146,1.785,148,1.101,150,1.345,158,0.974,173,1.287,176,3.155,178,1.393,180,1.454,182,1.785,183,1.538,210,1.287,212,2.391,220,2.159,244,1.287,245,1.611,248,1.953,249,1.346,250,1.454,255,2.695,263,1.509,272,1.991,277,1.287,292,1.838,294,1.785,300,1.393,312,2.057,318,1.509,328,1.785,338,1.019,342,2.151,350,1.639,354,1.639,372,2.37,395,1.639,402,1.287,403,1.393,409,2.356,410,2.151,419,1.287,437,2.356,455,1.838,456,1.393,458,2.229,460,1.639,464,1.571,474,3.112,475,1.509,495,1.699,500,2.695,507,1.509,514,2.578,515,1.509,522,2.151,527,3.532,546,1.953,614,3.069,640,2.695,647,3.112,656,1.991,665,1.953,680,2.695,681,2.695,682,3.112,686,2.391,697,2.151,831,1.953,844,2.151,851,3.155,866,2.151,867,3.778,868,2.695,869,3.778,870,3.778,871,3.112,872,3.112,873,2.695,874,1.393,875,2.695,876,2.695,877,2.391,878,3.112,879,2.886,880,3.778,881,2.391,882,2.391,883,3.778,884,3.112,885,3.778,886,3.778,887,3.778,888,3.112,889,3.778,890,3.112,891,3.778,892,3.778,893,3.155,894,3.112,895,3.532,896,3.112,897,3.778,898,3.778,899,4.987,900,3.778,901,3.778,902,3.778,903,3.778,904,3.557,905,3.778,906,3.778,907,3.778,908,2.391,909,3.778,910,2.391]],["keywords/template:templates/docs/data-layer/models",[]],["title/template:templates/docs/data-layer/orm",[455,1.378]],["text/template:templates/docs/data-layer/orm",[1,0.707,13,0.558,14,0.546,15,1.157,16,0.595,20,1.046,23,0.991,24,0.573,26,0.593,29,1.024,32,0.815,37,1.292,38,1.381,40,0.618,43,1.706,47,1.887,48,1.006,49,0.885,50,1.275,55,0.551,56,0.595,57,1.088,58,1.34,60,1.162,67,0.798,70,0.695,73,1.818,75,1.381,79,0.861,80,1.292,81,0.643,84,0.752,86,1.292,87,0.695,88,1.276,89,1.385,96,0.695,97,0.643,101,0.595,102,0.595,104,0.695,105,0.706,111,0.551,112,1.64,113,0.695,119,1.176,138,1.159,139,1.204,143,0.752,144,2.045,145,0.931,148,1.56,150,1.061,151,1.651,158,0.399,164,1.239,173,1.088,178,1.177,180,1.56,182,2.102,183,1.608,190,0.735,192,3.173,195,1.509,197,0.885,205,2.114,206,0.433,207,1.571,210,1.515,212,2.021,219,0.885,221,1.509,236,2.63,238,0.885,244,1.515,245,1.276,249,1.087,250,1.73,263,0.815,266,0.643,270,0.815,277,1.088,286,0.752,292,1.177,305,1.887,307,1.456,312,0.752,313,0.964,318,1.275,321,0.964,328,1.858,330,0.695,335,0.47,338,1.381,345,1.162,348,1.818,350,0.885,358,2.034,367,1.509,370,1.292,394,1.292,395,0.885,400,0.752,402,0.695,403,1.177,405,0.885,410,1.162,419,1.515,446,1.571,449,1.162,453,0.964,455,2.325,456,0.752,458,0.815,460,1.385,462,1.456,463,2.83,464,2.004,465,2.273,466,1.162,467,1.162,471,2.107,472,1.64,473,1.515,475,0.815,476,2.021,496,1.162,497,1.681,498,1.292,501,1.055,505,1.456,507,1.275,509,1.292,512,1.509,513,1.292,515,2.137,516,0.752,520,2.278,521,2.034,527,1.292,532,2.496,534,3.816,536,3.652,537,3.652,538,0.815,550,1.055,586,1.456,605,1.929,606,2.489,608,4.217,609,1.681,610,3.24,611,1.456,612,4.795,614,2.647,616,2.034,621,1.162,622,1.858,635,0.885,642,1.651,643,0.964,650,1.681,654,2.102,656,1.571,658,1.456,659,1.818,661,1.858,666,0.885,674,1.162,688,1.456,694,1.292,697,1.818,703,1.162,727,1.818,729,1.385,739,0.964,760,1.818,762,1.292,770,1.456,819,2.281,842,1.64,843,1.292,844,1.162,845,2.469,848,1.509,857,1.681,859,1.292,860,1.681,866,1.162,874,1.177,884,1.681,890,1.681,911,2.278,912,1.681,913,2.041,914,2.021,915,2.021,916,2.041,917,2.041,918,2.041,919,1.681,920,1.681,921,1.681,922,1.681,923,2.041,924,2.041,925,3.934,926,1.651,927,1.818,928,3.194,929,2.041,930,3.055,931,3.194,932,3.194,933,2.041,934,1.292,935,5.12,936,5.12,937,5.12,938,2.041,939,2.041,940,3.194,941,2.041,942,1.681,943,2.041,944,2.041,945,2.041,946,2.041,947,1.456,948,1.681,949,3.194,950,5.537,951,3.194,952,3.816,953,2.041,954,1.681,955,2.278,956,2.806,957,2.278,958,1.456,959,2.278,960,2.041,961,1.456,962,2.63,963,3.194,964,1.681,965,2.041,966,1.456,967,3.194,968,1.681,969,1.162,970,2.278,971,2.63,972,1.681,973,1.292,974,1.456,975,1.055,976,2.041,977,2.041,978,2.041,979,3.194,980,2.041,981,1.456,982,2.041,983,1.681,984,2.041,985,1.055,986,1.681,987,2.041,988,3.934,989,3.934,990,3.934,991,3.934,992,3.194,993,3.194,994,3.934,995,3.934,996,1.681,997,2.041,998,2.041,999,2.041,1000,2.041,1001,2.041,1002,2.041,1003,1.681,1004,2.041,1005,2.041,1006,2.041,1007,1.162]],["keywords/template:templates/docs/data-layer/orm",[]],["title/template:templates/docs/data-layer/relationships",[183,0.932]],["text/template:templates/docs/data-layer/relationships",[0,1.501,1,0.705,2,1.321,3,4.705,11,0.898,13,0.53,14,0.324,15,0.696,16,1.131,17,1.501,20,0.899,23,1.025,24,0.91,26,0.804,29,1.168,32,1.053,40,0.451,47,1.43,48,0.831,49,2.2,50,0.607,52,0.769,59,1.246,63,1.881,65,1.144,67,1.176,75,1.147,78,1.838,79,0.711,80,1.669,82,1.669,84,1.43,87,0.898,88,0.967,90,1.881,91,1.833,95,1.567,96,1.567,102,0.769,104,1.567,111,0.711,119,0.824,126,1.501,130,2.767,147,2.208,154,1.838,164,1.598,173,1.321,178,0.972,179,1.669,180,0.769,183,1.663,205,1.703,206,1.34,207,1.053,220,2.043,221,1.246,222,1.549,224,1.501,245,1.147,248,1.363,249,1.273,254,1.501,266,0.831,272,1.053,274,2.174,275,1.598,285,1.926,292,1.43,296,2.208,300,1.43,305,1.696,314,1.053,321,2.94,322,3.301,330,1.321,335,0.893,338,1.046,342,1.501,350,2.2,351,1.838,354,1.682,395,1.144,403,0.972,405,1.144,419,0.898,452,1.363,455,0.972,456,0.972,457,1.669,458,1.053,460,1.144,464,1.222,471,1.728,472,1.993,473,1.567,495,0.898,514,1.363,515,1.053,521,3.388,538,1.053,580,1.144,605,1.682,614,2.006,616,1.363,622,2.174,635,2.2,639,1.881,641,1.881,643,2.94,651,3.195,656,2.258,657,2.172,665,1.363,666,1.682,670,2.62,677,1.363,680,2.767,681,2.767,714,1.881,729,1.144,739,1.833,822,1.501,831,3.334,834,2.172,840,1.881,844,2.889,845,2.601,851,1.669,852,1.669,854,1.669,859,3.577,877,2.454,878,3.79,879,1.363,910,1.669,926,1.363,981,1.881,1008,2.637,1009,2.172,1010,2.637,1011,1.881,1012,5.074,1013,4.601,1014,2.637,1015,2.637,1016,3.879,1017,2.637,1018,2.637,1019,2.637,1020,2.637,1021,3.79,1022,2.637,1023,3.79,1024,2.637,1025,4.814,1026,2.637,1027,2.637,1028,2.637,1029,3.879,1030,4.601,1031,2.637,1032,2.637,1033,2.637,1034,2.637,1035,2.637,1036,2.454,1037,5.406,1038,2.637,1039,2.637,1040,4.601,1041,2.637,1042,2.637,1043,1.669,1044,3.879,1045,3.879,1046,2.637,1047,2.637,1048,2.637,1049,3.879,1050,2.637,1051,5.845,1052,2.172,1053,3.879,1054,2.637,1055,2.637,1056,2.637,1057,2.637,1058,2.637,1059,1.881,1060,2.637,1061,2.637,1062,2.637,1063,2.637,1064,2.637,1065,2.637,1066,3.879,1067,3.879,1068,3.879,1069,2.637,1070,2.637,1071,2.637,1072,2.637,1073,2.637,1074,2.637,1075,2.637,1076,2.637,1077,3.879,1078,2.637,1079,3.879,1080,1.363]],["keywords/template:templates/docs/data-layer/relationships",[]],["title/template:templates/docs/data-layer/serializers/ember-data-serializer",[]],["text/template:templates/docs/data-layer/serializers/ember-data-serializer",[1,0.667,13,0.661,14,0.767,15,1.155,19,2.467,20,0.847,23,0.936,24,0.778,26,0.731,29,1.254,40,0.667,47,1.597,67,0.977,68,1.221,75,1.08,78,2.175,105,0.977,119,1.157,145,1.263,148,1.263,197,1.879,204,3.447,205,2.029,238,1.879,266,2.029,268,1.879,269,2.742,286,2.196,305,2.303,314,1.731,338,1.86,340,3.447,344,2.047,346,2.467,347,4.458,348,3.842,350,2.974,351,1.731,354,2.584,355,3.447,357,4.317,367,2.047,400,1.597,419,1.476,538,1.731,582,5.148,659,2.467,852,2.742,874,2.196,1007,2.467,1025,3.569,1081,3.885,1082,4.334,1083,3.569,1084,3.569,1085,4.334,1086,6.25,1087,5.447,1088,3.569,1089,4.334,1090,3.569,1091,4.334,1092,4.334]],["keywords/template:templates/docs/data-layer/serializers/ember-data-serializer",[]],["title/template:templates/docs/data-layer/serializers/index",[338,1.008]],["text/template:templates/docs/data-layer/serializers/index",[1,0.702,9,1.43,11,1.96,13,0.649,14,0.791,15,1.12,16,1.444,17,2.13,20,0.968,23,0.885,24,0.802,26,0.742,29,1.325,34,1.09,38,1.498,40,0.519,42,1.187,44,1.494,48,0.791,49,2.298,52,0.732,54,1.792,55,0.677,57,0.856,58,1.275,67,0.997,68,0.491,70,2.014,75,1.115,79,0.677,80,2.83,84,1.379,86,1.59,87,0.856,88,1.321,89,1.623,95,0.856,101,0.732,102,0.732,103,1.43,104,0.856,106,0.451,111,0.677,113,0.856,119,1.052,121,2.069,125,1.43,138,1.035,139,1.474,144,1.494,145,1.544,146,1.187,147,2.13,148,1.304,150,1.429,151,2.312,154,1.003,155,1.43,157,1.09,158,1.181,180,0.732,182,1.187,183,1.435,185,2.069,186,1.59,190,0.862,197,1.09,205,1.904,206,0.533,210,1.275,211,3.683,213,2.069,219,1.623,220,1.275,221,1.768,244,1.523,245,0.933,248,1.299,249,1.125,250,1.544,254,1.43,263,1.003,270,1.003,272,1.003,275,1.179,285,1.275,286,1.379,300,1.379,304,2.368,309,3.534,310,1.43,312,0.926,313,1.187,318,1.003,331,1.187,335,1.22,338,1.879,340,1.59,341,1.792,342,1.43,344,1.187,347,1.792,348,2.13,351,1.494,354,1.09,355,1.59,357,1.684,358,2.872,370,1.59,372,1.003,400,1.379,402,1.275,403,1.826,417,1.299,419,0.856,446,1.786,450,1.792,453,1.187,456,0.926,457,1.59,463,2.621,464,1.409,465,1.979,468,2.13,470,1.187,471,1.805,472,0.926,473,0.856,481,1.59,496,1.43,507,2.298,512,2.113,515,1.494,516,1.379,532,1.979,533,1.299,534,1.792,546,1.299,568,1.59,580,1.09,581,2.069,583,1.59,605,2.298,614,1.299,616,1.299,624,2.562,625,1.299,635,1.623,654,1.187,658,1.792,661,2.341,665,2.312,666,1.09,670,1.43,671,1.299,729,1.09,733,2.069,739,1.187,743,1.792,762,2.368,768,2.368,776,1.43,819,2.855,821,2.069,829,2.069,837,1.299,842,0.926,845,2.496,851,1.59,874,2.301,879,1.935,881,2.368,893,1.59,894,2.069,895,2.368,908,1.59,911,2.669,914,1.59,915,2.368,919,2.069,920,2.069,926,1.935,927,2.821,952,3.19,955,1.792,957,1.792,969,1.43,972,2.069,973,2.368,974,2.669,975,2.872,985,1.935,1043,1.59,1080,2.312,1081,2.669,1093,2.512,1094,2.069,1095,4.081,1096,2.069,1097,2.512,1098,2.512,1099,2.069,1100,2.512,1101,2.069,1102,2.512,1103,3.082,1104,2.512,1105,2.512,1106,2.512,1107,1.792,1108,1.792,1109,2.069,1110,2.512,1111,1.792,1112,2.512,1113,2.069,1114,2.512,1115,2.512,1116,2.512,1117,4.472,1118,3.742,1119,2.512,1120,2.512,1121,2.069,1122,2.512,1123,2.512,1124,2.512,1125,2.069,1126,2.069,1127,2.512,1128,2.512,1129,2.669,1130,2.512,1131,2.069,1132,3.683,1133,2.512,1134,2.069,1135,2.069,1136,3.082,1137,2.069,1138,2.512,1139,2.512,1140,2.512,1141,2.069,1142,2.069,1143,2.512,1144,2.512,1145,2.512,1146,2.069,1147,2.368,1148,3.082,1149,3.742,1150,3.742,1151,2.069,1152,2.512,1153,2.512,1154,2.512,1155,2.512,1156,2.512,1157,2.512,1158,2.512]],["keywords/template:templates/docs/data-layer/serializers/index",[]],["title/template:templates/docs/getting-started/installation",[569,2.366]],["text/template:templates/docs/getting-started/installation",[1,0.441,13,0.546,14,0.834,16,1.311,20,0.879,26,0.552,38,1.503,40,0.682,56,1.766,78,1.795,81,1.995,82,3.527,84,2.054,88,1.121,94,1.95,99,2.56,105,1,108,1.766,112,1.657,119,1.286,122,3.207,128,1.95,142,1.795,155,3.449,158,1.184,164,1.756,166,2.56,171,2.124,174,3.207,175,2.845,201,3.173,210,1.531,223,2.324,251,4.32,268,1.95,276,3.207,277,1.898,292,2.232,330,2.063,343,2.845,376,3.975,392,2.56,402,1.531,403,1.657,423,3.207,461,2.124,479,2.845,569,4.119,580,1.95,627,3.207,661,2.633,664,3.207,665,2.324,822,2.56,837,2.324,1009,3.703,1161,4.59,1162,5.573,1163,4.496,1164,4.496,1165,4.496,1166,4.496,1167,6.057,1168,3.703,1169,4.496,1170,4.496,1171,4.496,1172,4.496,1173,4.496,1174,4.496,1175,4.496,1176,6.634,1177,2.845,1178,4.496,1179,3.703,1180,3.527,1181,3.975,1182,4.496,1183,4.496]],["keywords/template:templates/docs/getting-started/installation",[]],["title/template:templates/docs/getting-started/overview",[1184,3.079]],["text/template:templates/docs/getting-started/overview",[1,0.706,2,0.623,4,1.348,6,1.513,11,1.246,13,0.61,14,0.707,15,1.179,19,1.041,20,0.954,23,0.914,24,0.75,26,0.674,29,1.226,32,0.73,33,1.666,34,0.793,38,1.552,40,0.638,42,1.382,43,1.984,44,1.827,47,1.541,48,0.922,50,1.371,51,1.157,52,0.533,53,1.041,55,1.128,57,1.246,58,1.814,59,0.864,67,0.92,68,0.954,69,0.945,73,1.666,75,1.405,79,1.316,84,1.078,87,1.425,88,1.405,89,1.814,91,0.864,96,0.997,101,1.219,102,0.533,105,0.956,106,0.876,108,1.219,111,0.789,112,1.799,116,0.945,117,1.157,119,0.888,124,1.505,125,1.041,128,1.269,129,1.041,132,0.793,138,1.279,139,1.484,142,0.73,143,0.674,144,2.127,145,1.334,147,1.666,148,1.423,150,1.436,151,1.513,156,0.945,157,1.587,158,0.954,160,2.41,165,1.505,171,0.864,172,2.083,173,1.246,178,1.348,180,1.334,183,1.217,190,0.842,192,1.304,194,1.382,195,0.864,197,1.269,204,1.157,205,1.813,206,1.131,207,1.169,209,0.864,210,1.425,216,1.304,219,0.793,220,0.997,222,0.73,224,1.041,226,0.922,237,1.505,238,0.793,244,1.663,245,1.328,249,0.888,250,1.845,252,1.157,255,1.304,262,2.083,263,0.73,268,0.793,270,0.73,272,1.461,274,0.864,275,0.922,277,1.246,284,1.505,286,0.674,294,0.864,305,1.078,308,1.304,312,0.674,314,1.169,318,1.461,321,1.382,322,1.513,328,1.382,331,0.864,334,1.157,335,1.18,338,1.481,343,1.157,344,0.864,350,0.793,351,0.73,355,1.157,358,0.945,364,2.083,370,1.851,372,0.73,395,0.793,396,0.864,399,1.587,401,1.157,402,1.246,404,1.157,409,1.382,414,1.269,415,0.945,419,0.623,437,0.864,446,1.461,447,2.315,448,1.505,449,1.041,452,2.524,453,0.864,454,1.041,455,0.674,456,1.348,460,0.793,461,1.382,463,2.86,464,1.775,465,1.949,466,1.041,467,1.041,468,1.666,471,2.027,472,1.686,473,1.425,475,0.73,484,1.587,485,1.587,486,1.729,495,1.746,498,1.157,501,0.945,507,1.461,512,1.976,515,1.67,516,0.674,518,1.157,520,2.087,521,1.892,522,1.041,523,1.157,524,1.505,528,1.505,532,2.127,538,1.169,540,1.157,545,1.304,546,1.513,547,1.505,548,1.304,549,1.157,550,0.945,551,1.505,554,1.729,555,1.304,557,1.304,568,1.157,579,1.157,584,1.157,589,1.304,605,1.814,616,0.945,618,1.157,622,0.864,624,0.945,625,0.945,634,1.851,635,1.269,642,1.513,643,1.729,654,0.864,655,1.304,656,1.169,666,0.793,671,0.945,677,0.945,686,1.157,697,1.041,705,1.041,706,1.505,707,1.304,724,1.157,725,1.157,727,2.083,729,1.587,731,1.157,734,1.157,735,1.157,742,1.513,752,2.087,759,1.505,766,1.505,771,1.505,787,1.851,818,1.505,819,2.306,831,1.892,837,0.945,842,0.674,845,2.223,848,1.382,862,1.505,864,1.505,866,1.041,873,3.264,874,0.674,875,1.304,876,2.087,908,1.157,911,2.61,915,2.315,926,1.513,927,2.083,930,1.157,934,1.851,956,1.304,958,1.304,962,1.505,964,1.505,968,1.505,973,1.157,975,1.892,985,0.945,996,1.505,1080,0.945,1094,2.41,1095,3.013,1099,1.505,1108,1.304,1109,1.505,1125,2.41,1126,1.505,1132,1.505,1134,1.505,1135,2.41,1137,1.505,1147,1.157,1184,1.505,1185,1.828,1186,1.505,1187,2.41,1188,4.183,1189,1.828,1190,1.828,1191,1.828,1192,1.828,1193,1.304,1194,1.828,1195,1.828,1196,1.505,1197,1.828,1198,1.828,1199,1.828,1200,1.828,1201,1.505,1202,4.576,1203,3.013,1204,1.828,1205,2.41,1206,1.828,1207,1.828,1208,4.576,1209,4.576,1210,2.926,1211,2.926,1212,1.828,1213,1.828,1214,1.304,1215,1.157,1216,0.945,1217,1.041,1218,1.304,1219,1.157,1220,1.304,1221,1.157,1222,2.61,1223,1.828,1224,1.828,1225,1.828,1226,2.087,1227,1.304,1228,1.505,1229,1.828,1230,1.505,1231,1.828,1232,1.828,1233,1.828,1234,2.41,1235,2.926,1236,1.828,1237,1.828,1238,1.828,1239,3.659,1240,2.926,1241,2.926,1242,2.926,1243,2.926,1244,1.828,1245,1.828,1246,1.828,1247,2.41,1248,1.304,1249,1.505,1250,1.505,1251,2.926,1252,1.828,1253,1.828,1254,1.828,1255,1.828,1256,1.828,1257,1.828,1258,2.926,1259,1.505,1260,3.659,1261,1.828,1262,1.505,1263,1.304,1264,1.304,1265,1.157,1266,1.505,1267,1.505,1268,1.828,1269,1.828,1270,1.304,1271,1.505,1272,1.157,1273,1.304,1274,1.828,1275,2.926,1276,1.828,1277,1.828,1278,1.505,1279,2.41,1280,1.828,1281,1.828,1282,1.304,1283,1.828]],["keywords/template:templates/docs/getting-started/overview",[]],["title/template:templates/docs/getting-started/upgrade-guide/index",[52,0.815,316,1.995]],["text/template:templates/docs/getting-started/upgrade-guide/index",[0,0.752,1,0.697,2,1.811,4,1.074,6,1.157,9,1.953,13,0.636,14,0.637,15,1.05,16,1.215,18,1.659,19,0.752,20,1.061,23,0.953,24,0.402,26,0.733,28,1.417,29,1.452,32,1.163,33,0.752,34,0.971,35,1.275,37,0.836,38,1.035,40,0.642,42,2.45,43,1.263,44,0.894,46,1.844,47,1.638,48,1.081,49,2.027,50,1.121,51,0.836,52,1.512,53,2.185,55,0.604,56,0.385,57,1.168,58,0.45,59,0.624,60,1.275,64,1.088,65,1.263,67,0.974,68,0.913,70,0.45,73,0.752,75,1.354,77,0.573,78,1.945,79,1.198,81,0.705,83,0.752,84,1.415,85,1.417,86,0.836,87,0.45,88,1.423,93,1.088,94,0.573,95,0.763,96,1.168,97,0.416,99,0.752,101,1.512,102,0.385,104,1.168,105,0.748,106,0.237,107,0.942,108,0.653,111,0.356,112,2.256,113,1.592,114,1.088,116,1.157,117,1.417,119,1.129,125,1.275,126,0.752,128,1.488,129,0.752,131,1.597,132,0.573,135,0.836,136,2.056,137,0.836,138,1.039,139,1.379,140,0.836,142,0.528,143,0.487,145,1.215,148,1,150,1.035,151,2.748,154,1.163,155,1.275,157,1.263,158,0.815,164,1.314,166,2.185,167,0.683,171,1.97,173,1.168,174,0.942,175,1.417,177,1.844,178,0.825,180,1.119,183,1.442,190,1.076,191,1.088,194,0.624,197,0.971,201,1.275,205,1.472,206,0.885,209,0.624,210,1.42,212,1.417,214,1.417,216,0.942,220,1.307,221,1.376,222,0.894,223,1.985,226,1.081,238,0.573,244,1.513,245,0.855,249,0.943,250,1.295,251,0.942,253,0.683,259,1.088,262,2.185,264,0.942,266,0.416,267,1.088,268,0.971,270,0.528,272,1.163,273,1.088,274,0.624,275,0.416,277,1.168,279,1.597,281,1.088,285,0.45,287,1.088,290,0.836,292,1.074,293,1.597,294,1.058,296,1.275,300,1.415,303,1.417,305,2.073,307,0.942,310,1.275,312,1.415,313,1.058,314,1.37,316,4.012,317,1.088,318,1.163,321,1.814,322,1.506,323,1.985,325,1.088,326,1.088,327,3.66,328,1.376,329,1.088,330,0.992,331,1.376,332,0.942,335,0.96,338,1.464,341,2.738,342,1.275,343,3.436,345,1.659,346,1.275,348,0.752,349,0.752,350,1.665,351,0.894,354,0.573,356,1.088,358,1.773,366,1.088,367,0.624,389,2.17,392,0.752,395,0.573,399,0.971,400,1.415,402,0.992,403,1.074,405,0.573,406,2.078,419,1.592,424,1.597,440,1.088,444,0.836,446,1.37,447,0.836,454,1.659,455,1.537,459,0.942,460,1.488,461,1.376,470,0.624,471,1.766,472,0.487,473,0.992,475,1.163,476,0.836,481,1.417,495,1.811,496,0.752,501,1.773,505,1.597,506,0.942,507,0.528,509,1.417,513,0.836,514,0.683,516,1.074,518,0.836,521,1.985,522,1.275,525,1.597,532,1.163,538,0.528,545,1.597,546,0.683,549,1.417,550,0.683,554,0.624,555,1.597,559,0.836,560,4.473,568,0.836,569,2.957,570,2.825,571,2.738,580,0.573,584,0.836,589,0.942,595,1.844,605,1.927,621,0.752,622,2.208,624,0.683,625,1.157,627,1.597,634,1.417,635,0.573,637,1.597,642,1.157,643,0.624,648,2.825,654,1.058,655,0.942,656,1.774,659,0.752,661,0.624,664,1.597,670,1.275,671,0.683,674,0.752,677,1.157,686,0.836,688,1.597,694,0.836,705,0.752,707,0.942,714,0.942,725,0.836,731,2.811,742,1.157,743,0.942,746,0.942,747,1.844,749,0.836,764,1.088,768,0.836,770,0.942,776,0.752,783,1.844,786,1.773,788,0.942,790,2.399,791,2.399,815,2.825,816,2.446,819,1.814,831,2.681,837,0.683,840,0.942,842,0.825,843,1.417,845,1.665,848,1.058,852,1.843,854,0.836,855,1.088,858,1.844,859,1.417,866,1.659,873,0.942,874,0.487,876,0.942,877,1.417,882,0.836,896,1.844,904,0.942,908,0.836,914,0.836,921,1.088,926,0.683,927,2.53,934,1.843,947,1.597,952,1.597,955,1.597,966,0.942,969,0.752,973,1.417,974,0.942,975,2.416,983,1.088,985,1.157,1003,1.088,1007,1.953,1011,0.942,1021,3.66,1036,1.417,1043,1.417,1052,1.088,1059,0.942,1081,1.597,1083,1.088,1084,1.088,1088,1.844,1090,1.088,1103,1.088,1108,2.078,1111,1.597,1131,1.844,1136,3.849,1141,1.088,1142,1.088,1161,1.844,1177,1.843,1180,0.836,1187,1.088,1201,1.844,1203,1.844,1205,1.844,1216,1.773,1217,0.752,1248,0.942,1259,1.088,1265,1.417,1273,0.942,1284,4.17,1285,2.913,1286,2.239,1287,2.913,1288,2.239,1289,4.443,1290,1.088,1291,3.838,1292,1.088,1293,1.321,1294,3.838,1295,1.321,1296,2.399,1297,1.321,1298,1.321,1299,3.838,1300,1.321,1301,1.321,1302,1.321,1303,1.321,1304,2.239,1305,3.161,1306,0.942,1307,1.321,1308,2.239,1309,3.43,1310,1.321,1311,1.321,1312,1.088,1313,2.239,1314,1.321,1315,1.321,1316,1.321,1317,1.321,1318,2.239,1319,1.321,1320,1.321,1321,1.321,1322,1.088,1323,1.321,1324,2.913,1325,3.43,1326,1.321,1327,1.321,1328,2.913,1329,2.913,1330,2.239,1331,3.838,1332,1.321,1333,2.239,1334,3.43,1335,3.43,1336,1.321,1337,1.321,1338,1.321,1339,1.321,1340,1.321,1341,2.239,1342,1.321,1343,2.239,1344,1.321,1345,1.321,1346,1.088,1347,1.321,1348,1.321,1349,4.17,1350,1.321,1351,2.239,1352,1.321,1353,1.597,1354,1.088,1355,3.43,1356,2.239,1357,1.321,1358,1.321,1359,1.321,1360,1.321,1361,1.321,1362,1.321,1363,1.321,1364,1.321,1365,2.239,1366,2.913,1367,2.239,1368,1.321,1369,1.321,1370,1.321,1371,1.321,1372,1.321,1373,1.321,1374,2.239,1375,2.239,1376,2.239,1377,1.321,1378,1.321,1379,1.844,1380,1.321,1381,1.321,1382,1.088,1383,1.321,1384,1.088,1385,1.321,1386,1.088,1387,2.913,1388,2.913,1389,3.43,1390,1.321,1391,4.87,1392,0.942,1393,1.088,1394,1.321,1395,1.321,1396,2.239,1397,1.321,1398,2.239,1399,1.321,1400,1.321,1401,2.239,1402,1.321,1403,1.321,1404,1.321,1405,2.399,1406,1.321,1407,1.321,1408,1.321,1409,1.321,1410,2.239,1411,1.088,1412,1.321,1413,1.321,1414,2.913,1415,1.321,1416,1.321,1417,1.321,1418,3.43,1419,2.239,1420,1.321,1421,1.321,1422,1.321,1423,1.321,1424,1.321,1425,1.321,1426,1.321,1427,1.321,1428,1.088,1429,1.321,1430,1.088,1431,1.321,1432,1.321,1433,1.321,1434,1.321,1435,1.321,1436,1.321,1437,1.321,1438,1.321,1439,3.838,1440,1.321,1441,1.321,1442,1.321,1443,1.321,1444,1.321,1445,1.321,1446,1.321,1447,2.239,1448,2.239,1449,1.321,1450,1.321,1451,1.321,1452,1.321,1453,1.321,1454,2.239,1455,1.321,1456,1.321,1457,1.321,1458,1.321,1459,1.321,1460,1.321,1461,1.321,1462,2.239,1463,1.321,1464,0.942,1465,1.321,1466,1.321,1467,1.321,1468,1.321,1469,1.321,1470,1.321,1471,1.321,1472,1.321,1473,3.43,1474,1.321,1475,1.088,1476,1.088,1477,1.321,1478,1.321,1479,1.088,1480,1.321,1481,2.239,1482,2.239,1483,1.321,1484,1.088,1485,1.321,1486,1.321,1487,1.321,1488,1.321,1489,1.321,1490,1.321,1491,1.844,1492,2.239,1493,1.321,1494,1.321,1495,1.321,1496,1.321,1497,1.321,1498,1.321,1499,1.321,1500,1.321]],["keywords/template:templates/docs/getting-started/upgrade-guide/index",[]],["title/template:templates/docs/getting-started/upgrade-guide/v2-deprecations",[78,0.743,314,0.743,1353,1.326,1501,1.531]],["text/template:templates/docs/getting-started/upgrade-guide/v2-deprecations",[26,0.68,67,0.994,68,1.082,78,2.212,138,1.082,244,1.887,314,2.212,319,4.562,1353,3.951,1501,4.562]],["keywords/template:templates/docs/getting-started/upgrade-guide/v2-deprecations",[]],["title/template:templates/docs/getting-started/what-is-mirage",[40,0.366]],["text/template:templates/docs/getting-started/what-is-mirage",[13,0.604,14,0.799,15,1.105,20,0.814,23,0.624,33,3.025,34,1.807,38,1.577,40,0.672,41,2.636,48,1.313,50,1.223,55,1.123,56,1.214,68,0.814,70,1.81,79,1.716,81,1.313,89,1.807,92,2.372,102,1.549,103,2.372,104,1.419,105,1.167,106,0.953,108,1.897,113,1.419,118,2.154,119,1.242,138,0.814,142,1.664,143,2.398,144,1.664,158,1.244,183,1.039,190,1.223,195,3.007,207,1.664,226,1.313,248,2.154,249,0.885,262,3.33,268,1.807,285,1.419,286,1.535,303,2.636,323,2.154,335,0.959,338,1.123,364,3.025,376,2.972,396,1.968,403,1.535,405,1.807,410,2.372,415,2.154,449,2.372,450,2.972,452,2.747,453,1.968,479,2.636,495,1.992,506,2.972,507,2.46,509,2.636,554,2.51,571,4.394,642,3.024,654,1.968,674,2.372,677,3.185,697,3.025,749,2.636,760,2.372,767,2.972,774,3.431,819,1.968,842,1.535,893,2.636,912,3.431,957,2.972,961,2.972,985,2.154,986,3.431,1107,2.972,1111,2.972,1181,2.972,1193,2.972,1270,3.789,1282,2.972,1306,2.972,1386,3.431,1392,2.972,1405,3.431,1502,4.818,1503,4.166,1504,5.85,1505,4.166,1506,4.166,1507,4.166,1508,4.166,1509,4.166,1510,3.431,1511,5.313,1512,5.313,1513,4.166,1514,3.431,1515,4.166,1516,4.166,1517,4.166,1518,4.166,1519,4.166]],["keywords/template:templates/docs/getting-started/what-is-mirage",[]],["title/template:templates/docs/route-handlers/functions",[68,0.731]],["text/template:templates/docs/route-handlers/functions",[1,0.708,2,1.833,4,1.295,11,1.197,13,0.633,14,0.687,15,1.06,16,1.24,20,0.831,23,0.526,24,1.004,26,0.661,29,0.532,34,1.524,35,2.705,38,1.783,40,0.417,41,1.463,43,1.003,44,2.041,49,1.524,53,2.001,55,0.948,56,0.674,57,1.964,58,1.741,59,1.092,65,1.003,67,0.631,68,1.27,75,1.185,77,1.003,79,0.948,81,0.728,87,0.787,88,0.576,92,2.421,95,1.197,96,1.618,97,1.34,105,0.415,106,0.966,108,0.674,111,0.948,112,0.852,117,1.463,119,1.143,132,1.524,138,1.278,139,1.64,143,0.852,144,2.234,145,0.674,146,1.092,148,0.674,150,0.623,151,1.195,155,1.316,157,2.061,158,1.127,164,0.728,172,2.421,178,0.852,180,1.631,183,0.876,190,0.979,205,1.34,206,0.746,207,0.923,209,1.092,214,1.463,219,1.003,220,1.906,223,1.195,225,1.649,238,1.003,244,0.787,245,0.576,249,0.746,250,1.85,263,0.923,266,1.107,268,2.061,269,2.224,270,1.898,275,1.107,277,1.197,285,1.964,286,1.295,290,1.463,292,0.852,294,1.092,300,0.852,304,1.463,305,1.751,318,1.698,330,1.618,331,1.092,332,1.649,334,1.463,335,0.979,337,2.895,338,1.452,339,1.904,344,1.661,351,0.923,354,2.061,358,1.195,364,1.316,368,3.913,372,2.041,389,2.691,400,1.295,403,0.852,405,1.844,417,1.195,419,0.787,444,3.234,446,1.898,452,2.643,453,1.092,454,1.316,456,0.852,458,0.923,463,1.844,464,1.107,465,1.698,466,2.421,467,2.421,468,3.186,471,1.741,472,0.852,473,0.787,479,1.463,498,2.224,501,1.195,516,1.567,518,1.463,532,1.404,533,2.199,538,0.923,541,1.904,554,1.092,558,1.463,559,1.463,579,2.224,583,1.463,611,1.649,614,1.195,621,1.316,622,2.009,700,1.904,703,2.001,723,3.913,724,1.463,732,1.649,739,1.092,741,1.649,816,1.649,837,1.195,845,1.524,848,1.092,866,1.316,868,1.649,874,1.984,875,1.649,879,1.817,881,2.691,882,1.463,895,2.691,910,1.463,914,1.463,927,1.316,930,1.463,948,1.904,956,1.649,959,2.507,961,1.649,966,1.649,969,1.316,970,2.507,971,1.904,1011,1.649,1036,2.224,1059,1.649,1096,1.904,1121,1.904,1129,3.033,1146,2.895,1147,2.691,1148,2.895,1177,1.463,1180,2.224,1234,1.904,1262,1.904,1263,3.389,1264,2.507,1265,1.463,1266,1.904,1267,1.904,1272,1.463,1278,1.904,1279,1.904,1292,2.895,1305,1.904,1312,1.904,1322,2.895,1354,4.21,1475,1.904,1476,1.904,1484,1.904,1491,1.904,1520,3.515,1521,2.895,1522,2.895,1523,2.312,1524,2.312,1525,4.752,1526,2.312,1527,2.312,1528,2.312,1529,2.312,1530,3.033,1531,3.515,1532,1.904,1533,1.904,1534,2.312,1535,2.312,1536,2.312,1537,2.312,1538,2.312,1539,4.752,1540,4.253,1541,2.312,1542,2.312,1543,2.312,1544,2.312,1545,2.312,1546,2.312,1547,2.312,1548,3.515,1549,2.312,1550,2.312,1551,3.515,1552,2.312,1553,2.312,1554,3.515,1555,2.312,1556,2.312,1557,2.312,1558,2.312,1559,2.312,1560,2.312,1561,1.904,1562,2.312,1563,2.312,1564,2.312,1565,1.904,1566,2.312,1567,2.312,1568,2.312,1569,2.312,1570,2.312,1571,2.312,1572,2.895,1573,2.895,1574,2.895,1575,3.515,1576,1.904,1577,2.312,1578,2.312,1579,2.312,1580,2.312,1581,2.312,1582,2.312,1583,3.515,1584,2.895,1585,2.312,1586,2.312,1587,2.312,1588,2.312,1589,2.312,1590,2.312,1591,2.312,1592,2.312,1593,2.312]],["keywords/template:templates/docs/route-handlers/functions",[]],["title/template:templates/docs/route-handlers/shorthands",[43,1.622]],["text/template:templates/docs/route-handlers/shorthands",[1,0.706,2,1.782,11,0.958,13,0.567,14,0.499,15,0.995,18,3.159,20,0.795,23,0.866,24,0.857,26,0.345,35,3.395,38,1.725,40,0.513,42,2.884,43,3.023,49,2.406,50,0.936,65,1.22,68,0.795,75,1.304,89,1.22,91,1.329,95,2.119,102,0.82,104,1.385,105,0.505,111,0.759,119,1.178,138,1.13,139,1.551,143,1.037,145,1.392,146,1.329,148,1.392,154,1.907,157,1.22,158,0.795,167,1.454,173,0.958,179,1.78,180,1.617,182,1.329,183,0.701,190,0.648,205,1.879,206,0.863,221,2.256,224,2.315,245,1.383,249,1.321,250,1.617,252,2.573,266,0.886,268,1.763,285,1.626,290,1.78,291,2.9,292,1.498,294,1.329,302,2.006,305,1.037,330,2.119,335,0.648,338,1.096,354,2.071,389,3.511,396,1.329,400,1.037,412,2.573,415,1.454,446,1.624,456,1.037,457,1.78,458,1.123,460,1.763,463,1.763,468,2.315,475,1.123,480,2.9,494,1.78,525,3.957,532,1.123,533,3.156,553,3.349,554,1.329,579,1.78,583,1.78,605,1.22,606,1.78,625,1.454,656,1.907,670,3.159,677,1.454,694,1.78,699,2.317,703,1.601,705,1.601,712,5.028,725,3.021,750,2.317,765,2.317,788,2.006,819,1.921,822,1.601,845,2.698,874,1.498,877,3.659,879,1.454,881,2.573,882,2.573,904,2.9,915,1.78,926,1.454,930,1.78,934,1.78,947,2.9,958,2.006,959,2.006,969,2.315,970,3.731,975,2.468,985,2.102,1007,1.601,1080,2.468,1113,3.932,1129,3.957,1147,1.78,1263,2.006,1264,2.006,1265,2.573,1273,2.006,1282,2.006,1379,4.308,1393,3.932,1502,2.317,1510,2.317,1521,2.317,1522,3.349,1572,2.317,1573,2.317,1574,3.349,1576,2.317,1584,5.202,1594,2.813,1595,2.813,1596,2.813,1597,5.963,1598,2.813,1599,2.813,1600,4.066,1601,2.813,1602,4.066,1603,5.783,1604,2.813,1605,4.066,1606,5.231,1607,2.813,1608,4.066,1609,6.105,1610,2.813,1611,2.813,1612,2.813,1613,2.813,1614,4.775,1615,2.813,1616,2.813,1617,2.813,1618,2.813,1619,2.813,1620,2.813,1621,2.813,1622,2.813,1623,2.813,1624,2.813,1625,2.813,1626,4.066,1627,2.813,1628,2.813]],["keywords/template:templates/docs/route-handlers/shorthands",[]],["title/template:templates/docs/testing/acceptance-tests",[106,0.502,414,1.213]],["text/template:templates/docs/testing/acceptance-tests",[1,0.695,2,0.93,4,1.901,6,2.96,13,0.593,14,0.673,15,0.49,16,0.796,17,1.555,20,0.534,22,2.25,23,0.409,24,0.842,26,0.576,29,1.394,40,0.593,41,1.729,42,1.291,44,1.091,48,0.861,50,1.081,52,0.796,53,1.555,55,0.737,57,1.356,58,0.93,60,2.266,63,1.948,67,0.714,68,0.534,69,2.058,70,0.93,79,1.266,81,1.254,82,1.729,84,1.007,85,2.519,87,1.356,88,0.681,89,1.185,91,1.291,94,1.185,97,1.479,101,1.369,105,1.108,106,1.273,108,1.369,112,1.731,113,0.93,118,1.412,119,0.845,132,1.185,138,1.072,141,2.438,145,1.723,150,0.737,152,2.519,154,1.091,156,2.96,157,1.726,158,0.918,164,1.254,173,0.93,176,1.729,178,1.007,186,1.729,190,1.081,194,1.291,203,2.25,206,0.845,210,0.93,222,1.091,225,1.948,226,1.625,244,0.93,245,0.992,247,2.25,248,1.412,249,0.845,250,1.504,253,2.667,260,2.839,263,1.091,266,1.254,272,1.59,274,1.291,275,1.479,277,0.93,296,2.266,300,1.007,312,1.467,330,2.013,331,2.438,344,1.291,346,1.555,349,1.555,351,1.875,372,1.59,395,1.185,396,2.591,398,3.867,399,1.185,400,1.007,401,1.729,402,0.93,404,1.729,405,1.185,409,1.291,414,2.036,417,2.428,423,1.948,424,1.948,437,1.291,454,1.555,458,1.091,461,1.881,463,2.788,464,1.804,465,1.875,470,2.438,473,0.93,475,1.091,476,2.519,478,2.673,483,3.122,484,2.563,485,2.627,486,2.964,494,1.729,495,1.868,501,1.412,512,1.291,514,2.058,515,1.59,516,1.007,523,1.729,530,2.25,532,1.091,548,1.948,549,1.729,557,1.948,580,1.185,584,1.729,618,3.908,621,2.266,624,1.412,625,1.412,630,1.729,639,1.948,642,1.412,654,1.291,656,1.091,659,1.555,666,1.185,671,2.058,675,3.278,703,2.673,727,2.673,729,1.185,731,2.519,732,3.68,734,2.519,735,2.971,736,3.349,737,3.867,739,1.291,740,2.25,741,1.948,746,1.948,767,1.948,769,2.25,776,1.555,782,1.948,786,2.058,787,1.729,822,2.266,824,2.25,831,2.058,838,2.25,842,1.007,848,1.291,893,1.729,954,3.278,981,1.948,1101,2.25,1107,1.948,1214,1.948,1215,1.729,1216,2.058,1217,1.555,1218,1.948,1219,1.729,1220,1.948,1221,1.729,1222,1.948,1226,3.68,1227,1.948,1228,2.25,1250,2.25,1270,1.948,1272,3.265,1290,2.25,1411,2.25,1479,2.25,1530,1.948,1565,2.25,1629,3.98,1630,2.732,1631,2.25,1632,2.732,1633,2.732,1634,2.732,1635,3.98,1636,2.732,1637,2.732,1638,2.25,1639,3.98,1640,2.732,1641,2.732,1642,4.696,1643,2.732,1644,4.696,1645,2.732,1646,2.732,1647,2.732,1648,2.25,1649,2.732,1650,2.732,1651,2.732,1652,2.732,1653,2.732,1654,2.732,1655,3.278,1656,3.98,1657,2.25,1658,2.732,1659,1.948,1660,3.98,1661,1.948,1662,2.732,1663,2.732,1664,2.732,1665,2.732,1666,2.732,1667,2.732,1668,3.98,1669,3.98,1670,3.98,1671,2.732,1672,2.732,1673,2.519]],["keywords/template:templates/docs/testing/acceptance-tests",[]],["title/template:templates/docs/testing/assertions",[141,1.767]],["text/template:templates/docs/testing/assertions",[1,0.695,2,1.566,13,0.514,14,0.727,15,1.162,16,1.34,17,1.907,23,0.846,24,0.601,26,0.411,32,1.338,38,1.721,40,0.6,47,1.234,50,1.364,51,2.119,52,0.976,55,1.524,56,0.976,59,1.582,75,0.835,79,1.24,83,1.907,88,0.835,92,2.618,94,1.994,95,1.566,97,1.055,98,2.759,100,2.759,103,2.618,104,1.141,105,0.825,106,1.063,108,0.976,112,1.234,113,1.141,119,0.711,122,2.389,123,3.787,127,2.759,128,1.994,129,1.907,130,2.389,131,3.279,132,1.994,133,2.389,138,1.026,141,3.26,142,2.713,143,2.083,144,2.097,145,1.34,148,0.976,150,1.65,152,3.576,154,1.338,156,2.714,158,1.196,164,1.055,183,0.835,206,0.711,209,2.172,210,1.141,214,2.119,219,1.453,220,1.141,226,1.449,250,1.34,252,2.119,254,1.907,263,2.257,265,2.759,277,1.141,313,1.582,335,0.771,349,1.907,367,1.582,410,1.907,415,1.732,417,1.732,428,2.759,429,2.759,453,1.582,455,1.234,464,1.449,471,1.141,473,1.141,478,3.217,480,4.031,481,3.748,483,1.907,484,2.277,485,2.277,486,3.059,496,1.907,499,5.161,507,2.097,512,1.582,514,1.732,516,1.695,527,2.119,531,2.759,536,3.279,537,3.745,538,1.836,540,2.119,550,1.732,558,2.909,564,2.759,580,1.453,641,2.389,643,1.582,656,2.097,661,2.67,665,1.732,671,1.732,674,1.907,736,3.279,739,1.582,742,1.732,752,2.389,776,1.907,779,2.759,787,2.119,842,1.234,854,2.119,874,1.234,879,1.732,895,2.119,922,2.759,975,1.732,1007,1.907,1023,2.759,1080,1.732,1168,2.759,1177,2.119,1186,2.759,1222,3.279,1226,3.279,1247,2.759,1271,2.759,1306,2.389,1464,2.389,1638,2.759,1648,2.759,1659,2.389,1661,3.279,1674,3.349,1675,3.349,1676,5.25,1677,3.349,1678,3.349,1679,5.651,1680,3.349,1681,3.349,1682,3.349,1683,3.349,1684,5.25,1685,3.349,1686,3.349,1687,3.349,1688,3.349,1689,3.349,1690,3.349,1691,3.349,1692,3.349,1693,3.349,1694,3.349,1695,3.349,1696,3.349,1697,3.349,1698,3.349,1699,3.349,1700,3.349,1701,3.349,1702,3.349,1703,3.349,1704,2.759]],["keywords/template:templates/docs/testing/assertions",[]],["title/template:templates/docs/testing/integration-and-unit-tests",[106,0.401,786,1.155,1673,1.413]],["text/template:templates/docs/testing/integration-and-unit-tests",[1,0.708,4,1.374,13,0.625,14,0.791,15,0.995,18,2.539,20,0.489,23,0.973,24,0.449,26,0.307,29,1.524,34,1.084,38,0.674,40,0.641,42,1.181,44,0.998,47,0.921,50,0.859,55,1.426,56,0.729,58,1.801,67,0.449,68,0.729,69,1.293,79,1.202,81,1.405,84,0.921,85,2.359,88,1.112,95,1.27,97,0.788,101,0.729,102,0.729,104,1.27,105,0.949,106,1.145,111,1.006,113,1.27,119,0.947,138,0.871,141,2.498,142,1.489,143,0.921,150,1.333,158,0.729,173,1.27,180,0.729,182,1.181,190,0.576,194,1.181,195,1.762,197,1.084,206,1.177,207,2.112,221,1.181,222,0.998,226,0.788,238,1.084,245,1.232,249,0.947,250,0.729,253,2.556,254,1.423,266,0.788,272,0.998,274,2.335,277,0.852,285,1.519,300,1.374,302,1.783,310,1.423,312,1.822,328,1.762,335,0.576,338,1.006,345,1.423,392,1.423,399,1.084,405,1.084,406,1.783,407,2.059,414,1.934,449,3.436,458,0.998,460,1.084,464,1.965,465,1.489,470,1.181,471,0.852,472,0.921,475,0.998,478,2.123,484,2.405,485,2.405,486,3.09,495,1.27,500,3.526,504,2.059,507,0.998,512,1.762,515,1.489,516,0.921,522,1.423,533,1.293,538,1.489,540,1.582,550,1.293,586,1.783,606,3.128,630,1.582,635,1.084,640,1.783,729,1.934,734,1.582,760,1.423,782,1.783,786,1.928,842,0.921,843,1.582,844,1.423,848,2.107,868,1.783,871,5.136,872,2.059,874,1.643,888,2.059,910,1.582,942,2.059,1036,1.582,1151,2.059,1179,2.059,1215,3.128,1216,2.867,1217,2.814,1219,3.509,1221,3.509,1227,1.783,1248,1.783,1249,2.059,1272,3.128,1296,3.672,1346,2.059,1382,2.059,1392,1.783,1428,3.071,1430,2.059,1464,1.783,1514,2.059,1530,1.783,1561,2.059,1655,2.059,1657,2.059,1659,3.526,1661,3.526,1673,2.359,1705,2.5,1706,4.943,1707,4.943,1708,5.545,1709,5.745,1710,5.545,1711,5.545,1712,5.745,1713,3.729,1714,3.729,1715,2.5,1716,3.729,1717,2.5,1718,2.5,1719,2.5,1720,2.5,1721,2.5,1722,6.144,1723,6.494,1724,5.288,1725,2.5,1726,4.943,1727,4.943,1728,2.5,1729,2.5,1730,3.729,1731,4.459,1732,2.5,1733,3.729,1734,3.729,1735,4.459,1736,3.729,1737,3.729,1738,2.5,1739,3.729,1740,3.729,1741,2.5,1742,2.5,1743,3.729,1744,2.5,1745,2.5,1746,2.5,1747,2.5,1748,2.5,1749,2.5,1750,2.5,1751,2.5,1752,2.5,1753,3.729,1754,4.459,1755,2.5,1756,2.5,1757,2.5,1758,4.459,1759,2.5,1760,2.5]],["keywords/template:templates/docs/testing/integration-and-unit-tests",[]],["title/template:templates/docs/testing/setup-mirage",[106,0.401,285,0.761,1216,1.155]],["text/template:templates/docs/testing/setup-mirage",[1,0.708,13,0.519,23,0.621,26,0.509,29,1.578,40,0.603,68,1.036,71,2.626,75,1.035,77,1.8,78,1.657,95,1.413,96,1.413,101,1.21,105,1.048,106,1.251,111,1.119,116,2.74,134,2.96,135,2.626,136,3.176,137,2.626,138,0.811,139,1.321,140,2.626,158,0.811,171,1.961,190,1.344,219,1.8,244,1.413,245,1.035,246,5.067,249,1.125,253,2.145,266,1.307,275,1.307,285,1.805,306,3.418,333,3.418,334,2.626,335,0.955,367,2.504,402,1.413,414,1.8,444,2.626,465,1.657,466,2.362,467,2.362,484,2.532,485,2.532,516,2.152,533,2.145,624,2.145,705,2.362,735,3.694,786,2.145,842,1.529,1181,2.96,1214,4.164,1215,3.694,1216,3.286,1217,3.324,1218,4.164,1219,3.694,1220,4.164,1221,3.694,1384,3.418,1532,3.418,1533,3.418,1631,4.809,1673,2.626,1761,4.15,1762,4.15,1763,4.15,1764,4.15]],["keywords/template:templates/docs/testing/setup-mirage",[]],["title/template:templates/index",[102,1.09]],["text/template:templates/index",[1,0.515,13,0.515,48,1.657,57,1.791,58,1.791,68,1.028,77,2.281,81,1.657,102,1.533,106,1.099,108,1.533,118,2.719,120,4.332,143,1.938,158,1.197,167,2.719,226,1.657,249,1.117,335,1.211,392,2.994,414,2.281,495,1.791,513,3.328,724,3.328,742,2.719,762,3.328,768,3.328,830,4.332,1043,3.328,1080,2.719,1193,3.751,1196,4.332,1230,4.332,1765,5.26,1766,5.26,1767,5.26,1768,5.26,1769,5.26]],["keywords/template:templates/index",[]],["title/template:templates/not-found",[1770,3.079]],["text/template:templates/not-found",[272,2.228,666,2.419,1180,3.53,1704,4.595,1770,4.595,1771,5.579]],["keywords/template:templates/not-found",[]]],"invertedIndex":[["",{"_index":1,"title":{},"text":{"template:blog/detail":{"position":[[1,1]]},"template:docs/advanced/customizing-the-inflector":{"position":[[252,1],[264,1],[311,2],[592,2],[942,2],[1071,3],[1075,1],[1093,1],[1116,2],[1211,1],[1228,1],[1301,2],[1588,2]]},"template:docs/advanced/environment-options":{"position":[[116,2],[141,3],[161,3],[179,1],[205,1],[207,1],[223,2],[226,1],[549,2],[574,3],[594,3],[612,1],[638,1],[640,1],[656,2],[659,1],[688,2],[713,3],[733,3],[752,1],[778,1],[780,1],[797,2],[800,1],[1080,1],[1098,1],[1100,1],[1142,1],[1191,2],[1202,2],[1239,1],[2272,2],[2297,3],[2325,1],[2327,1],[2353,2],[2870,2],[2895,3],[2923,1],[2925,1],[2958,2]]},"template:docs/advanced/mocking-guids":{"position":[[794,1],[810,1],[852,1],[868,1],[879,1],[892,1],[894,2],[945,1],[956,1],[996,1],[1003,1],[1016,1],[1051,1],[1053,2],[1139,1],[1163,1],[1217,1],[1237,1],[1239,2],[1289,1],[1309,1],[1311,1]]},"template:docs/advanced/server-configuration":{"position":[[1316,1],[2980,2],[3017,1],[3043,1],[3077,1],[3092,1],[3143,1],[3161,1],[3163,1],[3184,1],[3233,2],[3245,1],[3247,2],[3265,1],[3274,2],[3299,2],[3302,2],[3339,1],[3341,2],[3395,1],[3421,1],[3455,1],[3470,1],[3521,1],[3539,1],[3541,1],[3562,1],[3611,2],[3622,2],[3659,1],[3679,1],[3681,2],[3699,1],[3708,2],[3733,1],[4858,2],[4954,1],[5007,1],[5041,1],[5056,1],[5110,1],[5128,1],[5130,1],[5151,1],[5200,2],[5271,2],[5308,1],[5328,1],[5330,2],[5348,1],[5357,2],[5382,1]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[394,2],[397,1],[399,2],[430,1],[465,1],[490,1],[496,1],[503,1],[665,3]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1274,1],[1292,1],[1294,1],[1324,1],[1348,1],[1360,1],[1362,1],[1364,2],[1399,2],[1417,2],[1432,1],[1506,2],[1707,1],[1709,1],[1746,1],[1769,1],[1791,2],[1837,1],[1854,1],[1897,1],[1917,1],[1919,2],[1967,1],[2079,1],[2081,2],[2115,1]]},"template:docs/data-layer/database":{"position":[[724,2],[780,1],[811,1],[813,1],[837,2],[840,1],[861,2],[864,1],[883,2],[886,1],[888,3],[892,1],[1005,2],[1008,1],[1035,3],[1103,1],[1105,1],[1138,2],[1141,1],[1171,2],[1174,1],[1202,1],[1204,1],[1580,2],[1655,1],[1868,3]]},"template:docs/data-layer/factories":{"position":[[823,2],[856,1],[864,1],[913,3],[1061,2],[1124,1],[1150,1],[1388,2],[1409,1],[1419,1],[1421,1],[1431,1],[1433,1],[1435,1],[1552,2],[1615,1],[1640,1],[1708,3],[1712,1],[1747,1],[1757,1],[1759,1],[1836,1],[1838,1],[1840,1],[2298,2],[2334,1],[2344,1],[2395,3],[2462,2],[2498,1],[2508,1],[2580,3],[2695,1],[2705,1],[2707,1],[2739,1],[2741,1],[2743,1],[2788,2],[2824,1],[2834,1],[2894,1],[2917,1],[2919,3],[3185,1],[3195,1],[3197,1],[3225,2],[3228,1],[3256,2],[3259,1],[3287,2],[3290,1],[3318,2],[3321,1],[3349,1],[3351,1],[3353,1],[3402,2],[3438,1],[3448,1],[3474,1],[3482,1],[3549,1],[3572,2],[3589,1],[3638,2],[3650,1],[3663,1],[3665,1],[3695,2],[3714,1],[3732,1],[3734,3],[3868,1],[3878,1],[3880,1],[3951,2],[3954,1],[4024,2],[4027,1],[4097,2],[4100,1],[4171,2],[4174,1],[4244,2],[4247,1],[4249,1],[4663,2],[4718,2],[4743,1],[4798,1],[4800,2],[4884,1],[4908,3],[4912,2],[4937,1],[4997,1],[5347,2],[5382,1],[5392,1],[5418,1],[5426,1],[5491,1],[5523,2],[5537,1],[5566,2],[5588,1],[5590,3],[5675,1],[5677,1],[5738,1],[5740,1],[5805,1],[5807,1],[5866,1],[5868,1],[6044,1],[6095,3],[6162,3],[6233,1],[6261,1],[6289,3],[6316,1],[6357,3],[6549,1],[6589,3],[6719,2],[6722,1],[6754,1],[6777,2],[6780,1],[6814,1],[6821,3],[6825,3],[6829,3],[7587,2],[7642,3],[7646,2],[7719,3],[7876,2],[7962,1],[8006,3],[8010,1],[8012,3],[8758,1],[8824,1],[8840,3],[9306,2],[9392,1],[9410,1],[9454,3],[9458,1],[9460,1],[9462,3],[9535,1],[9551,3],[10057,2],[10092,1],[10109,1],[10255,2],[10258,3],[10666,2],[10701,1],[10718,1],[10864,3],[10903,2],[10906,3],[10994,1],[11057,1],[11288,1],[11313,3],[11511,2],[11546,1],[11563,1],[11684,1],[11718,1],[11725,3],[11729,1],[11731,2],[11734,3],[12321,2],[12356,1],[12366,1],[12443,1],[12461,1],[12505,3],[12509,1],[12511,1],[12513,3],[12574,2],[12609,1],[12632,1],[12703,3],[12829,2],[12864,1],[12894,1],[12983,2],[12986,3],[13075,2],[13110,1],[13140,1],[13236,1],[13253,2],[13256,2],[13259,3],[13561,2],[13624,1],[13658,1],[13876,2],[13937,1],[13961,1],[13977,3],[13981,1],[14042,2],[14201,1],[14203,1],[14234,1],[14365,2],[14429,2],[14455,1],[14457,2],[14472,2],[14496,1],[14530,1],[14558,1],[15269,1],[15367,3],[15371,3],[15479,1],[16326,1],[16340,1],[16377,1],[16401,1],[16411,3],[16437,1],[16491,3],[16574,3],[16998,1],[17022,1],[17070,3],[17153,3]]},"template:docs/data-layer/fixtures":{"position":[[359,2],[422,1],[456,1],[458,1],[481,2],[484,1],[507,2],[510,1],[541,1],[543,1],[545,3],[549,1],[836,2],[883,1],[885,1],[933,2],[936,1],[982,2],[985,1],[1046,2],[1049,1],[1100,2],[1103,1],[1153,2],[1156,1],[1206,2],[1209,1],[1256,2],[1259,1],[1309,2],[1312,1],[1359,2],[1362,1],[1415,2],[1418,2],[1917,2],[1980,1],[2005,1],[2185,2],[2248,1],[2294,2],[2341,1],[2546,1],[2655,3],[2659,3],[2742,1],[2858,2],[2913,3],[2917,2],[2998,3],[3060,1],[3106,3],[3184,3],[3260,2],[3280,1],[3289,1],[3291,1],[3324,1],[3326,2],[3336,1],[3338,1],[3401,1],[3403,1],[3405,1],[3944,2],[3987,1],[3989,1],[4022,1],[4024,2],[4027,2],[4070,1],[4072,1],[4135,1],[4137,2],[4308,2],[4363,1],[4382,3],[4386,2],[4467,3],[4549,2],[4592,1],[4594,1],[4614,1],[4620,2],[4645,1],[4647,2],[4650,2],[4693,1],[4695,1],[4758,1],[4760,2]]},"template:docs/data-layer/models":{"position":[[882,2],[919,1],[927,1],[1140,1],[1152,1],[1217,3],[1286,2],[1342,1],[1398,3],[1402,1],[1657,2],[1713,1],[1743,1],[2078,2],[2081,1],[2114,3],[2255,3],[2307,3],[2547,1],[2607,3],[2635,1]]},"template:docs/data-layer/orm":{"position":[[454,2],[464,1],[474,1],[476,1],[509,2],[512,1],[542,2],[545,1],[573,1],[575,1],[577,1],[716,1],[904,2],[925,1],[933,1],[972,1],[996,1],[998,1],[1000,1],[1018,1],[1135,2],[1138,1],[1150,1],[1201,1],[1209,1],[1253,1],[1274,1],[1276,1],[1278,2],[1281,3],[1354,1],[1437,1],[1602,2],[1605,1],[1617,1],[1675,1],[1677,1],[1685,1],[1729,1],[1731,1],[1733,1],[1735,2],[1769,2],[1776,4],[1800,2],[1803,1],[1820,1],[1834,3],[1856,3],[2069,1],[2170,1],[2234,1],[2242,1],[2281,1],[2305,2],[2323,1],[2336,1],[2344,1],[2371,1],[2373,1],[2375,1],[2377,1],[2379,1],[3231,2],[3264,1],[3272,1],[3321,3],[3887,2],[3890,1],[3899,1],[3951,3],[4359,2],[4403,1],[4423,1],[4484,3],[4552,1],[4560,1],[4599,1],[4673,1],[4675,1],[4677,1],[4981,2],[5014,1],[5033,1],[5112,3],[5163,2],[5197,1],[5205,1],[5254,3],[5613,1],[5621,1],[5660,1],[5734,2],[5752,1],[5764,1],[5772,1],[5798,1],[5800,1],[5802,1],[5804,2],[5817,1],[5819,1],[5858,1],[5886,1],[5888,1],[5890,1],[5892,1],[6204,1],[6248,2],[6251,1],[6253,1],[6262,1],[6283,1],[6316,1],[6318,3],[6322,1],[6806,1],[6808,1],[6845,1],[6847,2],[6858,1],[6860,1],[6960,1],[6962,1],[6964,3],[7272,1],[7323,3],[7439,3],[7667,1],[7677,1],[7679,1],[7749,1],[7751,2],[7762,1],[7764,1],[7796,2],[7799,1],[7830,1],[7832,1],[7834,1],[7897,1],[7964,3],[8039,3],[8043,3],[8086,1],[8096,1],[8098,1],[8168,1],[8170,2],[8181,1],[8183,1],[8215,2],[8218,1],[8249,1],[8251,1],[8253,1]]},"template:docs/data-layer/relationships":{"position":[[551,2],[588,1],[607,1],[684,3],[983,2],[1006,1],[1011,2],[1056,2],[1091,1],[1135,2],[1187,2],[1854,2],[1891,1],[1908,1],[1985,3],[2149,2],[2182,1],[2192,2],[2239,2],[2286,1],[2310,2],[2366,2],[2420,2],[2639,2],[2676,1],[2704,1],[2820,3],[3067,2],[3133,3],[3137,2],[3203,3],[3699,2],[3761,3],[3765,2],[3866,3],[4089,2],[4151,3],[4155,2],[4227,1],[4250,3],[4282,1],[4298,2],[4301,3],[4486,1],[4506,1],[4647,2],[4745,2],[4748,3],[4752,2],[4829,3],[4833,2],[4908,3],[5167,1],[5206,3],[5243,1],[5266,3],[5304,1],[5327,3],[5331,2],[5364,2],[5367,1],[5394,1],[5396,2],[5428,1],[5430,1],[5455,2],[5506,2],[5594,2],[5597,3],[5601,2],[5652,3],[5656,2],[5709,3],[5722,1],[5758,3],[5785,1],[5793,3],[5823,1],[5831,3],[5835,2],[5860,2],[5863,1],[5865,1],[5886,2],[5889,1],[5912,2],[5915,3],[5919,1],[5921,2],[5945,1],[5947,1],[5949,1],[5972,2],[5975,3],[5979,2],[6007,1]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1164,1],[1186,1],[1281,3],[1595,1],[1617,1],[1700,1],[1830,1],[1832,3],[1930,1]]},"template:docs/data-layer/serializers/index":{"position":[[172,2],[175,1],[223,3],[257,2],[274,1],[282,1],[322,1],[346,1],[348,1],[350,1],[2247,2],[2291,1],[2311,1],[2372,3],[2833,3],[3242,2],[3259,1],[3298,1],[3367,1],[3380,1],[3406,1],[3417,1],[3498,1],[3523,1],[3525,3],[4095,1],[4115,1],[4207,3],[4276,1],[4284,1],[4324,1],[4348,2],[4366,1],[4384,1],[4392,1],[4394,1],[4420,2],[4423,1],[4449,2],[4452,1],[4478,2],[4481,1],[4483,1],[4485,1],[4487,1],[4489,1],[4696,2],[4837,1],[4846,1],[4864,1],[4914,1],[4916,2],[4919,1],[4921,3],[4989,1],[4997,1],[5037,1],[5061,2],[5079,1],[5097,1],[5106,1],[5146,1],[5148,1],[5150,1],[5152,1],[5154,1],[5616,1],[5709,2],[5775,1],[5788,1],[5820,1],[5861,1],[5891,3],[6184,2],[6250,1],[6263,1],[6295,1],[6363,1],[6393,3],[6978,1]]},"template:docs/getting-started/installation":{"position":[[746,1]]},"template:docs/getting-started/overview":{"position":[[377,2],[415,1],[432,1],[461,2],[464,2],[467,1],[476,1],[484,1],[486,1],[523,1],[546,1],[548,2],[551,1],[588,1],[608,1],[610,2],[613,1],[650,1],[668,1],[670,2],[673,1],[675,2],[678,3],[682,1],[856,1],[1924,1],[1988,2],[2021,1],[2029,1],[2078,3],[2403,2],[2406,1],[2436,3],[2933,2],[2958,1],[2960,1],[3259,1],[3440,2],[3476,1],[3486,1],[3546,1],[3569,2],[3595,2],[3605,1],[3615,1],[3631,1],[3671,1],[3678,1],[3684,1],[3690,1],[3697,2],[3716,3],[3754,1],[3756,1],[3804,2],[3807,1],[3855,2],[3858,2],[3861,3],[3865,1],[4243,2],[4306,1],[4340,2],[4474,2],[4499,1],[4501,1],[4538,1],[4586,1],[4588,2],[4591,1],[4628,1],[4676,1],[4678,2],[4681,2],[4684,3],[4688,1],[4923,2],[4965,1],[4988,1],[5017,1],[5031,1],[5090,1],[5124,1],[5228,1],[5347,3],[5351,3],[5355,3],[5489,1],[5501,1],[5531,1],[5555,3],[5642,3],[6060,2],[6093,1],[6110,1],[6182,3],[6186,2],[6225,1],[6244,1],[6312,3],[6486,2],[6489,1],[6501,1],[6568,3],[6678,1],[6703,1],[6741,1],[6772,1],[6802,3],[6835,1],[6859,3],[6892,1],[6919,2],[6922,1],[6924,3],[6993,3],[6997,3],[7450,2],[7467,1],[7475,1],[7512,1],[7536,1],[7538,1],[7540,1],[7717,2],[7734,1],[7744,1],[7775,1],[7777,1],[8166,2],[8210,1],[8223,1],[8299,1],[8325,2],[8353,1],[8379,1],[8381,3],[8519,2],[8557,1],[8570,1],[8633,1],[8649,1],[8651,3],[8655,2],[8693,1],[8737,2],[8740,1],[8788,3],[8792,1],[8893,1],[8902,1],[8933,2],[8952,1],[8954,1],[9006,2],[9009,1],[9055,2],[9058,3],[9062,1],[9064,1],[9412,2],[9415,1],[9446,3],[10302,2],[10555,2],[10727,1]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[98,1],[148,1],[447,2],[462,1],[470,1],[509,1],[517,1],[969,1],[996,1],[1056,1],[1074,1],[1076,1],[1097,1],[1146,2],[1157,2],[1194,1],[1196,2],[1272,1],[1274,1],[2448,1],[3052,1],[3171,1],[3180,1],[3197,1],[3216,1],[3225,1],[3235,1],[3254,1],[3559,2],[3946,1],[3948,1],[4024,3],[4028,1],[4112,3],[4116,1],[4190,1],[4192,1],[4267,3],[4271,1],[4287,1],[4289,1],[4338,2],[4341,1],[4343,1],[4364,1],[4385,1],[4474,1],[4476,1],[4520,1],[4568,3],[4572,1],[5081,2],[5161,2],[5177,1],[5191,1],[6198,1],[7764,1],[7766,1],[7777,1],[7811,1],[7813,2],[7885,1],[7924,1],[7939,2],[7957,1],[7968,1],[7976,1],[8001,1],[8003,1],[8005,1],[8007,1],[8411,1],[9518,2],[9534,1],[9542,1],[9580,1],[9582,3],[9586,2],[9604,1],[9614,1],[9622,1],[9647,1],[9649,1],[9651,1],[9653,1],[9655,1],[10171,2],[10187,1],[10195,1],[10233,1],[10235,3],[10239,2],[10257,1],[10267,1],[10276,1],[10302,1],[10304,1],[10306,1],[10308,1],[10310,1],[10909,2],[10953,1],[10973,1],[11073,3],[11372,1],[11610,2],[11644,1],[11652,1],[11712,2],[11744,1],[11763,1],[11840,3],[12176,2],[12210,1],[12227,1],[12301,3],[12305,2],[12337,1],[12356,1],[12433,3],[12846,2],[13388,1],[14213,4],[14545,1],[15089,5],[15478,1],[15503,2],[15518,3],[15539,1],[15563,2],[15577,3],[15726,1],[15759,2],[15774,1],[15807,1],[15809,3],[15878,1],[15911,2],[15925,1],[15958,1],[15960,3],[16575,1],[16583,1],[16794,1],[18000,1],[18002,2],[18018,3],[18357,2],[18369,1],[18371,2],[18387,3]]},"template:docs/route-handlers/functions":{"position":[[193,2],[233,2],[236,2],[239,1],[248,1],[289,2],[292,3],[550,2],[553,2],[556,1],[558,3],[562,3],[587,2],[590,2],[593,1],[595,3],[599,3],[629,2],[632,2],[635,1],[637,3],[641,3],[669,2],[672,2],[675,1],[677,3],[681,3],[912,2],[952,2],[955,2],[958,1],[967,1],[1008,2],[1011,2],[1014,1],[1029,3],[1243,2],[1289,1],[1306,1],[1327,1],[1355,2],[1358,2],[1361,1],[1370,1],[1411,2],[1414,3],[1445,2],[1448,2],[1451,1],[1477,2],[1480,1],[1495,3],[1499,1],[1681,1],[1697,1],[1706,2],[1709,3],[1713,3],[1968,2],[1971,1],[2001,3],[2290,2],[2293,1],[2302,1],[2354,3],[2528,2],[2531,1],[2543,1],[2620,3],[2624,3],[3078,2],[3081,1],[3090,1],[3143,2],[3563,1],[3576,1],[3608,1],[3644,1],[3646,1],[3656,2],[3672,3],[3865,1],[3878,1],[3910,1],[3962,1],[3964,1],[3974,2],[3990,3],[4196,2],[4211,1],[4219,1],[4248,1],[4320,2],[4338,1],[4346,1],[4354,1],[4377,1],[4379,1],[4381,1],[4383,1],[4385,1],[4487,1],[4499,1],[4532,2],[4541,1],[4543,1],[4619,1],[4621,2],[4659,3],[5383,2],[5386,2],[5389,1],[5391,3],[5395,3],[5708,1],[5738,1],[5798,1],[5833,1],[5965,1],[5977,1],[6016,2],[6019,3],[6023,3],[6459,2],[6486,1],[6497,1],[6542,1],[6592,1],[6604,1],[6662,1],[6701,1],[6708,1],[6735,1],[6752,2],[6755,1],[6790,3],[6794,1],[6796,3],[6800,1],[6920,4],[7084,4],[7204,2],[7239,1],[7263,2],[7351,4]]},"template:docs/route-handlers/shorthands":{"position":[[306,2],[309,1],[339,3],[839,2],[842,1],[854,1],[931,3],[1272,2],[1308,2],[1375,2],[1428,2],[1473,2],[1476,1],[1508,2],[1536,3],[1558,2],[1598,2],[1668,2],[1715,2],[1773,2],[1776,1],[1785,1],[1839,2],[1867,3],[1940,2],[1975,1],[1992,3],[2027,1],[2044,3],[2048,2],[2084,2],[2096,2],[2108,2],[2111,1],[2121,1],[2175,2],[2203,3],[2244,2],[2281,2],[2348,2],[2395,2],[2458,1],[2470,1],[2541,3],[2850,2],[2924,2],[2996,2],[3043,2],[3111,1],[3120,1],[3151,1],[3231,3],[3540,2],[3580,2],[3650,2],[3697,2],[3755,2],[3758,1],[3767,1],[3824,3],[3870,2],[3936,2],[3976,2],[3988,2],[4000,2],[4003,1],[4012,1],[4045,1],[4114,3],[4325,2],[4377,2],[4502,2],[4667,1],[4675,1],[4693,1],[4695,3],[4699,2],[4863,1],[4873,1],[4884,1],[4886,3],[4890,2],[5161,1],[5178,3],[5182,2],[5501,1],[5560,1],[5572,30],[5609,1],[5638,1],[5673,1],[5705,1],[5755,1]]},"template:docs/testing/acceptance-tests":{"position":[[658,1],[681,1],[703,1],[712,1],[726,1],[785,1],[819,1],[850,1],[917,1],[919,2],[932,3],[936,3],[1740,1],[1839,3],[1843,3],[2472,2],[2508,1],[2518,1],[2591,3],[3097,1],[3196,3],[3200,3],[3280,1],[3292,1],[3322,1],[3346,3],[3428,3],[3715,1],[3717,2],[3765,2],[3790,2],[3842,3],[3846,3],[4246,1],[4279,2],[4282,2],[4285,2],[4296,1],[4330,1],[4332,3],[4501,3],[5258,2],[5313,1],[5381,2],[5534,1],[5620,3],[5624,3],[5821,1],[5847,2],[5850,3],[5854,3]]},"template:docs/testing/assertions":{"position":[[1043,1],[1074,1],[1101,2],[1206,2],[1281,2],[1405,3],[1727,1],[1745,1],[1773,1],[1795,3],[1808,1],[2035,3],[2578,2],[2618,1],[2642,1],[2660,3],[2672,1],[2698,1],[2700,1],[2722,2],[2725,1],[2727,1],[3098,1],[3135,1],[3153,3],[3192,1],[3209,3],[3265,2],[3331,3],[3335,2],[3381,1],[3402,1],[3519,1],[3547,3],[3551,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[405,1],[414,1],[437,1],[458,1],[487,1],[501,1],[561,1],[573,1],[604,1],[705,1],[735,1],[759,3],[871,3],[931,3],[935,3],[1131,1],[1140,1],[1163,1],[1184,1],[1213,1],[1227,1],[1287,1],[1299,1],[1330,1],[1436,1],[1470,2],[1473,2],[1476,2],[1487,1],[1512,4],[1521,2],[1660,3],[1715,3],[1719,3],[2055,1],[2067,1],[2099,1],[2202,1],[2204,2],[2276,3],[2338,2],[2368,3],[2372,3],[2523,1],[2535,1],[2567,1],[2670,1],[2672,2],[2675,2],[2704,1],[2736,1],[2757,3],[2844,3],[2906,2],[2936,3],[2940,3],[3302,1],[3554,2],[3557,2],[3574,2],[3670,1],[3786,3],[4248,1],[4257,1],[4280,1],[4301,1],[4330,1],[4344,1],[4391,1],[4407,1],[4457,1],[4469,1],[4501,1],[4604,1],[4606,2],[4609,1],[4672,1],[4704,1],[4725,3],[4739,1],[4789,1],[4927,3],[4989,2],[5019,3],[5023,3],[5364,2],[5423,1],[5436,1],[5473,1],[5479,1],[5530,1],[5544,1],[5570,1],[5658,2],[5692,3],[5707,2],[5746,2],[5749,1],[5762,1],[5817,1],[5852,1],[5953,1],[6028,1],[6045,1],[6113,1],[6156,2],[6159,1],[6186,3],[6190,3],[6194,1],[6339,1],[6348,1],[6371,1],[6392,1],[6421,1],[6435,1],[6482,1],[6498,1],[6629,1],[6641,1],[6673,1],[6776,1],[6778,2],[6781,1],[6844,1],[6876,1],[6897,3],[6934,1],[6984,1],[7116,3],[7178,2],[7208,3],[7212,3]]},"template:docs/testing/setup-mirage":{"position":[[271,1],[294,1],[323,1],[337,1],[396,1],[430,1],[526,1],[528,2],[541,3],[545,3],[656,1],[679,1],[708,1],[722,1],[811,2],[869,1],[903,1],[953,1],[966,3],[1015,1],[1017,2],[1030,3],[1034,3],[1233,1],[1256,1],[1285,1],[1299,1],[1346,1],[1372,1],[1406,1],[1421,1],[1457,1],[1476,1],[1494,1],[1496,1],[1517,1],[1566,2],[1578,1],[1595,1],[1615,1],[1642,2],[1645,2],[1648,1],[1698,2],[1701,1],[1703,2],[1740,1],[1761,1],[1795,1],[1845,1],[1858,3],[1907,1],[1909,2],[1922,3],[1926,3]]},"template:index":{"position":[[285,1]]},"template:templates/blog/detail":{"position":[[1,1]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[252,1],[264,1],[311,2],[592,2],[942,2],[1071,3],[1075,1],[1093,1],[1116,2],[1211,1],[1228,1],[1301,2],[1588,2]]},"template:templates/docs/advanced/environment-options":{"position":[[116,2],[141,3],[161,3],[179,1],[205,1],[207,1],[223,2],[226,1],[549,2],[574,3],[594,3],[612,1],[638,1],[640,1],[656,2],[659,1],[688,2],[713,3],[733,3],[752,1],[778,1],[780,1],[797,2],[800,1],[1080,1],[1098,1],[1100,1],[1142,1],[1191,2],[1202,2],[1239,1],[2272,2],[2297,3],[2325,1],[2327,1],[2353,2],[2870,2],[2895,3],[2923,1],[2925,1],[2958,2]]},"template:templates/docs/advanced/mocking-guids":{"position":[[794,1],[810,1],[852,1],[868,1],[879,1],[892,1],[894,2],[945,1],[956,1],[996,1],[1003,1],[1016,1],[1051,1],[1053,2],[1139,1],[1163,1],[1217,1],[1237,1],[1239,2],[1289,1],[1309,1],[1311,1]]},"template:templates/docs/advanced/server-configuration":{"position":[[1316,1],[2980,2],[3017,1],[3043,1],[3077,1],[3092,1],[3143,1],[3161,1],[3163,1],[3184,1],[3233,2],[3245,1],[3247,2],[3265,1],[3274,2],[3299,2],[3302,2],[3339,1],[3341,2],[3395,1],[3421,1],[3455,1],[3470,1],[3521,1],[3539,1],[3541,1],[3562,1],[3611,2],[3622,2],[3659,1],[3679,1],[3681,2],[3699,1],[3708,2],[3733,1],[4858,2],[4954,1],[5007,1],[5041,1],[5056,1],[5110,1],[5128,1],[5130,1],[5151,1],[5200,2],[5271,2],[5308,1],[5328,1],[5330,2],[5348,1],[5357,2],[5382,1]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[394,2],[397,1],[399,2],[430,1],[465,1],[490,1],[496,1],[503,1],[665,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1274,1],[1292,1],[1294,1],[1324,1],[1348,1],[1360,1],[1362,1],[1364,2],[1399,2],[1417,2],[1432,1],[1506,2],[1707,1],[1709,1],[1746,1],[1769,1],[1791,2],[1837,1],[1854,1],[1897,1],[1917,1],[1919,2],[1967,1],[2079,1],[2081,2],[2115,1]]},"template:templates/docs/data-layer/database":{"position":[[724,2],[780,1],[811,1],[813,1],[837,2],[840,1],[861,2],[864,1],[883,2],[886,1],[888,3],[892,1],[1005,2],[1008,1],[1035,3],[1103,1],[1105,1],[1138,2],[1141,1],[1171,2],[1174,1],[1202,1],[1204,1],[1580,2],[1655,1],[1868,3]]},"template:templates/docs/data-layer/factories":{"position":[[823,2],[856,1],[864,1],[913,3],[1061,2],[1124,1],[1150,1],[1388,2],[1409,1],[1419,1],[1421,1],[1431,1],[1433,1],[1435,1],[1552,2],[1615,1],[1640,1],[1708,3],[1712,1],[1747,1],[1757,1],[1759,1],[1836,1],[1838,1],[1840,1],[2298,2],[2334,1],[2344,1],[2395,3],[2462,2],[2498,1],[2508,1],[2580,3],[2695,1],[2705,1],[2707,1],[2739,1],[2741,1],[2743,1],[2788,2],[2824,1],[2834,1],[2894,1],[2917,1],[2919,3],[3185,1],[3195,1],[3197,1],[3225,2],[3228,1],[3256,2],[3259,1],[3287,2],[3290,1],[3318,2],[3321,1],[3349,1],[3351,1],[3353,1],[3402,2],[3438,1],[3448,1],[3474,1],[3482,1],[3549,1],[3572,2],[3589,1],[3638,2],[3650,1],[3663,1],[3665,1],[3695,2],[3714,1],[3732,1],[3734,3],[3868,1],[3878,1],[3880,1],[3951,2],[3954,1],[4024,2],[4027,1],[4097,2],[4100,1],[4171,2],[4174,1],[4244,2],[4247,1],[4249,1],[4663,2],[4718,2],[4743,1],[4798,1],[4800,2],[4884,1],[4908,3],[4912,2],[4937,1],[4997,1],[5347,2],[5382,1],[5392,1],[5418,1],[5426,1],[5491,1],[5523,2],[5537,1],[5566,2],[5588,1],[5590,3],[5675,1],[5677,1],[5738,1],[5740,1],[5805,1],[5807,1],[5866,1],[5868,1],[6044,1],[6095,3],[6162,3],[6233,1],[6261,1],[6289,3],[6316,1],[6357,3],[6549,1],[6589,3],[6719,2],[6722,1],[6754,1],[6777,2],[6780,1],[6814,1],[6821,3],[6825,3],[6829,3],[7587,2],[7642,3],[7646,2],[7719,3],[7876,2],[7962,1],[8006,3],[8010,1],[8012,3],[8758,1],[8824,1],[8840,3],[9306,2],[9392,1],[9410,1],[9454,3],[9458,1],[9460,1],[9462,3],[9535,1],[9551,3],[10057,2],[10092,1],[10109,1],[10255,2],[10258,3],[10666,2],[10701,1],[10718,1],[10864,3],[10903,2],[10906,3],[10994,1],[11057,1],[11288,1],[11313,3],[11511,2],[11546,1],[11563,1],[11684,1],[11718,1],[11725,3],[11729,1],[11731,2],[11734,3],[12321,2],[12356,1],[12366,1],[12443,1],[12461,1],[12505,3],[12509,1],[12511,1],[12513,3],[12574,2],[12609,1],[12632,1],[12703,3],[12829,2],[12864,1],[12894,1],[12983,2],[12986,3],[13075,2],[13110,1],[13140,1],[13236,1],[13253,2],[13256,2],[13259,3],[13561,2],[13624,1],[13658,1],[13876,2],[13937,1],[13961,1],[13977,3],[13981,1],[14042,2],[14201,1],[14203,1],[14234,1],[14365,2],[14429,2],[14455,1],[14457,2],[14472,2],[14496,1],[14530,1],[14558,1],[15269,1],[15367,3],[15371,3],[15479,1],[16326,1],[16340,1],[16377,1],[16401,1],[16411,3],[16437,1],[16491,3],[16574,3],[16998,1],[17022,1],[17070,3],[17153,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[359,2],[422,1],[456,1],[458,1],[481,2],[484,1],[507,2],[510,1],[541,1],[543,1],[545,3],[549,1],[836,2],[883,1],[885,1],[933,2],[936,1],[982,2],[985,1],[1046,2],[1049,1],[1100,2],[1103,1],[1153,2],[1156,1],[1206,2],[1209,1],[1256,2],[1259,1],[1309,2],[1312,1],[1359,2],[1362,1],[1415,2],[1418,2],[1917,2],[1980,1],[2005,1],[2185,2],[2248,1],[2294,2],[2341,1],[2546,1],[2655,3],[2659,3],[2742,1],[2858,2],[2913,3],[2917,2],[2998,3],[3060,1],[3106,3],[3184,3],[3260,2],[3280,1],[3289,1],[3291,1],[3324,1],[3326,2],[3336,1],[3338,1],[3401,1],[3403,1],[3405,1],[3944,2],[3987,1],[3989,1],[4022,1],[4024,2],[4027,2],[4070,1],[4072,1],[4135,1],[4137,2],[4308,2],[4363,1],[4382,3],[4386,2],[4467,3],[4549,2],[4592,1],[4594,1],[4614,1],[4620,2],[4645,1],[4647,2],[4650,2],[4693,1],[4695,1],[4758,1],[4760,2]]},"template:templates/docs/data-layer/models":{"position":[[882,2],[919,1],[927,1],[1140,1],[1152,1],[1217,3],[1286,2],[1342,1],[1398,3],[1402,1],[1657,2],[1713,1],[1743,1],[2078,2],[2081,1],[2114,3],[2255,3],[2307,3],[2547,1],[2607,3],[2635,1]]},"template:templates/docs/data-layer/orm":{"position":[[454,2],[464,1],[474,1],[476,1],[509,2],[512,1],[542,2],[545,1],[573,1],[575,1],[577,1],[716,1],[904,2],[925,1],[933,1],[972,1],[996,1],[998,1],[1000,1],[1018,1],[1135,2],[1138,1],[1150,1],[1201,1],[1209,1],[1253,1],[1274,1],[1276,1],[1278,2],[1281,3],[1354,1],[1437,1],[1602,2],[1605,1],[1617,1],[1675,1],[1677,1],[1685,1],[1729,1],[1731,1],[1733,1],[1735,2],[1769,2],[1776,4],[1800,2],[1803,1],[1820,1],[1834,3],[1856,3],[2069,1],[2170,1],[2234,1],[2242,1],[2281,1],[2305,2],[2323,1],[2336,1],[2344,1],[2371,1],[2373,1],[2375,1],[2377,1],[2379,1],[3231,2],[3264,1],[3272,1],[3321,3],[3887,2],[3890,1],[3899,1],[3951,3],[4359,2],[4403,1],[4423,1],[4484,3],[4552,1],[4560,1],[4599,1],[4673,1],[4675,1],[4677,1],[4981,2],[5014,1],[5033,1],[5112,3],[5163,2],[5197,1],[5205,1],[5254,3],[5613,1],[5621,1],[5660,1],[5734,2],[5752,1],[5764,1],[5772,1],[5798,1],[5800,1],[5802,1],[5804,2],[5817,1],[5819,1],[5858,1],[5886,1],[5888,1],[5890,1],[5892,1],[6204,1],[6248,2],[6251,1],[6253,1],[6262,1],[6283,1],[6316,1],[6318,3],[6322,1],[6806,1],[6808,1],[6845,1],[6847,2],[6858,1],[6860,1],[6960,1],[6962,1],[6964,3],[7272,1],[7323,3],[7439,3],[7667,1],[7677,1],[7679,1],[7749,1],[7751,2],[7762,1],[7764,1],[7796,2],[7799,1],[7830,1],[7832,1],[7834,1],[7897,1],[7964,3],[8039,3],[8043,3],[8086,1],[8096,1],[8098,1],[8168,1],[8170,2],[8181,1],[8183,1],[8215,2],[8218,1],[8249,1],[8251,1],[8253,1]]},"template:templates/docs/data-layer/relationships":{"position":[[551,2],[588,1],[607,1],[684,3],[983,2],[1006,1],[1011,2],[1056,2],[1091,1],[1135,2],[1187,2],[1854,2],[1891,1],[1908,1],[1985,3],[2149,2],[2182,1],[2192,2],[2239,2],[2286,1],[2310,2],[2366,2],[2420,2],[2639,2],[2676,1],[2704,1],[2820,3],[3067,2],[3133,3],[3137,2],[3203,3],[3699,2],[3761,3],[3765,2],[3866,3],[4089,2],[4151,3],[4155,2],[4227,1],[4250,3],[4282,1],[4298,2],[4301,3],[4486,1],[4506,1],[4647,2],[4745,2],[4748,3],[4752,2],[4829,3],[4833,2],[4908,3],[5167,1],[5206,3],[5243,1],[5266,3],[5304,1],[5327,3],[5331,2],[5364,2],[5367,1],[5394,1],[5396,2],[5428,1],[5430,1],[5455,2],[5506,2],[5594,2],[5597,3],[5601,2],[5652,3],[5656,2],[5709,3],[5722,1],[5758,3],[5785,1],[5793,3],[5823,1],[5831,3],[5835,2],[5860,2],[5863,1],[5865,1],[5886,2],[5889,1],[5912,2],[5915,3],[5919,1],[5921,2],[5945,1],[5947,1],[5949,1],[5972,2],[5975,3],[5979,2],[6007,1]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1164,1],[1186,1],[1281,3],[1595,1],[1617,1],[1700,1],[1830,1],[1832,3],[1930,1]]},"template:templates/docs/data-layer/serializers/index":{"position":[[172,2],[175,1],[223,3],[257,2],[274,1],[282,1],[322,1],[346,1],[348,1],[350,1],[2247,2],[2291,1],[2311,1],[2372,3],[2833,3],[3242,2],[3259,1],[3298,1],[3367,1],[3380,1],[3406,1],[3417,1],[3498,1],[3523,1],[3525,3],[4095,1],[4115,1],[4207,3],[4276,1],[4284,1],[4324,1],[4348,2],[4366,1],[4384,1],[4392,1],[4394,1],[4420,2],[4423,1],[4449,2],[4452,1],[4478,2],[4481,1],[4483,1],[4485,1],[4487,1],[4489,1],[4696,2],[4837,1],[4846,1],[4864,1],[4914,1],[4916,2],[4919,1],[4921,3],[4989,1],[4997,1],[5037,1],[5061,2],[5079,1],[5097,1],[5106,1],[5146,1],[5148,1],[5150,1],[5152,1],[5154,1],[5616,1],[5709,2],[5775,1],[5788,1],[5820,1],[5861,1],[5891,3],[6184,2],[6250,1],[6263,1],[6295,1],[6363,1],[6393,3],[6978,1]]},"template:templates/docs/getting-started/installation":{"position":[[746,1]]},"template:templates/docs/getting-started/overview":{"position":[[377,2],[415,1],[432,1],[461,2],[464,2],[467,1],[476,1],[484,1],[486,1],[523,1],[546,1],[548,2],[551,1],[588,1],[608,1],[610,2],[613,1],[650,1],[668,1],[670,2],[673,1],[675,2],[678,3],[682,1],[856,1],[1924,1],[1988,2],[2021,1],[2029,1],[2078,3],[2403,2],[2406,1],[2436,3],[2933,2],[2958,1],[2960,1],[3259,1],[3440,2],[3476,1],[3486,1],[3546,1],[3569,2],[3595,2],[3605,1],[3615,1],[3631,1],[3671,1],[3678,1],[3684,1],[3690,1],[3697,2],[3716,3],[3754,1],[3756,1],[3804,2],[3807,1],[3855,2],[3858,2],[3861,3],[3865,1],[4243,2],[4306,1],[4340,2],[4474,2],[4499,1],[4501,1],[4538,1],[4586,1],[4588,2],[4591,1],[4628,1],[4676,1],[4678,2],[4681,2],[4684,3],[4688,1],[4923,2],[4965,1],[4988,1],[5017,1],[5031,1],[5090,1],[5124,1],[5228,1],[5347,3],[5351,3],[5355,3],[5489,1],[5501,1],[5531,1],[5555,3],[5642,3],[6060,2],[6093,1],[6110,1],[6182,3],[6186,2],[6225,1],[6244,1],[6312,3],[6486,2],[6489,1],[6501,1],[6568,3],[6678,1],[6703,1],[6741,1],[6772,1],[6802,3],[6835,1],[6859,3],[6892,1],[6919,2],[6922,1],[6924,3],[6993,3],[6997,3],[7450,2],[7467,1],[7475,1],[7512,1],[7536,1],[7538,1],[7540,1],[7717,2],[7734,1],[7744,1],[7775,1],[7777,1],[8166,2],[8210,1],[8223,1],[8299,1],[8325,2],[8353,1],[8379,1],[8381,3],[8519,2],[8557,1],[8570,1],[8633,1],[8649,1],[8651,3],[8655,2],[8693,1],[8737,2],[8740,1],[8788,3],[8792,1],[8893,1],[8902,1],[8933,2],[8952,1],[8954,1],[9006,2],[9009,1],[9055,2],[9058,3],[9062,1],[9064,1],[9412,2],[9415,1],[9446,3],[10302,2],[10555,2],[10727,1]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[98,1],[148,1],[447,2],[462,1],[470,1],[509,1],[517,1],[969,1],[996,1],[1056,1],[1074,1],[1076,1],[1097,1],[1146,2],[1157,2],[1194,1],[1196,2],[1272,1],[1274,1],[2448,1],[3052,1],[3171,1],[3180,1],[3197,1],[3216,1],[3225,1],[3235,1],[3254,1],[3559,2],[3946,1],[3948,1],[4024,3],[4028,1],[4112,3],[4116,1],[4190,1],[4192,1],[4267,3],[4271,1],[4287,1],[4289,1],[4338,2],[4341,1],[4343,1],[4364,1],[4385,1],[4474,1],[4476,1],[4520,1],[4568,3],[4572,1],[5081,2],[5161,2],[5177,1],[5191,1],[6198,1],[7764,1],[7766,1],[7777,1],[7811,1],[7813,2],[7885,1],[7924,1],[7939,2],[7957,1],[7968,1],[7976,1],[8001,1],[8003,1],[8005,1],[8007,1],[8411,1],[9518,2],[9534,1],[9542,1],[9580,1],[9582,3],[9586,2],[9604,1],[9614,1],[9622,1],[9647,1],[9649,1],[9651,1],[9653,1],[9655,1],[10171,2],[10187,1],[10195,1],[10233,1],[10235,3],[10239,2],[10257,1],[10267,1],[10276,1],[10302,1],[10304,1],[10306,1],[10308,1],[10310,1],[10909,2],[10953,1],[10973,1],[11073,3],[11372,1],[11610,2],[11644,1],[11652,1],[11712,2],[11744,1],[11763,1],[11840,3],[12176,2],[12210,1],[12227,1],[12301,3],[12305,2],[12337,1],[12356,1],[12433,3],[12846,2],[13388,1],[14213,4],[14545,1],[15089,5],[15478,1],[15503,2],[15518,3],[15539,1],[15563,2],[15577,3],[15726,1],[15759,2],[15774,1],[15807,1],[15809,3],[15878,1],[15911,2],[15925,1],[15958,1],[15960,3],[16575,1],[16583,1],[16794,1],[18000,1],[18002,2],[18018,3],[18357,2],[18369,1],[18371,2],[18387,3]]},"template:templates/docs/route-handlers/functions":{"position":[[193,2],[233,2],[236,2],[239,1],[248,1],[289,2],[292,3],[550,2],[553,2],[556,1],[558,3],[562,3],[587,2],[590,2],[593,1],[595,3],[599,3],[629,2],[632,2],[635,1],[637,3],[641,3],[669,2],[672,2],[675,1],[677,3],[681,3],[912,2],[952,2],[955,2],[958,1],[967,1],[1008,2],[1011,2],[1014,1],[1029,3],[1243,2],[1289,1],[1306,1],[1327,1],[1355,2],[1358,2],[1361,1],[1370,1],[1411,2],[1414,3],[1445,2],[1448,2],[1451,1],[1477,2],[1480,1],[1495,3],[1499,1],[1681,1],[1697,1],[1706,2],[1709,3],[1713,3],[1968,2],[1971,1],[2001,3],[2290,2],[2293,1],[2302,1],[2354,3],[2528,2],[2531,1],[2543,1],[2620,3],[2624,3],[3078,2],[3081,1],[3090,1],[3143,2],[3563,1],[3576,1],[3608,1],[3644,1],[3646,1],[3656,2],[3672,3],[3865,1],[3878,1],[3910,1],[3962,1],[3964,1],[3974,2],[3990,3],[4196,2],[4211,1],[4219,1],[4248,1],[4320,2],[4338,1],[4346,1],[4354,1],[4377,1],[4379,1],[4381,1],[4383,1],[4385,1],[4487,1],[4499,1],[4532,2],[4541,1],[4543,1],[4619,1],[4621,2],[4659,3],[5383,2],[5386,2],[5389,1],[5391,3],[5395,3],[5708,1],[5738,1],[5798,1],[5833,1],[5965,1],[5977,1],[6016,2],[6019,3],[6023,3],[6459,2],[6486,1],[6497,1],[6542,1],[6592,1],[6604,1],[6662,1],[6701,1],[6708,1],[6735,1],[6752,2],[6755,1],[6790,3],[6794,1],[6796,3],[6800,1],[6920,4],[7084,4],[7204,2],[7239,1],[7263,2],[7351,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[306,2],[309,1],[339,3],[839,2],[842,1],[854,1],[931,3],[1272,2],[1308,2],[1375,2],[1428,2],[1473,2],[1476,1],[1508,2],[1536,3],[1558,2],[1598,2],[1668,2],[1715,2],[1773,2],[1776,1],[1785,1],[1839,2],[1867,3],[1940,2],[1975,1],[1992,3],[2027,1],[2044,3],[2048,2],[2084,2],[2096,2],[2108,2],[2111,1],[2121,1],[2175,2],[2203,3],[2244,2],[2281,2],[2348,2],[2395,2],[2458,1],[2470,1],[2541,3],[2850,2],[2924,2],[2996,2],[3043,2],[3111,1],[3120,1],[3151,1],[3231,3],[3540,2],[3580,2],[3650,2],[3697,2],[3755,2],[3758,1],[3767,1],[3824,3],[3870,2],[3936,2],[3976,2],[3988,2],[4000,2],[4003,1],[4012,1],[4045,1],[4114,3],[4325,2],[4377,2],[4502,2],[4667,1],[4675,1],[4693,1],[4695,3],[4699,2],[4863,1],[4873,1],[4884,1],[4886,3],[4890,2],[5161,1],[5178,3],[5182,2],[5501,1],[5560,1],[5572,30],[5609,1],[5638,1],[5673,1],[5705,1],[5755,1]]},"template:templates/docs/testing/acceptance-tests":{"position":[[658,1],[681,1],[703,1],[712,1],[726,1],[785,1],[819,1],[850,1],[917,1],[919,2],[932,3],[936,3],[1740,1],[1839,3],[1843,3],[2472,2],[2508,1],[2518,1],[2591,3],[3097,1],[3196,3],[3200,3],[3280,1],[3292,1],[3322,1],[3346,3],[3428,3],[3715,1],[3717,2],[3765,2],[3790,2],[3842,3],[3846,3],[4246,1],[4279,2],[4282,2],[4285,2],[4296,1],[4330,1],[4332,3],[4501,3],[5258,2],[5313,1],[5381,2],[5534,1],[5620,3],[5624,3],[5821,1],[5847,2],[5850,3],[5854,3]]},"template:templates/docs/testing/assertions":{"position":[[1043,1],[1074,1],[1101,2],[1206,2],[1281,2],[1405,3],[1727,1],[1745,1],[1773,1],[1795,3],[1808,1],[2035,3],[2578,2],[2618,1],[2642,1],[2660,3],[2672,1],[2698,1],[2700,1],[2722,2],[2725,1],[2727,1],[3098,1],[3135,1],[3153,3],[3192,1],[3209,3],[3265,2],[3331,3],[3335,2],[3381,1],[3402,1],[3519,1],[3547,3],[3551,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[405,1],[414,1],[437,1],[458,1],[487,1],[501,1],[561,1],[573,1],[604,1],[705,1],[735,1],[759,3],[871,3],[931,3],[935,3],[1131,1],[1140,1],[1163,1],[1184,1],[1213,1],[1227,1],[1287,1],[1299,1],[1330,1],[1436,1],[1470,2],[1473,2],[1476,2],[1487,1],[1512,4],[1521,2],[1660,3],[1715,3],[1719,3],[2055,1],[2067,1],[2099,1],[2202,1],[2204,2],[2276,3],[2338,2],[2368,3],[2372,3],[2523,1],[2535,1],[2567,1],[2670,1],[2672,2],[2675,2],[2704,1],[2736,1],[2757,3],[2844,3],[2906,2],[2936,3],[2940,3],[3302,1],[3554,2],[3557,2],[3574,2],[3670,1],[3786,3],[4248,1],[4257,1],[4280,1],[4301,1],[4330,1],[4344,1],[4391,1],[4407,1],[4457,1],[4469,1],[4501,1],[4604,1],[4606,2],[4609,1],[4672,1],[4704,1],[4725,3],[4739,1],[4789,1],[4927,3],[4989,2],[5019,3],[5023,3],[5364,2],[5423,1],[5436,1],[5473,1],[5479,1],[5530,1],[5544,1],[5570,1],[5658,2],[5692,3],[5707,2],[5746,2],[5749,1],[5762,1],[5817,1],[5852,1],[5953,1],[6028,1],[6045,1],[6113,1],[6156,2],[6159,1],[6186,3],[6190,3],[6194,1],[6339,1],[6348,1],[6371,1],[6392,1],[6421,1],[6435,1],[6482,1],[6498,1],[6629,1],[6641,1],[6673,1],[6776,1],[6778,2],[6781,1],[6844,1],[6876,1],[6897,3],[6934,1],[6984,1],[7116,3],[7178,2],[7208,3],[7212,3]]},"template:templates/docs/testing/setup-mirage":{"position":[[271,1],[294,1],[323,1],[337,1],[396,1],[430,1],[526,1],[528,2],[541,3],[545,3],[656,1],[679,1],[708,1],[722,1],[811,2],[869,1],[903,1],[953,1],[966,3],[1015,1],[1017,2],[1030,3],[1034,3],[1233,1],[1256,1],[1285,1],[1299,1],[1346,1],[1372,1],[1406,1],[1421,1],[1457,1],[1476,1],[1494,1],[1496,1],[1517,1],[1566,2],[1578,1],[1595,1],[1615,1],[1642,2],[1645,2],[1648,1],[1698,2],[1701,1],[1703,2],[1740,1],[1761,1],[1795,1],[1845,1],[1858,3],[1907,1],[1909,2],[1922,3],[1926,3]]},"template:templates/index":{"position":[[285,1]]}},"keywords":{}}],["0",{"_index":1529,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1083,1]]},"template:templates/docs/route-handlers/functions":{"position":[[1083,1]]}},"keywords":{}}],["0-3",{"_index":1436,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13347,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13347,3]]}},"keywords":{}}],["0.1.x",{"_index":1439,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13382,5],[14073,6],[14877,6],[16192,6],[17891,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13382,5],[14073,6],[14877,6],[16192,6],[17891,6]]}},"keywords":{}}],["0.2",{"_index":1418,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11573,4],[13390,3],[16378,4],[17150,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11573,4],[13390,3],[16378,4],[17150,3]]}},"keywords":{}}],["0.2.0",{"_index":1442,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13627,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13627,6]]}},"keywords":{}}],["0.2.x",{"_index":1414,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11366,5],[11413,5],[14372,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11366,5],[11413,5],[14372,6]]}},"keywords":{}}],["0.2.x'",{"_index":1424,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[12566,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12566,7]]}},"keywords":{}}],["0.3",{"_index":1389,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8488,3],[9150,4],[10847,3],[11374,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8488,3],[9150,4],[10847,3],[11374,3]]}},"keywords":{}}],["0.3.x",{"_index":1387,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8405,5],[8500,6],[11422,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8405,5],[8500,6],[11422,5]]}},"keywords":{}}],["0.4",{"_index":1388,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8413,3],[8462,3],[10494,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8413,3],[8462,3],[10494,3]]}},"keywords":{}}],["0.x",{"_index":1359,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5953,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5953,3]]}},"keywords":{}}],["01/01/2000",{"_index":587,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4785,12],[4984,12]]},"template:templates/docs/data-layer/factories":{"position":[[4785,12],[4984,12]]}},"keywords":{}}],["1",{"_index":471,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1111,4]]},"template:docs/data-layer/factories":{"position":[[1427,3],[1765,4],[2713,4],[3203,4],[3222,2],[3886,4],[3905,3],[4749,4],[4768,3],[5683,4]]},"template:docs/data-layer/fixtures":{"position":[[464,2],[891,2],[3297,4],[3344,4],[3359,4],[3995,4],[4078,4],[4093,4],[4600,4],[4616,3],[4701,4],[4716,4]]},"template:docs/data-layer/orm":{"position":[[482,4],[939,4],[1360,4],[2075,4],[2248,4],[4566,4],[5627,4],[5794,3],[5825,4],[6814,4],[6866,4],[6956,3],[7685,4],[8104,4]]},"template:docs/data-layer/relationships":{"position":[[986,1],[2152,3],[5373,2],[5871,2]]},"template:docs/data-layer/serializers/index":{"position":[[288,4],[3265,4],[4290,4],[4416,3],[5003,4]]},"template:docs/getting-started/overview":{"position":[[492,2],[3578,2],[3686,3],[3772,3],[4507,2],[4554,3],[7481,2],[7750,2],[8908,2],[8960,2],[8975,2],[9015,2],[9030,2]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1535,2],[1656,2],[7783,2],[7809,1],[7909,2],[7999,1],[9563,4],[9643,3],[10216,4],[15522,3],[15581,3]]},"template:docs/route-handlers/functions":{"position":[[1460,3],[3654,1],[3972,1],[4375,1],[4615,3]]},"template:docs/testing/assertions":{"position":[[3473,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4618,2]]},"template:templates/docs/data-layer/database":{"position":[[1111,4]]},"template:templates/docs/data-layer/factories":{"position":[[1427,3],[1765,4],[2713,4],[3203,4],[3222,2],[3886,4],[3905,3],[4749,4],[4768,3],[5683,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[464,2],[891,2],[3297,4],[3344,4],[3359,4],[3995,4],[4078,4],[4093,4],[4600,4],[4616,3],[4701,4],[4716,4]]},"template:templates/docs/data-layer/orm":{"position":[[482,4],[939,4],[1360,4],[2075,4],[2248,4],[4566,4],[5627,4],[5794,3],[5825,4],[6814,4],[6866,4],[6956,3],[7685,4],[8104,4]]},"template:templates/docs/data-layer/relationships":{"position":[[986,1],[2152,3],[5373,2],[5871,2]]},"template:templates/docs/data-layer/serializers/index":{"position":[[288,4],[3265,4],[4290,4],[4416,3],[5003,4]]},"template:templates/docs/getting-started/overview":{"position":[[492,2],[3578,2],[3686,3],[3772,3],[4507,2],[4554,3],[7481,2],[7750,2],[8908,2],[8960,2],[8975,2],[9015,2],[9030,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1535,2],[1656,2],[7783,2],[7809,1],[7909,2],[7999,1],[9563,4],[9643,3],[10216,4],[15522,3],[15581,3]]},"template:templates/docs/route-handlers/functions":{"position":[[1460,3],[3654,1],[3972,1],[4375,1],[4615,3]]},"template:templates/docs/testing/assertions":{"position":[[3473,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4618,2]]}},"keywords":{}}],["1.0",{"_index":1299,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1522,3],[1579,3],[1643,3],[2777,3],[5643,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1522,3],[1579,3],[1643,3],[2777,3],[5643,4]]}},"keywords":{}}],["10",{"_index":618,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6750,3],[6880,2],[8820,3],[9531,3],[11776,2],[11833,3],[13653,4]]},"template:docs/data-layer/fixtures":{"position":[[1368,3]]},"template:docs/getting-started/overview":{"position":[[4335,4]]},"template:docs/testing/acceptance-tests":{"position":[[416,2],[1774,4],[1836,2],[2224,3],[3131,4],[3193,2],[3760,4],[3839,2],[5376,4]]},"template:templates/docs/data-layer/factories":{"position":[[6750,3],[6880,2],[8820,3],[9531,3],[11776,2],[11833,3],[13653,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[1368,3]]},"template:templates/docs/getting-started/overview":{"position":[[4335,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[416,2],[1774,4],[1836,2],[2224,3],[3131,4],[3193,2],[3760,4],[3839,2],[5376,4]]}},"keywords":{}}],["10/26/2014",{"_index":535,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1678,13],[1806,13]]},"template:templates/docs/data-layer/factories":{"position":[[1678,13],[1806,13]]}},"keywords":{}}],["100",{"_index":828,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2651,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[2651,3]]}},"keywords":{}}],["1000",{"_index":386,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[505,7]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[505,7]]}},"keywords":{}}],["10000",{"_index":1538,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1699,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1699,6]]}},"keywords":{}}],["10:00:00",{"_index":685,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[10245,9],[10854,9]]},"template:templates/docs/data-layer/factories":{"position":[[10245,9],[10854,9]]}},"keywords":{}}],["15",{"_index":443,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[2110,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[2110,4]]}},"keywords":{}}],["18",{"_index":1344,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4556,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4556,3]]}},"keywords":{}}],["1950",{"_index":1204,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3617,5]]},"template:templates/docs/getting-started/overview":{"position":[[3617,5]]}},"keywords":{}}],["1992",{"_index":1210,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3782,5],[4564,5]]},"template:templates/docs/getting-started/overview":{"position":[[3782,5],[4564,5]]}},"keywords":{}}],["2",{"_index":472,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1147,4]]},"template:docs/data-layer/factories":{"position":[[3234,4],[3253,2],[3960,4],[3979,3],[4943,4],[5746,4]]},"template:docs/data-layer/fixtures":{"position":[[490,2],[942,2]]},"template:docs/data-layer/orm":{"position":[[518,4],[7745,3],[7770,4],[8189,4]]},"template:docs/data-layer/relationships":{"position":[[1008,2],[2156,2],[2184,3],[5436,2],[5955,2]]},"template:docs/data-layer/serializers/index":{"position":[[4445,3]]},"template:docs/getting-started/overview":{"position":[[557,2],[3587,2],[3823,3],[4597,2],[4644,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4820,2]]},"template:docs/route-handlers/functions":{"position":[[1464,2]]},"template:docs/testing/integration-and-unit-tests":{"position":[[6790,2]]},"template:templates/docs/data-layer/database":{"position":[[1147,4]]},"template:templates/docs/data-layer/factories":{"position":[[3234,4],[3253,2],[3960,4],[3979,3],[4943,4],[5746,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[490,2],[942,2]]},"template:templates/docs/data-layer/orm":{"position":[[518,4],[7745,3],[7770,4],[8189,4]]},"template:templates/docs/data-layer/relationships":{"position":[[1008,2],[2156,2],[2184,3],[5436,2],[5955,2]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4445,3]]},"template:templates/docs/getting-started/overview":{"position":[[557,2],[3587,2],[3823,3],[4597,2],[4644,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4820,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1464,2]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[6790,2]]}},"keywords":{}}],["2.0",{"_index":1298,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1458,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1458,3]]}},"keywords":{}}],["2.6.0",{"_index":1173,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[894,6]]},"template:templates/docs/getting-started/installation":{"position":[[894,6]]}},"keywords":{}}],["2/22/2019",{"_index":574,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3996,12]]},"template:templates/docs/data-layer/factories":{"position":[[3996,12]]}},"keywords":{}}],["200",{"_index":1573,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6162,3],[6235,3]]},"template:docs/route-handlers/shorthands":{"position":[[1218,3]]},"template:templates/docs/route-handlers/functions":{"position":[[6162,3],[6235,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1218,3]]}},"keywords":{}}],["2000",{"_index":1533,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1329,5]]},"template:docs/testing/setup-mirage":{"position":[[1617,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1329,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[1617,4]]}},"keywords":{}}],["2008",{"_index":1211,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3833,5],[4654,5]]},"template:templates/docs/getting-started/overview":{"position":[[3833,5],[4654,5]]}},"keywords":{}}],["201",{"_index":1576,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6191,3]]},"template:docs/route-handlers/shorthands":{"position":[[1230,3]]},"template:templates/docs/route-handlers/functions":{"position":[[6191,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1230,3]]}},"keywords":{}}],["2010-01-01",{"_index":684,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[10233,11],[10842,11]]},"template:templates/docs/data-layer/factories":{"position":[[10233,11],[10842,11]]}},"keywords":{}}],["2014",{"_index":937,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1414,6],[2129,6],[4650,6],[5711,6],[6920,6],[7416,6]]},"template:templates/docs/data-layer/orm":{"position":[[1414,6],[2129,6],[4650,6],[5711,6],[6920,6],[7416,6]]}},"keywords":{}}],["2019",{"_index":1206,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3633,5]]},"template:templates/docs/getting-started/overview":{"position":[[3633,5]]}},"keywords":{}}],["204",{"_index":1575,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6179,3],[6202,3]]},"template:templates/docs/route-handlers/functions":{"position":[[6179,3],[6202,3]]}},"keywords":{}}],["23",{"_index":951,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2165,4],[2366,4]]},"template:templates/docs/data-layer/orm":{"position":[[2165,4],[2366,4]]}},"keywords":{}}],["24",{"_index":380,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[413,2],[492,3]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[413,2],[492,3]]}},"keywords":{}}],["26",{"_index":936,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1410,3],[2125,3],[4646,3],[5707,3],[6916,3],[7412,3]]},"template:templates/docs/data-layer/orm":{"position":[[1410,3],[2125,3],[4646,3],[5707,3],[6916,3],[7412,3]]}},"keywords":{}}],["3",{"_index":473,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1180,4]]},"template:docs/data-layer/factories":{"position":[[3265,4],[3284,2],[4033,4],[4052,3],[5628,2],[5813,4],[6586,2],[10500,2],[11474,1],[11715,2],[11790,1]]},"template:docs/data-layer/fixtures":{"position":[[516,2],[991,2]]},"template:docs/data-layer/orm":{"position":[[551,4],[7805,4],[8164,3],[8224,4]]},"template:docs/data-layer/relationships":{"position":[[2159,2],[2188,3],[5895,2]]},"template:docs/data-layer/serializers/index":{"position":[[4474,3]]},"template:docs/getting-started/overview":{"position":[[619,2],[5262,3],[5345,1],[6991,1]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5231,2],[6246,3],[6301,2]]},"template:docs/route-handlers/functions":{"position":[[1467,2]]},"template:docs/testing/acceptance-tests":{"position":[[5618,1]]},"template:docs/testing/assertions":{"position":[[3189,2]]},"template:templates/docs/data-layer/database":{"position":[[1180,4]]},"template:templates/docs/data-layer/factories":{"position":[[3265,4],[3284,2],[4033,4],[4052,3],[5628,2],[5813,4],[6586,2],[10500,2],[11474,1],[11715,2],[11790,1]]},"template:templates/docs/data-layer/fixtures":{"position":[[516,2],[991,2]]},"template:templates/docs/data-layer/orm":{"position":[[551,4],[7805,4],[8164,3],[8224,4]]},"template:templates/docs/data-layer/relationships":{"position":[[2159,2],[2188,3],[5895,2]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4474,3]]},"template:templates/docs/getting-started/overview":{"position":[[619,2],[5262,3],[5345,1],[6991,1]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5231,2],[6246,3],[6301,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1467,2]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5618,1]]},"template:templates/docs/testing/assertions":{"position":[[3189,2]]}},"keywords":{}}],["3.0",{"_index":1290,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[276,3]]},"template:docs/testing/acceptance-tests":{"position":[[590,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[276,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[590,5]]}},"keywords":{}}],["3.0-style",{"_index":1635,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[1118,9],[1205,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1118,9],[1205,9]]}},"keywords":{}}],["3000",{"_index":1535,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1490,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1490,4]]}},"keywords":{}}],["3600",{"_index":385,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[498,4]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[498,4]]}},"keywords":{}}],["4",{"_index":559,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3296,4],[3315,2],[4106,4],[4125,3]]},"template:docs/data-layer/fixtures":{"position":[[1055,2]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7267,2]]},"template:docs/route-handlers/functions":{"position":[[1470,2]]},"template:templates/docs/data-layer/factories":{"position":[[3296,4],[3315,2],[4106,4],[4125,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[1055,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7267,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1470,2]]}},"keywords":{}}],["4000",{"_index":1527,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1024,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1024,4]]}},"keywords":{}}],["5",{"_index":558,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3108,3],[3327,4],[3346,2],[3845,2],[4180,4],[4199,3],[6811,2],[6853,1],[6911,1],[15303,3],[15365,1],[15425,1]]},"template:docs/data-layer/fixtures":{"position":[[1109,2]]},"template:docs/route-handlers/functions":{"position":[[1473,3]]},"template:docs/testing/assertions":{"position":[[3132,2],[3329,1]]},"template:templates/docs/data-layer/factories":{"position":[[3108,3],[3327,4],[3346,2],[3845,2],[4180,4],[4199,3],[6811,2],[6853,1],[6911,1],[15303,3],[15365,1],[15425,1]]},"template:templates/docs/data-layer/fixtures":{"position":[[1109,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1473,3]]},"template:templates/docs/testing/assertions":{"position":[[3132,2],[3329,1]]}},"keywords":{}}],["5).foreach(us",{"_index":617,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6703,15]]},"template:templates/docs/data-layer/factories":{"position":[[6703,15]]}},"keywords":{}}],["5/14/2018",{"_index":573,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3922,12]]},"template:templates/docs/data-layer/factories":{"position":[[3922,12]]}},"keywords":{}}],["500",{"_index":1657,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4336,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1517,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4336,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1517,3]]}},"keywords":{}}],["50m",{"_index":1528,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1054,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1054,4]]}},"keywords":{}}],["6",{"_index":802,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1162,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1162,2]]}},"keywords":{}}],["6/2/2018",{"_index":575,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4069,11]]},"template:templates/docs/data-layer/factories":{"position":[[4069,11]]}},"keywords":{}}],["6/30/2018",{"_index":577,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4216,12]]},"template:templates/docs/data-layer/factories":{"position":[[4216,12]]}},"keywords":{}}],["65",{"_index":1343,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4515,4],[4565,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4515,4],[4565,2]]}},"keywords":{}}],["7",{"_index":806,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1215,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1215,2]]}},"keywords":{}}],["7/29/2018",{"_index":576,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4142,12]]},"template:templates/docs/data-layer/factories":{"position":[[4142,12]]}},"keywords":{}}],["8",{"_index":809,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1265,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1265,2]]}},"keywords":{}}],["9",{"_index":812,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1318,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1318,2]]}},"keywords":{}}],["aaa",{"_index":1645,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3577,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3577,3]]}},"keywords":{}}],["abil",{"_index":202,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[145,7]]},"template:docs/data-layer/database":{"position":[[300,7]]},"template:docs/data-layer/factories":{"position":[[59,7]]},"template:templates/docs/advanced/mocking-guids":{"position":[[145,7]]},"template:templates/docs/data-layer/database":{"position":[[300,7]]},"template:templates/docs/data-layer/factories":{"position":[[59,7]]}},"keywords":{}}],["abov",{"_index":87,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1492,5]]},"template:docs/data-layer/factories":{"position":[[3125,5]]},"template:docs/data-layer/fixtures":{"position":[[3814,6],[5010,5]]},"template:docs/data-layer/models":{"position":[[1519,5]]},"template:docs/data-layer/orm":{"position":[[3463,5]]},"template:docs/data-layer/relationships":{"position":[[2885,6]]},"template:docs/data-layer/serializers/index":{"position":[[880,5]]},"template:docs/getting-started/overview":{"position":[[1484,6],[2881,6],[4425,6],[8803,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12780,6]]},"template:docs/route-handlers/functions":{"position":[[5004,6]]},"template:docs/testing/acceptance-tests":{"position":[[2084,6],[3655,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1492,5]]},"template:templates/docs/data-layer/factories":{"position":[[3125,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[3814,6],[5010,5]]},"template:templates/docs/data-layer/models":{"position":[[1519,5]]},"template:templates/docs/data-layer/orm":{"position":[[3463,5]]},"template:templates/docs/data-layer/relationships":{"position":[[2885,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[880,5]]},"template:templates/docs/getting-started/overview":{"position":[[1484,6],[2881,6],[4425,6],[8803,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12780,6]]},"template:templates/docs/route-handlers/functions":{"position":[[5004,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2084,6],[3655,6]]}},"keywords":{}}],["abram",{"_index":995,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7822,7],[8031,7],[8241,7]]},"template:templates/docs/data-layer/orm":{"position":[[7822,7],[8031,7],[8241,7]]}},"keywords":{}}],["absolut",{"_index":1618,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[5096,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5096,8]]}},"keywords":{}}],["abstract",{"_index":1005,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[8522,8]]},"template:templates/docs/data-layer/orm":{"position":[[8522,8]]}},"keywords":{}}],["accept",{"_index":414,"title":{"template:docs/testing/acceptance-tests":{"position":[[0,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[0,10]]}},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[763,10]]},"template:docs/data-layer/factories":{"position":[[4587,7],[13002,7]]},"template:docs/getting-started/overview":{"position":[[4779,10],[10747,10]]},"template:docs/testing/acceptance-tests":{"position":[[1,10],[18,10],[5958,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[69,10],[381,10],[7363,10]]},"template:docs/testing/setup-mirage":{"position":[[39,12]]},"template:index":{"position":[[153,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[763,10]]},"template:templates/docs/data-layer/factories":{"position":[[4587,7],[13002,7]]},"template:templates/docs/getting-started/overview":{"position":[[4779,10],[10747,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1,10],[18,10],[5958,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[69,10],[381,10],[7363,10]]},"template:templates/docs/testing/setup-mirage":{"position":[[39,12]]},"template:templates/index":{"position":[[153,10]]}},"keywords":{}}],["access",{"_index":372,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[126,6],[706,6]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1439,6]]},"template:docs/data-layer/database":{"position":[[162,6],[396,6],[907,6],[1400,6]]},"template:docs/data-layer/factories":{"position":[[15159,6]]},"template:docs/data-layer/models":{"position":[[1002,6],[1886,9],[1906,6],[2490,6]]},"template:docs/data-layer/serializers/index":{"position":[[5681,6]]},"template:docs/getting-started/overview":{"position":[[2468,6]]},"template:docs/route-handlers/functions":{"position":[[1814,9],[1911,6],[2211,6],[2371,6],[3188,8]]},"template:docs/testing/acceptance-tests":{"position":[[1076,8],[1144,8]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[126,6],[706,6]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1439,6]]},"template:templates/docs/data-layer/database":{"position":[[162,6],[396,6],[907,6],[1400,6]]},"template:templates/docs/data-layer/factories":{"position":[[15159,6]]},"template:templates/docs/data-layer/models":{"position":[[1002,6],[1886,9],[1906,6],[2490,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5681,6]]},"template:templates/docs/getting-started/overview":{"position":[[2468,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1814,9],[1911,6],[2211,6],[2371,6],[3188,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1076,8],[1144,8]]}},"keywords":{}}],["accomplish",{"_index":782,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[333,10]]},"template:docs/testing/acceptance-tests":{"position":[[2411,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4065,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[333,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2411,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4065,10]]}},"keywords":{}}],["accordingli",{"_index":1376,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7594,12],[11293,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7594,12],[11293,11]]}},"keywords":{}}],["account",{"_index":1675,"title":{},"text":{"template:docs/testing/assertions":{"position":[[303,7]]},"template:templates/docs/testing/assertions":{"position":[[303,7]]}},"keywords":{}}],["act",{"_index":398,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[177,3],[386,4]]},"template:docs/testing/acceptance-tests":{"position":[[3441,4],[3490,4],[3768,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[177,3],[386,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3441,4],[3490,4],[3768,3]]}},"keywords":{}}],["action",{"_index":1626,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[5461,8],[5553,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5461,8],[5553,6]]}},"keywords":{}}],["activemodelseri",{"_index":1108,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1566,21]]},"template:docs/getting-started/overview":{"position":[[9129,22]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7348,21],[8102,21],[14906,21]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1566,21]]},"template:templates/docs/getting-started/overview":{"position":[[9129,22]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7348,21],[8102,21],[14906,21]]}},"keywords":{}}],["activescenario",{"_index":435,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1754,14]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1754,14]]}},"keywords":{}}],["actual",{"_index":538,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1852,8],[17336,8]]},"template:docs/data-layer/orm":{"position":[[8907,8]]},"template:docs/data-layer/relationships":{"position":[[2935,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1500,6]]},"template:docs/getting-started/overview":{"position":[[3008,8],[4056,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8685,8]]},"template:docs/route-handlers/functions":{"position":[[479,6]]},"template:docs/testing/assertions":{"position":[[2400,6],[3740,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3064,8],[5208,6]]},"template:templates/docs/data-layer/factories":{"position":[[1852,8],[17336,8]]},"template:templates/docs/data-layer/orm":{"position":[[8907,8]]},"template:templates/docs/data-layer/relationships":{"position":[[2935,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1500,6]]},"template:templates/docs/getting-started/overview":{"position":[[3008,8],[4056,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8685,8]]},"template:templates/docs/route-handlers/functions":{"position":[[479,6]]},"template:templates/docs/testing/assertions":{"position":[[2400,6],[3740,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3064,8],[5208,6]]}},"keywords":{}}],["ad",{"_index":314,"title":{"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[13,5]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[13,5]]}},"text":{"template:docs/advanced/server-configuration":{"position":[[2551,5]]},"template:docs/data-layer/factories":{"position":[[9950,6]]},"template:docs/data-layer/fixtures":{"position":[[3430,5]]},"template:docs/data-layer/relationships":{"position":[[4328,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[60,5]]},"template:docs/getting-started/overview":{"position":[[1303,2],[10729,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3617,5],[3800,5],[8012,5],[17416,6]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[14,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[2551,5]]},"template:templates/docs/data-layer/factories":{"position":[[9950,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[3430,5]]},"template:templates/docs/data-layer/relationships":{"position":[[4328,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[60,5]]},"template:templates/docs/getting-started/overview":{"position":[[1303,2],[10729,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3617,5],[3800,5],[8012,5],[17416,6]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[14,5]]}},"keywords":{}}],["add",{"_index":164,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1906,3],[1971,3]]},"template:docs/advanced/server-configuration":{"position":[[2405,3]]},"template:docs/advanced/switching-between-scenarios":{"position":[[36,4],[450,3],[1200,3]]},"template:docs/data-layer/factories":{"position":[[3361,3]]},"template:docs/data-layer/fixtures":{"position":[[801,3],[4488,3]]},"template:docs/data-layer/orm":{"position":[[262,3],[1923,3],[4862,3]]},"template:docs/data-layer/relationships":{"position":[[143,4],[767,4],[2001,4],[2830,3]]},"template:docs/getting-started/installation":{"position":[[103,3],[904,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[166,3],[858,3],[3039,3],[10013,3],[13661,3],[17027,3]]},"template:docs/route-handlers/functions":{"position":[[1516,3]]},"template:docs/testing/acceptance-tests":{"position":[[596,3],[3932,3]]},"template:docs/testing/assertions":{"position":[[1682,3]]},"template:templates/docs/advanced/environment-options":{"position":[[1906,3],[1971,3]]},"template:templates/docs/advanced/server-configuration":{"position":[[2405,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[36,4],[450,3],[1200,3]]},"template:templates/docs/data-layer/factories":{"position":[[3361,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[801,3],[4488,3]]},"template:templates/docs/data-layer/orm":{"position":[[262,3],[1923,3],[4862,3]]},"template:templates/docs/data-layer/relationships":{"position":[[143,4],[767,4],[2001,4],[2830,3]]},"template:templates/docs/getting-started/installation":{"position":[[103,3],[904,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[166,3],[858,3],[3039,3],[10013,3],[13661,3],[17027,3]]},"template:templates/docs/route-handlers/functions":{"position":[[1516,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[596,3],[3932,3]]},"template:templates/docs/testing/assertions":{"position":[[1682,3]]}},"keywords":{}}],["addit",{"_index":303,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2161,10]]},"template:docs/data-layer/factories":{"position":[[7422,10],[13010,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3491,10],[17471,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1215,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2161,10]]},"template:templates/docs/data-layer/factories":{"position":[[7422,10],[13010,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3491,10],[17471,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1215,8]]}},"keywords":{}}],["addition",{"_index":1322,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3373,13]]},"template:docs/route-handlers/functions":{"position":[[5287,13],[6268,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3373,13]]},"template:templates/docs/route-handlers/functions":{"position":[[5287,13],[6268,13]]}},"keywords":{}}],["addon",{"_index":1161,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[93,5],[415,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1925,6],[17313,5]]},"template:templates/docs/getting-started/installation":{"position":[[93,5],[415,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1925,6],[17313,5]]}},"keywords":{}}],["address",{"_index":1007,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[8709,9]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1724,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7800,8],[7830,7],[7959,8],[7984,10]]},"template:docs/route-handlers/shorthands":{"position":[[3921,14]]},"template:docs/testing/assertions":{"position":[[356,7]]},"template:templates/docs/data-layer/orm":{"position":[[8709,9]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1724,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7800,8],[7830,7],[7959,8],[7984,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[3921,14]]},"template:templates/docs/testing/assertions":{"position":[[356,7]]}},"keywords":{}}],["addressid",{"_index":1086,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[961,9],[1146,10],[1269,11],[1739,12]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[961,9],[1146,10],[1269,11],[1739,12]]}},"keywords":{}}],["adher",{"_index":1156,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[6732,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6732,6]]}},"keywords":{}}],["adjust",{"_index":339,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3780,6],[3855,6]]},"template:docs/route-handlers/functions":{"position":[[765,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[3780,6],[3855,6]]},"template:templates/docs/route-handlers/functions":{"position":[[765,6]]}},"keywords":{}}],["adjust/cr",{"_index":360,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4886,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[4886,13]]}},"keywords":{}}],["admin",{"_index":720,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[14154,5],[14165,10],[14228,5],[14488,7]]},"template:templates/docs/data-layer/factories":{"position":[[14154,5],[14165,10],[14228,5],[14488,7]]}},"keywords":{}}],["administr",{"_index":434,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1653,13],[1672,18],[1732,13]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1653,13],[1672,18],[1732,13]]}},"keywords":{}}],["advanc",{"_index":1703,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3937,8]]},"template:templates/docs/testing/assertions":{"position":[[3937,8]]}},"keywords":{}}],["advantag",{"_index":866,"title":{},"text":{"template:docs/data-layer/models":{"position":[[16,9]]},"template:docs/data-layer/orm":{"position":[[4127,9]]},"template:docs/getting-started/overview":{"position":[[2149,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2262,9],[16331,9],[18065,9]]},"template:docs/route-handlers/functions":{"position":[[5261,9]]},"template:templates/docs/data-layer/models":{"position":[[16,9]]},"template:templates/docs/data-layer/orm":{"position":[[4127,9]]},"template:templates/docs/getting-started/overview":{"position":[[2149,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2262,9],[16331,9],[18065,9]]},"template:templates/docs/route-handlers/functions":{"position":[[5261,9]]}},"keywords":{}}],["advic",{"_index":25,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[172,6],[235,9],[314,7],[686,9],[875,8],[1157,8],[1169,8],[1730,6]]},"template:docs/data-layer/factories":{"position":[[16045,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[172,6],[235,9],[314,7],[686,9],[875,8],[1157,8],[1169,8],[1730,6]]},"template:templates/docs/data-layer/factories":{"position":[[16045,6]]}},"keywords":{}}],["affect",{"_index":424,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1155,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8385,6],[12660,6]]},"template:docs/testing/acceptance-tests":{"position":[[4829,6]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1155,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8385,6],[12660,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4829,6]]}},"keywords":{}}],["aftercr",{"_index":623,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7050,11],[7288,12],[7838,11],[8038,11],[8616,11],[8955,11],[9136,11],[9703,11],[11340,13],[11880,11],[12273,11],[13351,11],[15926,11],[16142,12],[16769,11],[17157,11],[17382,11]]},"template:templates/docs/data-layer/factories":{"position":[[7050,11],[7288,12],[7838,11],[8038,11],[8616,11],[8955,11],[9136,11],[9703,11],[11340,13],[11880,11],[12273,11],[13351,11],[15926,11],[16142,12],[16769,11],[17157,11],[17382,11]]}},"keywords":{}}],["aftercreate(post",{"_index":646,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7936,17],[9366,17],[11658,17],[12417,17]]},"template:templates/docs/data-layer/factories":{"position":[[7936,17],[9366,17],[11658,17],[12417,17]]}},"keywords":{}}],["ag",{"_index":1090,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1771,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4468,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1771,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4468,5]]}},"keywords":{}}],["again",{"_index":981,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[5258,6]]},"template:docs/data-layer/relationships":{"position":[[1646,6]]},"template:docs/testing/acceptance-tests":{"position":[[4696,6]]},"template:templates/docs/data-layer/orm":{"position":[[5258,6]]},"template:templates/docs/data-layer/relationships":{"position":[[1646,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4696,6]]}},"keywords":{}}],["against",{"_index":142,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1278,7],[1347,7]]},"template:docs/data-layer/database":{"position":[[1457,7]]},"template:docs/data-layer/factories":{"position":[[1887,7]]},"template:docs/getting-started/installation":{"position":[[1297,7]]},"template:docs/getting-started/overview":{"position":[[10397,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8699,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1135,7]]},"template:docs/testing/assertions":{"position":[[43,7],[401,7],[611,7],[746,7],[1216,7],[1526,7],[1580,7],[2234,7],[2329,7],[2388,7],[2988,7],[3275,7],[3350,7],[3589,7],[3834,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1847,7],[7517,7]]},"template:templates/docs/advanced/environment-options":{"position":[[1278,7],[1347,7]]},"template:templates/docs/data-layer/database":{"position":[[1457,7]]},"template:templates/docs/data-layer/factories":{"position":[[1887,7]]},"template:templates/docs/getting-started/installation":{"position":[[1297,7]]},"template:templates/docs/getting-started/overview":{"position":[[10397,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8699,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1135,7]]},"template:templates/docs/testing/assertions":{"position":[[43,7],[401,7],[611,7],[746,7],[1216,7],[1526,7],[1580,7],[2234,7],[2329,7],[2388,7],[2988,7],[3275,7],[3350,7],[3589,7],[3834,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1847,7],[7517,7]]}},"keywords":{}}],["ago",{"_index":1381,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8039,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8039,4]]}},"keywords":{}}],["ajax",{"_index":375,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[285,4]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[285,4]]}},"keywords":{}}],["align",{"_index":329,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2905,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5041,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[2905,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5041,7]]}},"keywords":{}}],["allow",{"_index":367,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[45,6]]},"template:docs/data-layer/database":{"position":[[241,6]]},"template:docs/data-layer/orm":{"position":[[335,6],[8505,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1451,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16697,6]]},"template:docs/testing/assertions":{"position":[[2151,8]]},"template:docs/testing/setup-mirage":{"position":[[184,6],[581,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[45,6]]},"template:templates/docs/data-layer/database":{"position":[[241,6]]},"template:templates/docs/data-layer/orm":{"position":[[335,6],[8505,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1451,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16697,6]]},"template:templates/docs/testing/assertions":{"position":[[2151,8]]},"template:templates/docs/testing/setup-mirage":{"position":[[184,6],[581,6]]}},"keywords":{}}],["along",{"_index":252,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[364,5]]},"template:docs/getting-started/overview":{"position":[[10764,5]]},"template:docs/route-handlers/shorthands":{"position":[[2651,5],[3342,5]]},"template:docs/testing/assertions":{"position":[[2858,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[364,5]]},"template:templates/docs/getting-started/overview":{"position":[[10764,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2651,5],[3342,5]]},"template:templates/docs/testing/assertions":{"position":[[2858,6]]}},"keywords":{}}],["alongsid",{"_index":1306,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2057,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[862,9]]},"template:docs/testing/assertions":{"position":[[466,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2057,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[862,9]]},"template:templates/docs/testing/assertions":{"position":[[466,9]]}},"keywords":{}}],["alreadi",{"_index":238,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[1117,7],[1195,7]]},"template:docs/data-layer/factories":{"position":[[8681,7],[9194,7]]},"template:docs/data-layer/orm":{"position":[[4690,7]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[136,7]]},"template:docs/getting-started/overview":{"position":[[1612,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2947,7]]},"template:docs/route-handlers/functions":{"position":[[5109,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2471,7]]},"template:templates/docs/advanced/mocking-guids":{"position":[[1117,7],[1195,7]]},"template:templates/docs/data-layer/factories":{"position":[[8681,7],[9194,7]]},"template:templates/docs/data-layer/orm":{"position":[[4690,7]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[136,7]]},"template:templates/docs/getting-started/overview":{"position":[[1612,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2947,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5109,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2471,7]]}},"keywords":{}}],["altern",{"_index":774,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17621,11]]},"template:docs/getting-started/what-is-mirage":{"position":[[1662,12]]},"template:templates/docs/data-layer/factories":{"position":[[17621,11]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1662,12]]}},"keywords":{}}],["although",{"_index":366,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[29,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13903,9]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[29,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13903,9]]}},"keywords":{}}],["alway",{"_index":461,"title":{},"text":{"template:docs/data-layer/database":{"position":[[610,6]]},"template:docs/data-layer/factories":{"position":[[11174,7]]},"template:docs/data-layer/fixtures":{"position":[[3660,6]]},"template:docs/getting-started/installation":{"position":[[1329,6]]},"template:docs/getting-started/overview":{"position":[[5808,6],[9872,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9305,6],[10864,6],[18644,6]]},"template:docs/testing/acceptance-tests":{"position":[[5026,6],[5168,6]]},"template:templates/docs/data-layer/database":{"position":[[610,6]]},"template:templates/docs/data-layer/factories":{"position":[[11174,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[3660,6]]},"template:templates/docs/getting-started/installation":{"position":[[1329,6]]},"template:templates/docs/getting-started/overview":{"position":[[5808,6],[9872,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9305,6],[10864,6],[18644,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5026,6],[5168,6]]}},"keywords":{}}],["alwaysincludelinkagedata",{"_index":1131,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4176,25]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10730,24],[11042,25]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4176,25]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10730,24],[11042,25]]}},"keywords":{}}],["america",{"_index":1334,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3995,9],[4083,9],[4238,9],[4309,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3995,9],[4083,9],[4238,9],[4309,9]]}},"keywords":{}}],["ann",{"_index":1242,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6843,5],[9039,5]]},"template:templates/docs/getting-started/overview":{"position":[[6843,5],[9039,5]]}},"keywords":{}}],["annot",{"_index":1039,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2909,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2909,10]]}},"keywords":{}}],["anonym",{"_index":503,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[232,9],[14078,9],[14093,14],[14205,10],[14460,11]]},"template:templates/docs/data-layer/factories":{"position":[[232,9],[14078,9],[14093,14],[14205,10],[14460,11]]}},"keywords":{}}],["anoth",{"_index":739,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15558,7]]},"template:docs/data-layer/orm":{"position":[[6357,7]]},"template:docs/data-layer/relationships":{"position":[[192,7],[536,7]]},"template:docs/data-layer/serializers/index":{"position":[[3657,7]]},"template:docs/route-handlers/functions":{"position":[[4798,7]]},"template:docs/testing/acceptance-tests":{"position":[[2685,7]]},"template:docs/testing/assertions":{"position":[[2262,7]]},"template:templates/docs/data-layer/factories":{"position":[[15558,7]]},"template:templates/docs/data-layer/orm":{"position":[[6357,7]]},"template:templates/docs/data-layer/relationships":{"position":[[192,7],[536,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3657,7]]},"template:templates/docs/route-handlers/functions":{"position":[[4798,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2685,7]]},"template:templates/docs/testing/assertions":{"position":[[2262,7]]}},"keywords":{}}],["anotherauthor",{"_index":1014,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1093,14]]},"template:templates/docs/data-layer/relationships":{"position":[[1093,14]]}},"keywords":{}}],["anyth",{"_index":586,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4635,8],[10275,8]]},"template:docs/data-layer/orm":{"position":[[5414,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3078,8]]},"template:templates/docs/data-layer/factories":{"position":[[4635,8],[10275,8]]},"template:templates/docs/data-layer/orm":{"position":[[5414,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3078,8]]}},"keywords":{}}],["api",{"_index":335,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3267,6],[3701,6],[5350,6]]},"template:docs/data-layer/database":{"position":[[1910,4],[1926,3]]},"template:docs/data-layer/factories":{"position":[[13680,3]]},"template:docs/data-layer/fixtures":{"position":[[1678,3],[1748,3],[2696,3]]},"template:docs/data-layer/orm":{"position":[[770,4]]},"template:docs/data-layer/relationships":{"position":[[6013,3],[6227,4]]},"template:docs/data-layer/serializers/index":{"position":[[906,3],[1016,3],[3537,3],[5268,3],[6935,3]]},"template:docs/getting-started/overview":{"position":[[258,3],[434,6],[7676,3],[9330,3],[10104,4],[10417,4],[10496,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5344,4],[6650,3],[8815,3],[9469,4],[14155,3],[14863,3]]},"template:docs/getting-started/what-is-mirage":{"position":[[95,5]]},"template:docs/route-handlers/functions":{"position":[[1308,6],[7146,4],[7529,3]]},"template:docs/route-handlers/shorthands":{"position":[[12,4]]},"template:docs/testing/assertions":{"position":[[4003,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3980,3]]},"template:docs/testing/setup-mirage":{"position":[[1597,5]]},"template:index":{"position":[[324,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[3267,6],[3701,6],[5350,6]]},"template:templates/docs/data-layer/database":{"position":[[1910,4],[1926,3]]},"template:templates/docs/data-layer/factories":{"position":[[13680,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[1678,3],[1748,3],[2696,3]]},"template:templates/docs/data-layer/orm":{"position":[[770,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6013,3],[6227,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[906,3],[1016,3],[3537,3],[5268,3],[6935,3]]},"template:templates/docs/getting-started/overview":{"position":[[258,3],[434,6],[7676,3],[9330,3],[10104,4],[10417,4],[10496,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5344,4],[6650,3],[8815,3],[9469,4],[14155,3],[14863,3]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[95,5]]},"template:templates/docs/route-handlers/functions":{"position":[[1308,6],[7146,4],[7529,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[12,4]]},"template:templates/docs/testing/assertions":{"position":[[4003,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3980,3]]},"template:templates/docs/testing/setup-mirage":{"position":[[1597,5]]},"template:templates/index":{"position":[[324,4]]}},"keywords":{}}],["api/advic",{"_index":39,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[485,13],[1571,12]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[485,13],[1571,12]]}},"keywords":{}}],["api/movi",{"_index":1188,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[735,12],[2940,11],[4389,11],[4481,11]]},"template:templates/docs/getting-started/overview":{"position":[[735,12],[2940,11],[4389,11],[4481,11]]}},"keywords":{}}],["api/movies/${movie.id}/cast-memb",{"_index":1139,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4875,38]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4875,38]]}},"keywords":{}}],["api/movies/1",{"_index":928,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[857,13],[911,13]]},"template:templates/docs/data-layer/orm":{"position":[[857,13],[911,13]]}},"keywords":{}}],["api/movies/1/cast-memb",{"_index":1140,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5117,28]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5117,28]]}},"keywords":{}}],["api/movies/1?include=director",{"_index":982,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[5549,30]]},"template:templates/docs/data-layer/orm":{"position":[[5549,30]]}},"keywords":{}}],["api/users/1",{"_index":1408,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[10287,14]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10287,14]]}},"keywords":{}}],["app",{"_index":158,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1647,3]]},"template:docs/advanced/server-configuration":{"position":[[531,3]]},"template:docs/data-layer/database":{"position":[[357,4]]},"template:docs/data-layer/factories":{"position":[[417,4],[993,4],[7582,4],[7758,4],[8384,3],[12083,4],[14600,3],[14698,3],[15461,3]]},"template:docs/data-layer/models":{"position":[[540,3],[742,4]]},"template:docs/data-layer/orm":{"position":[[704,3]]},"template:docs/data-layer/serializers/index":{"position":[[391,4],[858,4],[1166,4],[1365,4],[1413,3],[3197,3],[3902,4],[4501,3],[4599,3]]},"template:docs/getting-started/installation":{"position":[[1051,4],[1138,3],[1503,3]]},"template:docs/getting-started/overview":{"position":[[708,3],[4362,3],[7153,3],[7552,4],[10058,4],[10158,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1746,4],[5612,5],[8492,4],[9184,4],[9344,3],[13941,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[636,4],[1010,3],[1044,3],[1131,3],[1943,4]]},"template:docs/route-handlers/functions":{"position":[[316,3],[860,3],[2180,3],[2484,4],[4156,3],[5033,3],[6976,4],[7110,3]]},"template:docs/route-handlers/shorthands":{"position":[[2641,3],[3332,3]]},"template:docs/testing/acceptance-tests":{"position":[[48,3],[358,4],[4093,3]]},"template:docs/testing/assertions":{"position":[[120,4],[281,3],[547,3],[680,3],[880,3],[1475,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3104,4],[3275,3]]},"template:docs/testing/setup-mirage":{"position":[[841,3]]},"template:index":{"position":[[82,4],[248,3]]},"template:templates/docs/advanced/environment-options":{"position":[[1647,3]]},"template:templates/docs/advanced/server-configuration":{"position":[[531,3]]},"template:templates/docs/data-layer/database":{"position":[[357,4]]},"template:templates/docs/data-layer/factories":{"position":[[417,4],[993,4],[7582,4],[7758,4],[8384,3],[12083,4],[14600,3],[14698,3],[15461,3]]},"template:templates/docs/data-layer/models":{"position":[[540,3],[742,4]]},"template:templates/docs/data-layer/orm":{"position":[[704,3]]},"template:templates/docs/data-layer/serializers/index":{"position":[[391,4],[858,4],[1166,4],[1365,4],[1413,3],[3197,3],[3902,4],[4501,3],[4599,3]]},"template:templates/docs/getting-started/installation":{"position":[[1051,4],[1138,3],[1503,3]]},"template:templates/docs/getting-started/overview":{"position":[[708,3],[4362,3],[7153,3],[7552,4],[10058,4],[10158,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1746,4],[5612,5],[8492,4],[9184,4],[9344,3],[13941,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[636,4],[1010,3],[1044,3],[1131,3],[1943,4]]},"template:templates/docs/route-handlers/functions":{"position":[[316,3],[860,3],[2180,3],[2484,4],[4156,3],[5033,3],[6976,4],[7110,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2641,3],[3332,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[48,3],[358,4],[4093,3]]},"template:templates/docs/testing/assertions":{"position":[[120,4],[281,3],[547,3],[680,3],[880,3],[1475,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3104,4],[3275,3]]},"template:templates/docs/testing/setup-mirage":{"position":[[841,3]]},"template:templates/index":{"position":[[82,4],[248,3]]}},"keywords":{}}],["app'",{"_index":152,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1512,5],[1790,5],[2800,5]]},"template:docs/data-layer/database":{"position":[[1522,5]]},"template:docs/testing/acceptance-tests":{"position":[[173,5],[1353,5]]},"template:docs/testing/assertions":{"position":[[62,5],[1228,5],[3287,5],[3653,5]]},"template:templates/docs/advanced/environment-options":{"position":[[1512,5],[1790,5],[2800,5]]},"template:templates/docs/data-layer/database":{"position":[[1522,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[173,5],[1353,5]]},"template:templates/docs/testing/assertions":{"position":[[62,5],[1228,5],[3287,5],[3653,5]]}},"keywords":{}}],["app-nam",{"_index":1763,"title":{},"text":{"template:docs/testing/setup-mirage":{"position":[[822,8]]},"template:templates/docs/testing/setup-mirage":{"position":[[822,8]]}},"keywords":{}}],["app-name/mirage/config",{"_index":1762,"title":{},"text":{"template:docs/testing/setup-mirage":{"position":[[785,25]]},"template:templates/docs/testing/setup-mirage":{"position":[[785,25]]}},"keywords":{}}],["app.import",{"_index":1303,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1812,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1812,10]]}},"keywords":{}}],["app/initializers/custom-inflector-rules.j",{"_index":66,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[945,42]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[945,42]]}},"keywords":{}}],["app/mirag",{"_index":177,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2259,12],[2340,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13586,11],[13814,10]]},"template:templates/docs/advanced/environment-options":{"position":[[2259,12],[2340,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13586,11],[13814,10]]}},"keywords":{}}],["app/models/blog-post.j",{"_index":1055,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4755,23]]},"template:templates/docs/data-layer/relationships":{"position":[[4755,23]]}},"keywords":{}}],["app/models/car.j",{"_index":1072,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5604,17]]},"template:templates/docs/data-layer/relationships":{"position":[[5604,17]]}},"keywords":{}}],["app/models/comment.j",{"_index":1054,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4650,21]]},"template:templates/docs/data-layer/relationships":{"position":[[4650,21]]}},"keywords":{}}],["app/models/picture.j",{"_index":1056,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4836,21]]},"template:templates/docs/data-layer/relationships":{"position":[[4836,21]]}},"keywords":{}}],["app/models/user.j",{"_index":1071,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5509,18]]},"template:templates/docs/data-layer/relationships":{"position":[[5509,18]]}},"keywords":{}}],["app/models/watch.j",{"_index":1073,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5659,19]]},"template:templates/docs/data-layer/relationships":{"position":[[5659,19]]}},"keywords":{}}],["appli",{"_index":346,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4192,5],[4259,5],[4361,5]]},"template:docs/data-layer/factories":{"position":[[9775,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1864,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6169,7],[7333,7]]},"template:docs/testing/acceptance-tests":{"position":[[1308,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[4192,5],[4259,5],[4361,5]]},"template:templates/docs/data-layer/factories":{"position":[[9775,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1864,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6169,7],[7333,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1308,7]]}},"keywords":{}}],["applic",{"_index":70,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1059,11]]},"template:docs/advanced/mocking-guids":{"position":[[20,12]]},"template:docs/advanced/server-configuration":{"position":[[4547,11],[4583,11],[4780,12]]},"template:docs/data-layer/database":{"position":[[207,12]]},"template:docs/data-layer/factories":{"position":[[2048,13]]},"template:docs/data-layer/models":{"position":[[250,11]]},"template:docs/data-layer/orm":{"position":[[4336,11]]},"template:docs/data-layer/serializers/index":{"position":[[1779,12],[2599,11],[2770,16],[2919,11],[4761,16],[6032,11],[7038,12],[7295,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1859,11]]},"template:docs/getting-started/what-is-mirage":{"position":[[364,11],[1194,11]]},"template:docs/testing/acceptance-tests":{"position":[[551,11]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1059,11]]},"template:templates/docs/advanced/mocking-guids":{"position":[[20,12]]},"template:templates/docs/advanced/server-configuration":{"position":[[4547,11],[4583,11],[4780,12]]},"template:templates/docs/data-layer/database":{"position":[[207,12]]},"template:templates/docs/data-layer/factories":{"position":[[2048,13]]},"template:templates/docs/data-layer/models":{"position":[[250,11]]},"template:templates/docs/data-layer/orm":{"position":[[4336,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1779,12],[2599,11],[2770,16],[2919,11],[4761,16],[6032,11],[7038,12],[7295,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1859,11]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[364,11],[1194,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[551,11]]}},"keywords":{}}],["application'",{"_index":182,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2449,13]]},"template:docs/advanced/server-configuration":{"position":[[1750,13]]},"template:docs/data-layer/models":{"position":[[70,13]]},"template:docs/data-layer/orm":{"position":[[2701,13],[2803,13],[3068,13],[8776,13]]},"template:docs/data-layer/serializers/index":{"position":[[3098,13]]},"template:docs/route-handlers/shorthands":{"position":[[5938,13]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4215,13]]},"template:templates/docs/advanced/environment-options":{"position":[[2449,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[1750,13]]},"template:templates/docs/data-layer/models":{"position":[[70,13]]},"template:templates/docs/data-layer/orm":{"position":[[2701,13],[2803,13],[3068,13],[8776,13]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3098,13]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5938,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4215,13]]}},"keywords":{}}],["application-wid",{"_index":213,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[288,16]]},"template:docs/data-layer/serializers/index":{"position":[[2162,16]]},"template:templates/docs/advanced/mocking-guids":{"position":[[288,16]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2162,16]]}},"keywords":{}}],["application/json",{"_index":1578,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6318,17]]},"template:templates/docs/route-handlers/functions":{"position":[[6318,17]]}},"keywords":{}}],["applicationseri",{"_index":1117,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[2743,21],[4734,21],[6834,21]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2743,21],[4734,21],[6834,21]]}},"keywords":{}}],["applicationserializer.extend",{"_index":1118,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[2802,30],[4793,30]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2802,30],[4793,30]]}},"keywords":{}}],["application|modelnam",{"_index":218,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[447,23]]},"template:templates/docs/advanced/mocking-guids":{"position":[[447,23]]}},"keywords":{}}],["applyemberdataseri",{"_index":353,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4330,25],[4981,25]]},"template:templates/docs/advanced/server-configuration":{"position":[[4330,25],[4981,25]]}},"keywords":{"module:ember-cli-mirage/ember-data":{"position":[null]}}}],["applyemberdataserializers(config.seri",{"_index":363,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[5216,46]]},"template:templates/docs/advanced/server-configuration":{"position":[[5216,46]]}},"keywords":{}}],["approach",{"_index":85,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1422,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10447,8],[14267,8]]},"template:docs/testing/acceptance-tests":{"position":[[2617,8],[3502,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4121,8],[5081,8]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1422,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10447,8],[14267,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2617,8],[3502,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4121,8],[5081,8]]}},"keywords":{}}],["appropri",{"_index":1113,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[2118,11]]},"template:docs/route-handlers/shorthands":{"position":[[2701,11],[3392,11],[4159,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2118,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2701,11],[3392,11],[4159,11]]}},"keywords":{}}],["arbitrari",{"_index":857,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[4919,9]]},"template:docs/data-layer/orm":{"position":[[8623,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[4919,9]]},"template:templates/docs/data-layer/orm":{"position":[[8623,9]]}},"keywords":{}}],["architectur",{"_index":1098,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[443,12]]},"template:templates/docs/data-layer/serializers/index":{"position":[[443,12]]}},"keywords":{}}],["aren't",{"_index":672,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9609,6]]},"template:templates/docs/data-layer/factories":{"position":[[9609,6]]}},"keywords":{}}],["argument",{"_index":270,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[950,8],[1247,8]]},"template:docs/data-layer/database":{"position":[[957,9]]},"template:docs/data-layer/factories":{"position":[[1241,9],[1525,8],[4553,8],[8026,8],[10404,8],[11243,9]]},"template:docs/data-layer/fixtures":{"position":[[2137,8]]},"template:docs/data-layer/orm":{"position":[[3966,8]]},"template:docs/data-layer/serializers/index":{"position":[[6174,9]]},"template:docs/getting-started/overview":{"position":[[2451,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6406,9]]},"template:docs/route-handlers/functions":{"position":[[430,8],[701,8],[3817,9],[5899,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[950,8],[1247,8]]},"template:templates/docs/data-layer/database":{"position":[[957,9]]},"template:templates/docs/data-layer/factories":{"position":[[1241,9],[1525,8],[4553,8],[8026,8],[10404,8],[11243,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[2137,8]]},"template:templates/docs/data-layer/orm":{"position":[[3966,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6174,9]]},"template:templates/docs/getting-started/overview":{"position":[[2451,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6406,9]]},"template:templates/docs/route-handlers/functions":{"position":[[430,8],[701,8],[3817,9],[5899,9]]}},"keywords":{}}],["around",{"_index":1283,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10924,6]]},"template:templates/docs/getting-started/overview":{"position":[[10924,6]]}},"keywords":{}}],["arrang",{"_index":1642,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3432,8],[3481,8],[3720,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3432,8],[3481,8],[3720,7]]}},"keywords":{}}],["array",{"_index":854,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[4495,5]]},"template:docs/data-layer/relationships":{"position":[[2242,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12849,6]]},"template:docs/testing/assertions":{"position":[[3013,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[4495,5]]},"template:templates/docs/data-layer/relationships":{"position":[[2242,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12849,6]]},"template:templates/docs/testing/assertions":{"position":[[3013,5]]}},"keywords":{}}],["arrow",{"_index":1146,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5663,5]]},"template:docs/route-handlers/functions":{"position":[[5363,5],[5498,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5663,5]]},"template:templates/docs/route-handlers/functions":{"position":[[5363,5],[5498,5]]}},"keywords":{}}],["articl",{"_index":1723,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2169,9],[2215,7],[2637,9],[2696,7],[2781,9],[3577,9],[3662,7],[3723,9],[3814,7],[4571,9],[4781,7],[4864,9],[6743,9],[6976,7],[7053,9]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2169,9],[2215,7],[2637,9],[2696,7],[2781,9],[3577,9],[3662,7],[3723,9],[3814,7],[4571,9],[4781,7],[4864,9],[6743,9],[6976,7],[7053,9]]}},"keywords":{}}],["article={{articl",{"_index":1724,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2254,21],[2822,21],[3764,21],[4905,21],[7094,21]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2254,21],[2822,21],[3764,21],[4905,21],[7094,21]]}},"keywords":{}}],["articleform",{"_index":1722,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2010,13],[2069,13],[2241,12],[2537,13],[2809,12],[3751,12],[4471,13],[4892,12],[6643,13],[7081,12]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2010,13],[2069,13],[2241,12],[2537,13],[2809,12],[3751,12],[4471,13],[4892,12],[6643,13],[7081,12]]}},"keywords":{}}],["ascertain",{"_index":1487,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[17330,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17330,9]]}},"keywords":{}}],["ask",{"_index":1434,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13263,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13263,3]]}},"keywords":{}}],["aspect",{"_index":1128,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3675,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3675,6]]}},"keywords":{}}],["assert",{"_index":141,"title":{"template:docs/testing/assertions":{"position":[[0,10]]},"template:templates/docs/testing/assertions":{"position":[[0,10]]}},"text":{"template:docs/advanced/environment-options":{"position":[[1268,9],[1336,10]]},"template:docs/data-layer/database":{"position":[[1450,6]]},"template:docs/data-layer/factories":{"position":[[15500,6],[16611,9],[17553,11]]},"template:docs/testing/acceptance-tests":{"position":[[3446,6],[3495,6],[3793,6],[3947,10]]},"template:docs/testing/assertions":{"position":[[1,10],[36,6],[171,6],[394,6],[484,11],[601,9],[657,6],[739,6],[1209,6],[1516,9],[1573,6],[2224,9],[2319,9],[2381,6],[2981,6],[3268,6],[3343,6],[3579,9],[3827,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2341,6],[2909,6],[4992,6],[7181,6],[7507,9]]},"template:templates/docs/advanced/environment-options":{"position":[[1268,9],[1336,10]]},"template:templates/docs/data-layer/database":{"position":[[1450,6]]},"template:templates/docs/data-layer/factories":{"position":[[15500,6],[16611,9],[17553,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3446,6],[3495,6],[3793,6],[3947,10]]},"template:templates/docs/testing/assertions":{"position":[[1,10],[36,6],[171,6],[394,6],[484,11],[601,9],[657,6],[739,6],[1209,6],[1516,9],[1573,6],[2224,9],[2319,9],[2381,6],[2981,6],[3268,6],[3343,6],[3579,9],[3827,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2341,6],[2909,6],[4992,6],[7181,6],[7507,9]]}},"keywords":{}}],["assert.deepequal(requests[0].queryparam",{"_index":1700,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3477,41]]},"template:templates/docs/testing/assertions":{"position":[[3477,41]]}},"keywords":{}}],["assert.dom(\"[data-test-id='movie-row']\").exist",{"_index":1225,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5288,49]]},"template:templates/docs/getting-started/overview":{"position":[[5288,49]]}},"keywords":{}}],["assert.dom('h1').hastext('interstellar",{"_index":1641,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3386,41]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3386,41]]}},"keywords":{}}],["assert.dom('h1').hastext('mi",{"_index":758,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16531,28],[17110,28]]},"template:templates/docs/data-layer/factories":{"position":[[16531,28],[17110,28]]}},"keywords":{}}],["assert.dom('h1').hastext('upd",{"_index":1681,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1237,33]]},"template:templates/docs/testing/assertions":{"position":[[1237,33]]}},"keywords":{}}],["assert.dom('h1').includestext(\"interstellar",{"_index":1229,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5595,46]]},"template:templates/docs/getting-started/overview":{"position":[[5595,46]]}},"keywords":{}}],["assert.dom('h2').hastext('th",{"_index":1662,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4442,29]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4442,29]]}},"keywords":{}}],["assert.dom('h2').includestext('new",{"_index":492,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1752,34]]},"template:templates/docs/data-layer/database":{"position":[[1752,34]]}},"keywords":{}}],["assert.dom('li.cast-member').exist",{"_index":1246,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6946,37]]},"template:templates/docs/getting-started/overview":{"position":[[6946,37]]}},"keywords":{}}],["assert.dom('li.movie').exist",{"_index":737,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15325,31]]},"template:docs/testing/acceptance-tests":{"position":[[1797,31],[3154,31],[3800,31]]},"template:templates/docs/data-layer/factories":{"position":[[15325,31]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1797,31],[3154,31],[3800,31]]}},"keywords":{}}],["assert.dom('option.country').exist",{"_index":827,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2605,37]]},"template:templates/docs/data-layer/fixtures":{"position":[[2605,37]]}},"keywords":{}}],["assert.dom('p').exist",{"_index":1672,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[5586,24]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5586,24]]}},"keywords":{}}],["assert.dom('tr').exist",{"_index":1697,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3296,25]]},"template:templates/docs/testing/assertions":{"position":[[3296,25]]}},"keywords":{}}],["assert.dom().includestext('sav",{"_index":1689,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1937,36]]},"template:templates/docs/testing/assertions":{"position":[[1937,36]]}},"keywords":{}}],["assert.equal(post.reload().tagids.includes(programming.id",{"_index":1690,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1974,60]]},"template:templates/docs/testing/assertions":{"position":[[1974,60]]}},"keywords":{}}],["assert.equal(requests.length",{"_index":1699,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3443,29]]},"template:templates/docs/testing/assertions":{"position":[[3443,29]]}},"keywords":{}}],["assert.equal(this.element.textcont",{"_index":1716,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[875,38],[1664,38]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[875,38],[1664,38]]}},"keywords":{}}],["assert.equal(this.server.db.lessons[0].titl",{"_index":1682,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1340,45]]},"template:templates/docs/testing/assertions":{"position":[[1340,45]]}},"keywords":{}}],["assert.equal(this.server.db.movies[0].titl",{"_index":493,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1803,44]]},"template:templates/docs/data-layer/database":{"position":[[1803,44]]}},"keywords":{}}],["assign",{"_index":204,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[183,7]]},"template:docs/data-layer/database":{"position":[[1264,7]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[419,6],[1120,6]]},"template:docs/getting-started/overview":{"position":[[3965,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[183,7]]},"template:templates/docs/data-layer/database":{"position":[[1264,7]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[419,6],[1120,6]]},"template:templates/docs/getting-started/overview":{"position":[[3965,6]]}},"keywords":{}}],["associ",{"_index":643,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7809,10],[8526,10],[8700,10],[9030,10],[9213,10],[9750,13],[12092,11],[12115,13],[12521,13],[12620,11],[12689,13],[12801,13],[12875,12],[12969,13],[13121,12],[17241,11]]},"template:docs/data-layer/fixtures":{"position":[[4536,12],[4861,12],[4959,12]]},"template:docs/data-layer/orm":{"position":[[7046,10]]},"template:docs/data-layer/relationships":{"position":[[939,10],[2096,10],[2469,11],[2507,12],[2556,11],[2613,12],[4434,11],[4463,11],[5025,13],[5051,12]]},"template:docs/getting-started/overview":{"position":[[5766,12],[5792,12],[5859,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17042,11]]},"template:docs/testing/assertions":{"position":[[2874,10]]},"template:templates/docs/data-layer/factories":{"position":[[7809,10],[8526,10],[8700,10],[9030,10],[9213,10],[9750,13],[12092,11],[12115,13],[12521,13],[12620,11],[12689,13],[12801,13],[12875,12],[12969,13],[13121,12],[17241,11]]},"template:templates/docs/data-layer/fixtures":{"position":[[4536,12],[4861,12],[4959,12]]},"template:templates/docs/data-layer/orm":{"position":[[7046,10]]},"template:templates/docs/data-layer/relationships":{"position":[[939,10],[2096,10],[2469,11],[2507,12],[2556,11],[2613,12],[4434,11],[4463,11],[5025,13],[5051,12]]},"template:templates/docs/getting-started/overview":{"position":[[5766,12],[5792,12],[5859,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17042,11]]},"template:templates/docs/testing/assertions":{"position":[[2874,10]]}},"keywords":{}}],["association('admin",{"_index":709,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13215,20]]},"template:templates/docs/data-layer/factories":{"position":[[13215,20]]}},"keywords":{}}],["asssoci",{"_index":1070,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5467,13]]},"template:templates/docs/data-layer/relationships":{"position":[[5467,13]]}},"keywords":{}}],["assum",{"_index":621,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6923,8]]},"template:docs/data-layer/orm":{"position":[[4306,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8285,9]]},"template:docs/route-handlers/functions":{"position":[[5016,7]]},"template:docs/testing/acceptance-tests":{"position":[[529,8],[1198,6]]},"template:templates/docs/data-layer/factories":{"position":[[6923,8]]},"template:templates/docs/data-layer/orm":{"position":[[4306,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8285,9]]},"template:templates/docs/route-handlers/functions":{"position":[[5016,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[529,8],[1198,6]]}},"keywords":{}}],["async",{"_index":484,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1632,5]]},"template:docs/data-layer/factories":{"position":[[15246,5],[16303,5],[16975,5]]},"template:docs/data-layer/fixtures":{"position":[[2523,5]]},"template:docs/getting-started/overview":{"position":[[5205,5],[5466,5],[6655,5]]},"template:docs/testing/acceptance-tests":{"position":[[894,5],[1717,5],[3074,5],[3692,5],[4223,5],[5511,5],[5798,5]]},"template:docs/testing/assertions":{"position":[[1020,5],[1704,5],[3075,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[682,5],[1413,5],[2179,5],[2647,5],[4581,5],[6753,5]]},"template:docs/testing/setup-mirage":{"position":[[503,5],[992,5],[1884,5]]},"template:templates/docs/data-layer/database":{"position":[[1632,5]]},"template:templates/docs/data-layer/factories":{"position":[[15246,5],[16303,5],[16975,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[2523,5]]},"template:templates/docs/getting-started/overview":{"position":[[5205,5],[5466,5],[6655,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[894,5],[1717,5],[3074,5],[3692,5],[4223,5],[5511,5],[5798,5]]},"template:templates/docs/testing/assertions":{"position":[[1020,5],[1704,5],[3075,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[682,5],[1413,5],[2179,5],[2647,5],[4581,5],[6753,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[503,5],[992,5],[1884,5]]}},"keywords":{}}],["attempt",{"_index":1565,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5610,8]]},"template:docs/testing/acceptance-tests":{"position":[[4207,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5610,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4207,7]]}},"keywords":{}}],["attr",{"_index":354,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4386,5]]},"template:docs/data-layer/models":{"position":[[1146,5]]},"template:docs/data-layer/relationships":{"position":[[5787,5],[5825,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[97,5],[126,5],[1337,5]]},"template:docs/data-layer/serializers/index":{"position":[[1757,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[15982,5]]},"template:docs/route-handlers/functions":{"position":[[4493,5],[4535,5],[5971,5],[6598,5]]},"template:docs/route-handlers/shorthands":{"position":[[848,5],[2464,5],[3145,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[4386,5]]},"template:templates/docs/data-layer/models":{"position":[[1146,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5787,5],[5825,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[97,5],[126,5],[1337,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1757,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15982,5]]},"template:templates/docs/route-handlers/functions":{"position":[[4493,5],[4535,5],[5971,5],[6598,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[848,5],[2464,5],[3145,5]]}},"keywords":{}}],["attribut",{"_index":532,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1489,10],[1991,9],[2133,11],[2980,10],[4350,9],[4493,10],[4605,10],[4850,10],[5021,10],[5185,10],[5196,10],[5227,10],[6430,9],[7383,11],[8883,9],[9903,11],[10558,11],[11139,10],[11211,9],[15826,10]]},"template:docs/data-layer/fixtures":{"position":[[1529,11]]},"template:docs/data-layer/orm":{"position":[[960,11],[1241,11],[1342,11],[1543,10],[1717,11],[2269,11],[2512,10],[3357,11],[3416,10],[3511,10],[4587,11],[5648,11],[5846,11],[5974,10],[7495,9]]},"template:docs/data-layer/serializers/index":{"position":[[310,11],[3209,9],[4312,11],[5025,11]]},"template:docs/getting-started/overview":{"position":[[511,11],[576,11],[638,11],[1109,10],[4526,11],[4616,11],[5377,9],[7500,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7912,11],[9568,11],[10221,11]]},"template:docs/route-handlers/functions":{"position":[[4236,11],[4673,9]]},"template:docs/route-handlers/shorthands":{"position":[[995,10]]},"template:docs/testing/acceptance-tests":{"position":[[2908,10]]},"template:templates/docs/data-layer/factories":{"position":[[1489,10],[1991,9],[2133,11],[2980,10],[4350,9],[4493,10],[4605,10],[4850,10],[5021,10],[5185,10],[5196,10],[5227,10],[6430,9],[7383,11],[8883,9],[9903,11],[10558,11],[11139,10],[11211,9],[15826,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[1529,11]]},"template:templates/docs/data-layer/orm":{"position":[[960,11],[1241,11],[1342,11],[1543,10],[1717,11],[2269,11],[2512,10],[3357,11],[3416,10],[3511,10],[4587,11],[5648,11],[5846,11],[5974,10],[7495,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[310,11],[3209,9],[4312,11],[5025,11]]},"template:templates/docs/getting-started/overview":{"position":[[511,11],[576,11],[638,11],[1109,10],[4526,11],[4616,11],[5377,9],[7500,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7912,11],[9568,11],[10221,11]]},"template:templates/docs/route-handlers/functions":{"position":[[4236,11],[4673,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[995,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2908,10]]}},"keywords":{}}],["attrs.nam",{"_index":1580,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6649,12]]},"template:templates/docs/route-handlers/functions":{"position":[[6649,12]]}},"keywords":{}}],["augment",{"_index":288,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1644,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[1644,7]]}},"keywords":{}}],["author",{"_index":831,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2972,7],[3132,7],[4441,7]]},"template:docs/data-layer/models":{"position":[[2589,7]]},"template:docs/data-layer/relationships":{"position":[[664,7],[732,6],[950,6],[1059,6],[1150,6],[1200,6],[1514,6],[1780,7],[2761,7],[2848,6],[3811,7],[4201,7],[4365,6]]},"template:docs/getting-started/overview":{"position":[[2537,7],[3247,6],[9606,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9606,7],[9789,6],[10106,7],[10259,7],[11820,7],[11916,7],[11938,6],[11986,7],[12055,7],[12413,7],[12820,6]]},"template:docs/testing/acceptance-tests":{"position":[[5501,9],[5788,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[2972,7],[3132,7],[4441,7]]},"template:templates/docs/data-layer/models":{"position":[[2589,7]]},"template:templates/docs/data-layer/relationships":{"position":[[664,7],[732,6],[950,6],[1059,6],[1150,6],[1200,6],[1514,6],[1780,7],[2761,7],[2848,6],[3811,7],[4201,7],[4365,6]]},"template:templates/docs/getting-started/overview":{"position":[[2537,7],[3247,6],[9606,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9606,7],[9789,6],[10106,7],[10259,7],[11820,7],[11916,7],[11938,6],[11986,7],[12055,7],[12413,7],[12820,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5501,9],[5788,9]]}},"keywords":{}}],["authorid",{"_index":840,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3349,9],[3439,8],[3571,9],[4083,9],[4706,9]]},"template:docs/data-layer/relationships":{"position":[[875,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12759,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[3349,9],[3439,8],[3571,9],[4083,9],[4706,9]]},"template:templates/docs/data-layer/relationships":{"position":[[875,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12759,8]]}},"keywords":{}}],["authors/1",{"_index":1402,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9823,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9823,11]]}},"keywords":{}}],["auto",{"_index":341,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3937,4]]},"template:docs/data-layer/serializers/index":{"position":[[1842,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1386,4],[2358,4],[2535,4],[2922,4],[4645,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[3937,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1842,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1386,4],[2358,4],[2535,4],[2922,4],[4645,4]]}},"keywords":{}}],["auto-incr",{"_index":198,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[65,17]]},"template:docs/data-layer/database":{"position":[[1291,17]]},"template:templates/docs/advanced/mocking-guids":{"position":[[65,17]]},"template:templates/docs/data-layer/database":{"position":[[1291,17]]}},"keywords":{}}],["autodiscov",{"_index":301,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2020,14]]},"template:templates/docs/advanced/server-configuration":{"position":[[2020,14]]}},"keywords":{}}],["autodiscoveri",{"_index":189,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2759,13]]},"template:templates/docs/advanced/environment-options":{"position":[[2759,13]]}},"keywords":{}}],["autogener",{"_index":282,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1351,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[1351,13]]}},"keywords":{}}],["autoload",{"_index":1665,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4891,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4891,8]]}},"keywords":{}}],["automat",{"_index":178,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2404,13]]},"template:docs/advanced/server-configuration":{"position":[[1712,13]]},"template:docs/data-layer/factories":{"position":[[789,13],[7267,14]]},"template:docs/data-layer/models":{"position":[[291,13]]},"template:docs/data-layer/orm":{"position":[[3590,13],[5335,13]]},"template:docs/data-layer/relationships":{"position":[[368,13]]},"template:docs/getting-started/overview":{"position":[[1684,13],[3889,13],[8849,13]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8943,13],[9354,13]]},"template:docs/route-handlers/functions":{"position":[[5622,13]]},"template:docs/testing/acceptance-tests":{"position":[[998,13]]},"template:templates/docs/advanced/environment-options":{"position":[[2404,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[1712,13]]},"template:templates/docs/data-layer/factories":{"position":[[789,13],[7267,14]]},"template:templates/docs/data-layer/models":{"position":[[291,13]]},"template:templates/docs/data-layer/orm":{"position":[[3590,13],[5335,13]]},"template:templates/docs/data-layer/relationships":{"position":[[368,13]]},"template:templates/docs/getting-started/overview":{"position":[[1684,13],[3889,13],[8849,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8943,13],[9354,13]]},"template:templates/docs/route-handlers/functions":{"position":[[5622,13]]},"template:templates/docs/testing/acceptance-tests":{"position":[[998,13]]}},"keywords":{}}],["avail",{"_index":879,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1064,9],[2336,9],[2703,9]]},"template:docs/data-layer/relationships":{"position":[[6045,9]]},"template:docs/data-layer/serializers/index":{"position":[[3614,10],[7114,9]]},"template:docs/route-handlers/functions":{"position":[[2995,9],[3264,9]]},"template:docs/route-handlers/shorthands":{"position":[[1103,9]]},"template:docs/testing/assertions":{"position":[[2909,9]]},"template:templates/docs/data-layer/models":{"position":[[1064,9],[2336,9],[2703,9]]},"template:templates/docs/data-layer/relationships":{"position":[[6045,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3614,10],[7114,9]]},"template:templates/docs/route-handlers/functions":{"position":[[2995,9],[3264,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1103,9]]},"template:templates/docs/testing/assertions":{"position":[[2909,9]]}},"keywords":{}}],["avoid",{"_index":129,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[923,5]]},"template:docs/data-layer/fixtures":{"position":[[1584,5]]},"template:docs/getting-started/overview":{"position":[[10238,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5597,5]]},"template:docs/testing/assertions":{"position":[[2768,5]]},"template:templates/docs/advanced/environment-options":{"position":[[923,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[1584,5]]},"template:templates/docs/getting-started/overview":{"position":[[10238,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5597,5]]},"template:templates/docs/testing/assertions":{"position":[[2768,5]]}},"keywords":{}}],["await",{"_index":486,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1657,5],[1685,5],[1728,5]]},"template:docs/data-layer/factories":{"position":[[15307,5],[16495,5],[17074,5]]},"template:docs/data-layer/fixtures":{"position":[[2587,5]]},"template:docs/getting-started/overview":{"position":[[5266,5],[5559,5],[6928,5]]},"template:docs/testing/acceptance-tests":{"position":[[1779,5],[3136,5],[3257,5],[3350,5],[3772,5],[4342,5],[4360,5],[4381,5],[4420,5],[5560,5]]},"template:docs/testing/assertions":{"position":[[1104,5],[1122,5],[1143,5],[1184,5],[1838,5],[1877,5],[1915,5],[3213,5],[3231,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[763,5],[1524,5],[2223,5],[2280,5],[2316,5],[2791,5],[2848,5],[2884,5],[3733,5],[4791,5],[4874,5],[4931,5],[4967,5],[7063,5],[7120,5],[7156,5]]},"template:templates/docs/data-layer/database":{"position":[[1657,5],[1685,5],[1728,5]]},"template:templates/docs/data-layer/factories":{"position":[[15307,5],[16495,5],[17074,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[2587,5]]},"template:templates/docs/getting-started/overview":{"position":[[5266,5],[5559,5],[6928,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1779,5],[3136,5],[3257,5],[3350,5],[3772,5],[4342,5],[4360,5],[4381,5],[4420,5],[5560,5]]},"template:templates/docs/testing/assertions":{"position":[[1104,5],[1122,5],[1143,5],[1184,5],[1838,5],[1877,5],[1915,5],[3213,5],[3231,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[763,5],[1524,5],[2223,5],[2280,5],[2316,5],[2791,5],[2848,5],[2884,5],[3733,5],[4791,5],[4874,5],[4931,5],[4967,5],[7063,5],[7120,5],[7156,5]]}},"keywords":{}}],["awar",{"_index":958,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2687,5]]},"template:docs/getting-started/overview":{"position":[[8419,5]]},"template:docs/route-handlers/shorthands":{"position":[[5924,5]]},"template:templates/docs/data-layer/orm":{"position":[[2687,5]]},"template:templates/docs/getting-started/overview":{"position":[[8419,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5924,5]]}},"keywords":{}}],["away",{"_index":1006,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[8552,4]]},"template:templates/docs/data-layer/orm":{"position":[[8552,4]]}},"keywords":{}}],["back",{"_index":1043,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3379,4]]},"template:docs/data-layer/serializers/index":{"position":[[6012,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9502,4],[9975,4]]},"template:index":{"position":[[58,4]]},"template:templates/docs/data-layer/relationships":{"position":[[3379,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6012,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9502,4],[9975,4]]},"template:templates/index":{"position":[[58,4]]}},"keywords":{}}],["backend",{"_index":507,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[306,7]]},"template:docs/data-layer/models":{"position":[[657,8]]},"template:docs/data-layer/orm":{"position":[[168,9],[790,7]]},"template:docs/data-layer/serializers/index":{"position":[[817,7],[1239,8],[1637,7],[1908,7],[3701,8],[6716,7],[6927,7]]},"template:docs/getting-started/overview":{"position":[[7635,7],[8057,7],[8157,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14928,8]]},"template:docs/getting-started/what-is-mirage":{"position":[[87,7],[415,7],[688,7],[1346,7]]},"template:docs/testing/assertions":{"position":[[592,8],[725,7],[1332,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3144,10]]},"template:templates/docs/data-layer/factories":{"position":[[306,7]]},"template:templates/docs/data-layer/models":{"position":[[657,8]]},"template:templates/docs/data-layer/orm":{"position":[[168,9],[790,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[817,7],[1239,8],[1637,7],[1908,7],[3701,8],[6716,7],[6927,7]]},"template:templates/docs/getting-started/overview":{"position":[[7635,7],[8057,7],[8157,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14928,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[87,7],[415,7],[688,7],[1346,7]]},"template:templates/docs/testing/assertions":{"position":[[592,8],[725,7],[1332,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3144,10]]}},"keywords":{}}],["bad",{"_index":1454,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14349,3],[15274,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14349,3],[15274,4]]}},"keywords":{}}],["bangladesh",{"_index":810,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1274,13]]},"template:templates/docs/data-layer/fixtures":{"position":[[1274,13]]}},"keywords":{}}],["barbarian",{"_index":1554,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[4308,11],[4594,12]]},"template:templates/docs/route-handlers/functions":{"position":[[4308,11],[4594,12]]}},"keywords":{}}],["bare",{"_index":772,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17505,4]]},"template:templates/docs/data-layer/factories":{"position":[[17505,4]]}},"keywords":{}}],["base",{"_index":579,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4407,5],[4681,4],[5048,5],[7228,4],[7378,4],[10317,4],[10553,4],[15798,4],[16029,4]]},"template:docs/getting-started/overview":{"position":[[8103,4]]},"template:docs/route-handlers/functions":{"position":[[5646,5],[6111,5]]},"template:docs/route-handlers/shorthands":{"position":[[1167,5]]},"template:templates/docs/data-layer/factories":{"position":[[4407,5],[4681,4],[5048,5],[7228,4],[7378,4],[10317,4],[10553,4],[15798,4],[16029,4]]},"template:templates/docs/getting-started/overview":{"position":[[8103,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5646,5],[6111,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1167,5]]}},"keywords":{}}],["basi",{"_index":1232,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5759,6]]},"template:templates/docs/getting-started/overview":{"position":[[5759,6]]}},"keywords":{}}],["basic",{"_index":787,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[606,5]]},"template:docs/getting-started/overview":{"position":[[1188,6],[1468,5]]},"template:docs/testing/acceptance-tests":{"position":[[5948,6]]},"template:docs/testing/assertions":{"position":[[2252,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[606,5]]},"template:templates/docs/getting-started/overview":{"position":[[1188,6],[1468,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5948,6]]},"template:templates/docs/testing/assertions":{"position":[[2252,9]]}},"keywords":{}}],["be",{"_index":223,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[624,5]]},"template:docs/advanced/server-configuration":{"position":[[2568,5]]},"template:docs/data-layer/factories":{"position":[[8923,5]]},"template:docs/getting-started/installation":{"position":[[1145,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2243,5],[6956,5],[8649,5],[9058,5],[10612,5]]},"template:docs/route-handlers/functions":{"position":[[6129,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[624,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[2568,5]]},"template:templates/docs/data-layer/factories":{"position":[[8923,5]]},"template:templates/docs/getting-started/installation":{"position":[[1145,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2243,5],[6956,5],[8649,5],[9058,5],[10612,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6129,5]]}},"keywords":{}}],["becom",{"_index":750,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16171,6]]},"template:docs/route-handlers/shorthands":{"position":[[22,6]]},"template:templates/docs/data-layer/factories":{"position":[[16171,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[22,6]]}},"keywords":{}}],["befor",{"_index":77,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1262,7],[1321,7],[1361,6]]},"template:docs/advanced/environment-options":{"position":[[519,6]]},"template:docs/data-layer/factories":{"position":[[7468,6]]},"template:docs/data-layer/models":{"position":[[702,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5084,6]]},"template:docs/route-handlers/functions":{"position":[[3504,6]]},"template:docs/testing/setup-mirage":{"position":[[236,6]]},"template:index":{"position":[[287,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1262,7],[1321,7],[1361,6]]},"template:templates/docs/advanced/environment-options":{"position":[[519,6]]},"template:templates/docs/data-layer/factories":{"position":[[7468,6]]},"template:templates/docs/data-layer/models":{"position":[[702,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5084,6]]},"template:templates/docs/route-handlers/functions":{"position":[[3504,6]]},"template:templates/docs/testing/setup-mirage":{"position":[[236,6]]},"template:templates/index":{"position":[[287,6]]}},"keywords":{}}],["begin",{"_index":1649,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3967,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3967,9]]}},"keywords":{}}],["behav",{"_index":214,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[344,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9227,6],[11151,7]]},"template:docs/route-handlers/functions":{"position":[[864,7]]},"template:docs/testing/assertions":{"position":[[937,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[344,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9227,6],[11151,7]]},"template:templates/docs/route-handlers/functions":{"position":[[864,7]]},"template:templates/docs/testing/assertions":{"position":[[937,8]]}},"keywords":{}}],["behavior",{"_index":113,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[381,9]]},"template:docs/advanced/server-configuration":{"position":[[1523,9]]},"template:docs/advanced/switching-between-scenarios":{"position":[[640,8],[1166,8]]},"template:docs/data-layer/factories":{"position":[[7866,9]]},"template:docs/data-layer/orm":{"position":[[6135,8]]},"template:docs/data-layer/serializers/index":{"position":[[2969,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5501,8],[5693,9],[6927,8],[8259,8],[10511,8],[10697,8],[10851,8],[12596,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1652,9]]},"template:docs/testing/acceptance-tests":{"position":[[81,9]]},"template:docs/testing/assertions":{"position":[[3724,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[249,9],[1994,8]]},"template:templates/docs/advanced/environment-options":{"position":[[381,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[1523,9]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[640,8],[1166,8]]},"template:templates/docs/data-layer/factories":{"position":[[7866,9]]},"template:templates/docs/data-layer/orm":{"position":[[6135,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2969,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5501,8],[5693,9],[6927,8],[8259,8],[10511,8],[10697,8],[10851,8],[12596,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1652,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[81,9]]},"template:templates/docs/testing/assertions":{"position":[[3724,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[249,9],[1994,8]]}},"keywords":{}}],["behind",{"_index":1435,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13316,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13316,6]]}},"keywords":{}}],["belong",{"_index":1052,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4567,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11972,7]]},"template:templates/docs/data-layer/relationships":{"position":[[4567,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11972,7]]}},"keywords":{}}],["belongs-to",{"_index":977,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[4940,10]]},"template:templates/docs/data-layer/orm":{"position":[[4940,10]]}},"keywords":{}}],["belongsto",{"_index":321,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2715,10]]},"template:docs/data-layer/factories":{"position":[[7707,11],[12169,9],[12231,9]]},"template:docs/data-layer/fixtures":{"position":[[3492,9]]},"template:docs/data-layer/orm":{"position":[[5023,9]]},"template:docs/data-layer/relationships":{"position":[[100,9],[413,9],[467,9],[597,9],[672,11],[703,9],[750,9],[2685,10],[3191,11],[4715,11]]},"template:docs/getting-started/overview":{"position":[[6234,9],[6300,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11753,9],[11828,11],[12346,9],[12421,11],[12586,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[2715,10]]},"template:templates/docs/data-layer/factories":{"position":[[7707,11],[12169,9],[12231,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[3492,9]]},"template:templates/docs/data-layer/orm":{"position":[[5023,9]]},"template:templates/docs/data-layer/relationships":{"position":[[100,9],[413,9],[467,9],[597,9],[672,11],[703,9],[750,9],[2685,10],[3191,11],[4715,11]]},"template:templates/docs/getting-started/overview":{"position":[[6234,9],[6300,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11753,9],[11828,11],[12346,9],[12421,11],[12586,9]]}},"keywords":{}}],["belongsto(\"us",{"_index":1037,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2769,18],[3819,18],[3848,17],[4209,17],[4264,17]]},"template:templates/docs/data-layer/relationships":{"position":[[2769,18],[3819,18],[3848,17],[4209,17],[4264,17]]}},"keywords":{}}],["belongsto('person",{"_index":978,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[5092,19]]},"template:templates/docs/data-layer/orm":{"position":[[5092,19]]}},"keywords":{}}],["belongsto('us",{"_index":832,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2980,17],[4449,17]]},"template:templates/docs/data-layer/fixtures":{"position":[[2980,17],[4449,17]]}},"keywords":{}}],["below",{"_index":290,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1813,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[866,5]]},"template:docs/route-handlers/functions":{"position":[[2674,6]]},"template:docs/route-handlers/shorthands":{"position":[[1124,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[1813,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[866,5]]},"template:templates/docs/route-handlers/functions":{"position":[[2674,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1124,6]]}},"keywords":{}}],["benefit",{"_index":315,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2557,7]]},"template:docs/data-layer/factories":{"position":[[27,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2557,7]]},"template:templates/docs/data-layer/factories":{"position":[[27,8]]}},"keywords":{}}],["best",{"_index":54,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[750,4]]},"template:docs/data-layer/factories":{"position":[[15741,4],[15773,4]]},"template:docs/data-layer/serializers/index":{"position":[[2855,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[750,4]]},"template:templates/docs/data-layer/factories":{"position":[[15741,4],[15773,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2855,4]]}},"keywords":{}}],["beta",{"_index":1437,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13351,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13351,4]]}},"keywords":{}}],["better",{"_index":1405,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9924,6],[11472,6],[12882,6]]},"template:docs/getting-started/what-is-mirage":{"position":[[1745,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9924,6],[11472,6],[12882,6]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1745,6]]}},"keywords":{}}],["between",{"_index":395,"title":{"template:docs/advanced/switching-between-scenarios":{"position":[[10,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[10,7]]}},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[11,7]]},"template:docs/data-layer/models":{"position":[[2834,7]]},"template:docs/data-layer/orm":{"position":[[2494,7]]},"template:docs/data-layer/relationships":{"position":[[77,7]]},"template:docs/getting-started/overview":{"position":[[6356,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11908,7]]},"template:docs/testing/acceptance-tests":{"position":[[4968,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[11,7]]},"template:templates/docs/data-layer/models":{"position":[[2834,7]]},"template:templates/docs/data-layer/orm":{"position":[[2494,7]]},"template:templates/docs/data-layer/relationships":{"position":[[77,7]]},"template:templates/docs/getting-started/overview":{"position":[[6356,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11908,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4968,7]]}},"keywords":{}}],["beyond",{"_index":1348,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4799,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4799,6]]}},"keywords":{}}],["bi-direct",{"_index":853,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[4280,14]]},"template:templates/docs/data-layer/fixtures":{"position":[[4280,14]]}},"keywords":{}}],["big",{"_index":916,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[226,3]]},"template:templates/docs/data-layer/orm":{"position":[[226,3]]}},"keywords":{}}],["bind",{"_index":1562,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5519,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5519,4]]}},"keywords":{}}],["bit",{"_index":1346,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4765,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1800,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4765,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1800,3]]}},"keywords":{}}],["blank",{"_index":1484,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16901,5]]},"template:docs/route-handlers/functions":{"position":[[6782,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16901,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6782,7]]}},"keywords":{}}],["blog",{"_index":0,"title":{"template:blog/index":{"position":[[0,4]]},"template:templates/blog/index":{"position":[[0,4]]}},"text":{"template:application":{"position":[[1,4]]},"template:blog/index":{"position":[[1,4]]},"template:docs/data-layer/relationships":{"position":[[4315,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13371,4]]},"template:templates/application":{"position":[[1,4]]},"template:templates/blog/index":{"position":[[1,4]]},"template:templates/docs/data-layer/relationships":{"position":[[4315,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13371,4]]}},"keywords":{}}],["blog-post",{"_index":877,"title":{},"text":{"template:docs/data-layer/models":{"position":[[830,9]]},"template:docs/data-layer/relationships":{"position":[[841,9],[5382,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6628,9],[16529,9]]},"template:docs/route-handlers/shorthands":{"position":[[5223,14],[5261,14],[5296,14],[5334,14],[5374,14],[5412,14]]},"template:templates/docs/data-layer/models":{"position":[[830,9]]},"template:templates/docs/data-layer/relationships":{"position":[[841,9],[5382,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6628,9],[16529,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5223,14],[5261,14],[5296,14],[5334,14],[5374,14],[5412,14]]}},"keywords":{}}],["blog-post.j",{"_index":1040,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3070,12],[3768,12],[4158,12]]},"template:templates/docs/data-layer/relationships":{"position":[[3070,12],[3768,12],[4158,12]]}},"keywords":{}}],["blog_post",{"_index":1449,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14201,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14201,11]]}},"keywords":{}}],["blogpost",{"_index":1025,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1625,8],[2035,8],[3181,9],[3740,10],[4130,10],[4238,11],[4579,8]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1798,10]]},"template:templates/docs/data-layer/relationships":{"position":[[1625,8],[2035,8],[3181,9],[3740,10],[4130,10],[4238,11],[4579,8]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1798,10]]}},"keywords":{}}],["blogpost.author",{"_index":1013,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1039,16],[1075,15],[3923,16]]},"template:templates/docs/data-layer/relationships":{"position":[[1039,16],[1075,15],[3923,16]]}},"keywords":{}}],["blogpost.authorid",{"_index":1012,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[964,18],[988,17],[1216,17],[1567,17]]},"template:templates/docs/data-layer/relationships":{"position":[[964,18],[988,17],[1216,17],[1567,17]]}},"keywords":{}}],["blogpost.com",{"_index":1030,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2220,18],[2268,17],[3221,17]]},"template:templates/docs/data-layer/relationships":{"position":[[2220,18],[2268,17],[3221,17]]}},"keywords":{}}],["blogpost.commentid",{"_index":1029,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2128,20],[2162,19]]},"template:templates/docs/data-layer/relationships":{"position":[[2128,20],[2162,19]]}},"keywords":{}}],["blogpost.createauthor",{"_index":1024,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1474,21]]},"template:templates/docs/data-layer/relationships":{"position":[[1474,21]]}},"keywords":{}}],["blogpost.createauthor(attr",{"_index":1017,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1157,29]]},"template:templates/docs/data-layer/relationships":{"position":[[1157,29]]}},"keywords":{}}],["blogpost.createcomment(attr",{"_index":1034,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2389,30]]},"template:templates/docs/data-layer/relationships":{"position":[[2389,30]]}},"keywords":{}}],["blogpost.newauthor(attr",{"_index":1015,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1108,26]]},"template:templates/docs/data-layer/relationships":{"position":[[1108,26]]}},"keywords":{}}],["blogpost.newcomment(attr",{"_index":1033,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2338,27]]},"template:templates/docs/data-layer/relationships":{"position":[[2338,27]]}},"keywords":{}}],["blogpost.review",{"_index":1046,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3943,18]]},"template:templates/docs/data-layer/relationships":{"position":[[3943,18]]}},"keywords":{}}],["blogpost.sav",{"_index":1026,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1741,15]]},"template:templates/docs/data-layer/relationships":{"position":[[1741,15]]}},"keywords":{}}],["blogpostid",{"_index":1092,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1815,14]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1815,14]]}},"keywords":{}}],["blueprint",{"_index":216,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[397,10]]},"template:docs/getting-started/overview":{"position":[[3188,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13646,9]]},"template:templates/docs/advanced/mocking-guids":{"position":[[397,10]]},"template:templates/docs/getting-started/overview":{"position":[[3188,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13646,9]]}},"keywords":{}}],["bodi",{"_index":1540,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[2390,5],[4041,4],[6262,5]]},"template:templates/docs/route-handlers/functions":{"position":[[2390,5],[4041,4],[6262,5]]}},"keywords":{}}],["bog",{"_index":751,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16178,6]]},"template:templates/docs/data-layer/factories":{"position":[[16178,6]]}},"keywords":{}}],["boilerpl",{"_index":707,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[12743,11],[16689,11]]},"template:docs/getting-started/overview":{"position":[[49,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[872,11]]},"template:templates/docs/data-layer/factories":{"position":[[12743,11],[16689,11]]},"template:templates/docs/getting-started/overview":{"position":[[49,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[872,11]]}},"keywords":{}}],["bookkeep",{"_index":962,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2878,11],[8540,11]]},"template:docs/getting-started/overview":{"position":[[7116,11]]},"template:templates/docs/data-layer/orm":{"position":[[2878,11],[8540,11]]},"template:templates/docs/getting-started/overview":{"position":[[7116,11]]}},"keywords":{}}],["boolean",{"_index":124,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[818,7]]},"template:docs/getting-started/overview":{"position":[[3371,9]]},"template:templates/docs/advanced/environment-options":{"position":[[818,7]]},"template:templates/docs/getting-started/overview":{"position":[[3371,9]]}},"keywords":{}}],["boot",{"_index":260,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[535,5]]},"template:docs/data-layer/factories":{"position":[[15443,4]]},"template:docs/testing/acceptance-tests":{"position":[[345,5],[993,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[535,5]]},"template:templates/docs/data-layer/factories":{"position":[[15443,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[345,5],[993,4]]}},"keywords":{}}],["borrow",{"_index":1513,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1371,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1371,7]]}},"keywords":{}}],["both",{"_index":501,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[203,4],[9656,4]]},"template:docs/data-layer/orm":{"position":[[5293,4]]},"template:docs/getting-started/overview":{"position":[[5717,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11504,4],[12144,4],[12632,4],[16256,5]]},"template:docs/route-handlers/functions":{"position":[[6354,4]]},"template:docs/testing/acceptance-tests":{"position":[[5084,4]]},"template:templates/docs/data-layer/factories":{"position":[[203,4],[9656,4]]},"template:templates/docs/data-layer/orm":{"position":[[5293,4]]},"template:templates/docs/getting-started/overview":{"position":[[5717,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11504,4],[12144,4],[12632,4],[16256,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6354,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5084,4]]}},"keywords":{}}],["box",{"_index":972,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[4298,4]]},"template:docs/data-layer/serializers/index":{"position":[[3877,4]]},"template:templates/docs/data-layer/orm":{"position":[[4298,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3877,4]]}},"keywords":{}}],["brazil",{"_index":803,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1171,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1171,9]]}},"keywords":{}}],["break",{"_index":731,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15035,5]]},"template:docs/getting-started/overview":{"position":[[1329,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1493,8],[1614,8],[2839,8],[5603,8],[8186,8],[8344,8],[8477,5]]},"template:docs/testing/acceptance-tests":{"position":[[2816,5],[3900,5]]},"template:templates/docs/data-layer/factories":{"position":[[15035,5]]},"template:templates/docs/getting-started/overview":{"position":[[1329,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1493,8],[1614,8],[2839,8],[5603,8],[8186,8],[8344,8],[8477,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2816,5],[3900,5]]}},"keywords":{}}],["bring",{"_index":1505,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[469,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[469,5]]}},"keywords":{}}],["brittl",{"_index":769,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17421,7]]},"template:docs/testing/acceptance-tests":{"position":[[3035,8]]},"template:templates/docs/data-layer/factories":{"position":[[17421,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3035,8]]}},"keywords":{}}],["browser",{"_index":376,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[302,7]]},"template:docs/getting-started/installation":{"position":[[1092,8],[1450,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[920,8]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[302,7]]},"template:templates/docs/getting-started/installation":{"position":[[1092,8],[1450,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[920,8]]}},"keywords":{}}],["bug",{"_index":1168,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[702,3]]},"template:docs/testing/assertions":{"position":[[296,3]]},"template:templates/docs/getting-started/installation":{"position":[[702,3]]},"template:templates/docs/testing/assertions":{"position":[[296,3]]}},"keywords":{}}],["build",{"_index":33,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[377,8]]},"template:docs/advanced/environment-options":{"position":[[1518,5],[1796,5]]},"template:docs/getting-started/overview":{"position":[[10444,5],[10686,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13996,5]]},"template:docs/getting-started/what-is-mirage":{"position":[[311,6],[1033,5]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[377,8]]},"template:templates/docs/advanced/environment-options":{"position":[[1518,5],[1796,5]]},"template:templates/docs/getting-started/overview":{"position":[[10444,5],[10686,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13996,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[311,6],[1033,5]]}},"keywords":{}}],["build-tim",{"_index":159,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1658,10]]},"template:templates/docs/advanced/environment-options":{"position":[[1658,10]]}},"keywords":{}}],["build/creat",{"_index":1060,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5133,12]]},"template:templates/docs/data-layer/relationships":{"position":[[5133,12]]}},"keywords":{}}],["built",{"_index":1107,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1374,5]]},"template:docs/getting-started/what-is-mirage":{"position":[[460,5]]},"template:docs/testing/acceptance-tests":{"position":[[449,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1374,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[460,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[449,5]]}},"keywords":{}}],["bundl",{"_index":1305,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1961,6],[2199,7],[2320,7],[2798,8],[3405,7]]},"template:docs/route-handlers/functions":{"position":[[5157,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1961,6],[2199,7],[2320,7],[2798,8],[3405,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5157,7]]}},"keywords":{}}],["bypass",{"_index":1182,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1336,6]]},"template:templates/docs/getting-started/installation":{"position":[[1336,6]]}},"keywords":{}}],["call",{"_index":222,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[594,6]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[290,4]]},"template:docs/data-layer/factories":{"position":[[5594,7],[7320,6],[13485,4]]},"template:docs/data-layer/fixtures":{"position":[[1858,4],[2460,4]]},"template:docs/data-layer/relationships":{"position":[[1273,5],[1736,4]]},"template:docs/getting-started/overview":{"position":[[4104,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1807,4],[6533,4]]},"template:docs/testing/acceptance-tests":{"position":[[2228,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[6214,4]]},"template:templates/docs/advanced/mocking-guids":{"position":[[594,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[290,4]]},"template:templates/docs/data-layer/factories":{"position":[[5594,7],[7320,6],[13485,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[1858,4],[2460,4]]},"template:templates/docs/data-layer/relationships":{"position":[[1273,5],[1736,4]]},"template:templates/docs/getting-started/overview":{"position":[[4104,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1807,4],[6533,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2228,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[6214,4]]}},"keywords":{}}],["caller",{"_index":668,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9470,7]]},"template:templates/docs/data-layer/factories":{"position":[[9470,7]]}},"keywords":{}}],["came",{"_index":1395,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9497,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9497,4]]}},"keywords":{}}],["camel",{"_index":1371,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7044,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7044,9]]}},"keywords":{}}],["camelcas",{"_index":816,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1500,9],[1558,11],[1701,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14742,11],[15194,10],[15609,11],[18249,11]]},"template:docs/route-handlers/functions":{"position":[[4693,11]]},"template:templates/docs/data-layer/fixtures":{"position":[[1500,9],[1558,11],[1701,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14742,11],[15194,10],[15609,11],[18249,11]]},"template:templates/docs/route-handlers/functions":{"position":[[4693,11]]}},"keywords":{}}],["canada",{"_index":1335,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4005,9],[4093,9],[4248,9],[4319,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4005,9],[4093,9],[4248,9],[4319,9]]}},"keywords":{}}],["canon",{"_index":1480,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16438,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16438,9]]}},"keywords":{}}],["car",{"_index":1078,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5880,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5880,5]]}},"keywords":{}}],["care",{"_index":764,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17180,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2575,4]]},"template:templates/docs/data-layer/factories":{"position":[[17180,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2575,4]]}},"keywords":{}}],["case",{"_index":154,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1567,4]]},"template:docs/data-layer/factories":{"position":[[4413,5],[5054,5],[7075,6],[7233,4],[8095,4],[9661,5],[16034,5]]},"template:docs/data-layer/fixtures":{"position":[[3550,5],[5016,5]]},"template:docs/data-layer/relationships":{"position":[[831,5],[3215,5],[3878,5]]},"template:docs/data-layer/serializers/index":{"position":[[6117,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2393,5],[6519,5],[7261,5]]},"template:docs/route-handlers/shorthands":{"position":[[1531,4],[1862,4],[2198,4]]},"template:docs/testing/acceptance-tests":{"position":[[2805,4]]},"template:docs/testing/assertions":{"position":[[3950,5]]},"template:templates/docs/advanced/environment-options":{"position":[[1567,4]]},"template:templates/docs/data-layer/factories":{"position":[[4413,5],[5054,5],[7075,6],[7233,4],[8095,4],[9661,5],[16034,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[3550,5],[5016,5]]},"template:templates/docs/data-layer/relationships":{"position":[[831,5],[3215,5],[3878,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6117,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2393,5],[6519,5],[7261,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1531,4],[1862,4],[2198,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2805,4]]},"template:templates/docs/testing/assertions":{"position":[[3950,5]]}},"keywords":{}}],["case/issu",{"_index":188,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2738,10]]},"template:templates/docs/advanced/environment-options":{"position":[[2738,10]]}},"keywords":{}}],["casey",{"_index":1320,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3360,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3360,5]]}},"keywords":{}}],["cast",{"_index":1134,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4563,4]]},"template:docs/getting-started/overview":{"position":[[6640,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4563,4]]},"template:templates/docs/getting-started/overview":{"position":[[6640,4]]}},"keywords":{}}],["cast-memb",{"_index":1132,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4368,15],[4848,15],[5081,15]]},"template:docs/getting-started/overview":{"position":[[5997,13]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4368,15],[4848,15],[5081,15]]},"template:templates/docs/getting-started/overview":{"position":[[5997,13]]}},"keywords":{}}],["castmemb",{"_index":1235,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6159,12],[6728,12]]},"template:templates/docs/getting-started/overview":{"position":[[6159,12],[6728,12]]}},"keywords":{}}],["caus",{"_index":191,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2778,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7131,5]]},"template:templates/docs/advanced/environment-options":{"position":[[2778,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7131,5]]}},"keywords":{}}],["ceremoni",{"_index":1304,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1897,9],[2557,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1897,9],[2557,8]]}},"keywords":{}}],["certain",{"_index":588,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4842,7]]},"template:docs/data-layer/fixtures":{"position":[[5333,7]]},"template:templates/docs/data-layer/factories":{"position":[[4842,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[5333,7]]}},"keywords":{}}],["certainli",{"_index":779,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[221,9]]},"template:docs/testing/assertions":{"position":[[3786,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[221,9]]},"template:templates/docs/testing/assertions":{"position":[[3786,9]]}},"keywords":{}}],["chanc",{"_index":1369,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[6892,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6892,7]]}},"keywords":{}}],["chance.j",{"_index":1345,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4720,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4720,10]]}},"keywords":{}}],["chang",{"_index":112,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[361,6]]},"template:docs/advanced/server-configuration":{"position":[[735,8]]},"template:docs/data-layer/factories":{"position":[[14337,8],[16007,7],[17448,7]]},"template:docs/data-layer/orm":{"position":[[5405,8],[6057,6],[7160,6],[8283,7]]},"template:docs/getting-started/installation":{"position":[[277,7]]},"template:docs/getting-started/overview":{"position":[[954,6],[2248,6],[2611,6],[2660,8],[7905,6],[11033,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[743,6],[1502,7],[1623,7],[2848,7],[3086,6],[4666,6],[6028,6],[6081,6],[7123,7],[8195,8],[8353,7],[8452,6],[10498,7],[11401,6],[12986,6],[13323,7],[13533,8],[14477,6],[14778,7],[15823,7],[18239,6],[18291,6],[18700,8]]},"template:docs/route-handlers/functions":{"position":[[6225,6]]},"template:docs/testing/acceptance-tests":{"position":[[2639,6],[2771,8],[4809,7]]},"template:docs/testing/assertions":{"position":[[992,6]]},"template:templates/docs/advanced/environment-options":{"position":[[361,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[735,8]]},"template:templates/docs/data-layer/factories":{"position":[[14337,8],[16007,7],[17448,7]]},"template:templates/docs/data-layer/orm":{"position":[[5405,8],[6057,6],[7160,6],[8283,7]]},"template:templates/docs/getting-started/installation":{"position":[[277,7]]},"template:templates/docs/getting-started/overview":{"position":[[954,6],[2248,6],[2611,6],[2660,8],[7905,6],[11033,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[743,6],[1502,7],[1623,7],[2848,7],[3086,6],[4666,6],[6028,6],[6081,6],[7123,7],[8195,8],[8353,7],[8452,6],[10498,7],[11401,6],[12986,6],[13323,7],[13533,8],[14477,6],[14778,7],[15823,7],[18239,6],[18291,6],[18700,8]]},"template:templates/docs/route-handlers/functions":{"position":[[6225,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2639,6],[2771,8],[4809,7]]},"template:templates/docs/testing/assertions":{"position":[[992,6]]}},"keywords":{}}],["changelog",{"_index":1288,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[201,9],[18665,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[201,9],[18665,9]]}},"keywords":{}}],["channel",{"_index":1432,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13242,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13242,7]]}},"keywords":{}}],["chastain",{"_index":1245,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6909,9]]},"template:templates/docs/getting-started/overview":{"position":[[6909,9]]}},"keywords":{}}],["check",{"_index":665,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9162,5]]},"template:docs/data-layer/models":{"position":[[2311,5]]},"template:docs/data-layer/relationships":{"position":[[5993,5]]},"template:docs/data-layer/serializers/index":{"position":[[5254,5],[5959,5],[7062,5]]},"template:docs/getting-started/installation":{"position":[[156,5]]},"template:docs/testing/assertions":{"position":[[1289,5]]},"template:templates/docs/data-layer/factories":{"position":[[9162,5]]},"template:templates/docs/data-layer/models":{"position":[[2311,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5993,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5254,5],[5959,5],[7062,5]]},"template:templates/docs/getting-started/installation":{"position":[[156,5]]},"template:templates/docs/testing/assertions":{"position":[[1289,5]]}},"keywords":{}}],["child",{"_index":1018,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1267,5]]},"template:templates/docs/data-layer/relationships":{"position":[[1267,5]]}},"keywords":{}}],["child'",{"_index":1022,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1354,7]]},"template:templates/docs/data-layer/relationships":{"position":[[1354,7]]}},"keywords":{}}],["child.createpar",{"_index":1019,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1279,19]]},"template:templates/docs/data-layer/relationships":{"position":[[1279,19]]}},"keywords":{}}],["chime",{"_index":5,"title":{},"text":{"template:blog/detail":{"position":[[40,5]]},"template:templates/blog/detail":{"position":[[40,5]]}},"keywords":{}}],["china",{"_index":784,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[473,7],[900,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[473,7],[900,8]]}},"keywords":{}}],["choos",{"_index":309,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2381,7]]},"template:docs/data-layer/factories":{"position":[[14432,6]]},"template:docs/data-layer/serializers/index":{"position":[[631,8],[722,6],[1197,6],[1956,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[2381,7]]},"template:templates/docs/data-layer/factories":{"position":[[14432,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[631,8],[722,6],[1197,6],[1956,6]]}},"keywords":{}}],["chri",{"_index":833,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3054,5],[3090,6],[3140,6],[3308,6],[4006,6],[4629,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[3054,5],[3090,6],[3140,6],[3308,6],[4006,6],[4629,6]]}},"keywords":{}}],["christoph",{"_index":610,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6075,12],[6269,12]]},"template:docs/data-layer/orm":{"position":[[5866,12],[6825,12],[7303,12]]},"template:templates/docs/data-layer/factories":{"position":[[6075,12],[6269,12]]},"template:templates/docs/data-layer/orm":{"position":[[5866,12],[6825,12],[7303,12]]}},"keywords":{}}],["circumst",{"_index":418,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[881,13]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[881,13]]}},"keywords":{}}],["citi",{"_index":797,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1040,5],[1409,5],[2283,10],[2325,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[1040,5],[1409,5],[2283,10],[2325,6]]}},"keywords":{}}],["clarifi",{"_index":870,"title":{},"text":{"template:docs/data-layer/models":{"position":[[418,10]]},"template:templates/docs/data-layer/models":{"position":[[418,10]]}},"keywords":{}}],["class",{"_index":209,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[234,6],[846,5]]},"template:docs/data-layer/factories":{"position":[[436,7],[1217,5]]},"template:docs/data-layer/fixtures":{"position":[[783,6]]},"template:docs/getting-started/overview":{"position":[[8108,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2516,8]]},"template:docs/route-handlers/functions":{"position":[[6430,5]]},"template:docs/testing/assertions":{"position":[[369,5],[4047,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[234,6],[846,5]]},"template:templates/docs/data-layer/factories":{"position":[[436,7],[1217,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[783,6]]},"template:templates/docs/getting-started/overview":{"position":[[8108,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2516,8]]},"template:templates/docs/route-handlers/functions":{"position":[[6430,5]]},"template:templates/docs/testing/assertions":{"position":[[369,5],[4047,8]]}},"keywords":{}}],["classifi",{"_index":1123,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3408,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3408,8]]}},"keywords":{}}],["classify(attr",{"_index":1127,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3507,15]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3507,15]]}},"keywords":{}}],["clean",{"_index":404,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[280,5]]},"template:docs/data-layer/factories":{"position":[[14846,5]]},"template:docs/getting-started/overview":{"position":[[5960,6]]},"template:docs/testing/acceptance-tests":{"position":[[1583,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[280,5]]},"template:templates/docs/data-layer/factories":{"position":[[14846,5]]},"template:templates/docs/getting-started/overview":{"position":[[5960,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1583,5]]}},"keywords":{}}],["clear",{"_index":1085,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[893,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[893,6]]}},"keywords":{}}],["clever",{"_index":938,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1478,7]]},"template:templates/docs/data-layer/orm":{"position":[[1478,7]]}},"keywords":{}}],["cli",{"_index":251,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[328,3],[1466,3]]},"template:docs/getting-started/installation":{"position":[[294,3],[385,3],[698,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1742,3]]},"template:templates/docs/advanced/server-configuration":{"position":[[328,3],[1466,3]]},"template:templates/docs/getting-started/installation":{"position":[[294,3],[385,3],[698,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1742,3]]}},"keywords":{}}],["cli'",{"_index":1456,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14395,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14395,5]]}},"keywords":{}}],["click",{"_index":1733,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4393,6],[6484,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4393,6],[6484,6]]}},"keywords":{}}],["click('.edit",{"_index":1680,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1128,14]]},"template:templates/docs/testing/assertions":{"position":[[1128,14]]}},"keywords":{}}],["click('.new",{"_index":1658,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4366,14]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4366,14]]}},"keywords":{}}],["click('.sav",{"_index":1661,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4426,15]]},"template:docs/testing/assertions":{"position":[[1190,15],[1921,15]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2322,15],[2890,15],[4973,15],[7162,15]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4426,15]]},"template:templates/docs/testing/assertions":{"position":[[1190,15],[1921,15]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2322,15],[2890,15],[4973,15],[7162,15]]}},"keywords":{}}],["click('.submit",{"_index":491,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1734,17]]},"template:templates/docs/data-layer/database":{"position":[[1734,17]]}},"keywords":{}}],["client",{"_index":392,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[680,6]]},"template:docs/getting-started/installation":{"position":[[1496,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8819,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1757,6]]},"template:index":{"position":[[278,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[680,6]]},"template:templates/docs/getting-started/installation":{"position":[[1496,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8819,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1757,6]]},"template:templates/index":{"position":[[278,6]]}},"keywords":{}}],["close",{"_index":1411,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11119,7]]},"template:docs/testing/acceptance-tests":{"position":[[2037,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11119,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2037,5]]}},"keywords":{}}],["closest",{"_index":1112,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1967,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1967,7]]}},"keywords":{}}],["coalesc",{"_index":1600,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[1977,9],[2029,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1977,9],[2029,9]]}},"keywords":{}}],["code",{"_index":190,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2773,4]]},"template:docs/advanced/server-configuration":{"position":[[681,4]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[687,4]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1953,4]]},"template:docs/data-layer/database":{"position":[[382,4]]},"template:docs/data-layer/factories":{"position":[[6838,4],[8741,4],[12568,5],[16701,4]]},"template:docs/data-layer/orm":{"position":[[128,4],[8567,5]]},"template:docs/data-layer/serializers/index":{"position":[[6665,4],[6952,4]]},"template:docs/getting-started/overview":{"position":[[61,4],[9199,4],[9301,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[884,4],[1871,5],[5744,5],[10004,4],[11288,4],[12501,4],[14991,5],[18193,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[519,4],[1206,5]]},"template:docs/route-handlers/functions":{"position":[[6034,5],[6092,4],[6372,4]]},"template:docs/route-handlers/shorthands":{"position":[[1161,5]]},"template:docs/testing/acceptance-tests":{"position":[[927,4],[2003,4],[2949,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3652,5]]},"template:docs/testing/setup-mirage":{"position":[[536,4],[1025,4],[1917,4]]},"template:templates/docs/advanced/environment-options":{"position":[[2773,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[681,4]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[687,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1953,4]]},"template:templates/docs/data-layer/database":{"position":[[382,4]]},"template:templates/docs/data-layer/factories":{"position":[[6838,4],[8741,4],[12568,5],[16701,4]]},"template:templates/docs/data-layer/orm":{"position":[[128,4],[8567,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6665,4],[6952,4]]},"template:templates/docs/getting-started/overview":{"position":[[61,4],[9199,4],[9301,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[884,4],[1871,5],[5744,5],[10004,4],[11288,4],[12501,4],[14991,5],[18193,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[519,4],[1206,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6034,5],[6092,4],[6372,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1161,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[927,4],[2003,4],[2949,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3652,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[536,4],[1025,4],[1917,4]]}},"keywords":{}}],["codebas",{"_index":1510,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[878,9]]},"template:docs/route-handlers/shorthands":{"position":[[5848,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[878,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5848,9]]}},"keywords":{}}],["codemod",{"_index":1318,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3294,7],[7217,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3294,7],[7217,8]]}},"keywords":{}}],["collect",{"_index":49,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[696,10]]},"template:docs/data-layer/models":{"position":[[1021,10],[1418,10],[1552,12],[1973,11]]},"template:docs/data-layer/orm":{"position":[[4206,11]]},"template:docs/data-layer/relationships":{"position":[[2116,11],[3256,10],[4018,11],[6190,11]]},"template:docs/data-layer/serializers/index":{"position":[[79,10],[2432,10],[3002,11],[5378,10],[6504,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8600,11],[14089,10],[14179,10],[14818,10],[16286,10],[16685,11],[17572,10],[17687,11]]},"template:docs/route-handlers/functions":{"position":[[3374,10],[3748,11]]},"template:docs/route-handlers/shorthands":{"position":[[396,10],[596,11],[1260,11],[1401,10],[5036,10]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[696,10]]},"template:templates/docs/data-layer/models":{"position":[[1021,10],[1418,10],[1552,12],[1973,11]]},"template:templates/docs/data-layer/orm":{"position":[[4206,11]]},"template:templates/docs/data-layer/relationships":{"position":[[2116,11],[3256,10],[4018,11],[6190,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[79,10],[2432,10],[3002,11],[5378,10],[6504,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8600,11],[14089,10],[14179,10],[14818,10],[16286,10],[16685,11],[17572,10],[17687,11]]},"template:templates/docs/route-handlers/functions":{"position":[[3374,10],[3748,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[396,10],[596,11],[1260,11],[1401,10],[5036,10]]}},"keywords":{}}],["collection'",{"_index":891,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1768,12]]},"template:templates/docs/data-layer/models":{"position":[[1768,12]]}},"keywords":{}}],["colon",{"_index":1542,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[2931,5]]},"template:templates/docs/route-handlers/functions":{"position":[[2931,5]]}},"keywords":{}}],["combin",{"_index":693,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[11322,8],[11854,9]]},"template:templates/docs/data-layer/factories":{"position":[[11322,8],[11854,9]]}},"keywords":{}}],["come",{"_index":837,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3154,7],[3371,7],[4105,7],[4728,7]]},"template:docs/data-layer/serializers/index":{"position":[[3072,5]]},"template:docs/getting-started/installation":{"position":[[180,6]]},"template:docs/getting-started/overview":{"position":[[10430,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17135,4]]},"template:docs/route-handlers/functions":{"position":[[5076,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[3154,7],[3371,7],[4105,7],[4728,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3072,5]]},"template:templates/docs/getting-started/installation":{"position":[[180,6]]},"template:templates/docs/getting-started/overview":{"position":[[10430,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17135,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5076,5]]}},"keywords":{}}],["comedi",{"_index":565,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3686,8],[4088,8]]},"template:templates/docs/data-layer/factories":{"position":[[3686,8],[4088,8]]}},"keywords":{}}],["command",{"_index":1195,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[1910,7]]},"template:templates/docs/getting-started/overview":{"position":[[1910,7]]}},"keywords":{}}],["comment",{"_index":3,"title":{},"text":{"template:blog/detail":{"position":[[13,8],[22,9]]},"template:docs/data-layer/factories":{"position":[[6913,9],[11476,8],[11792,8]]},"template:docs/data-layer/relationships":{"position":[[1965,9],[2107,8],[2259,8],[2381,7],[2433,7],[2788,9],[2859,7],[3113,9],[3270,7],[3308,7],[4550,7],[4702,12],[4809,9],[4888,9],[4922,11],[5159,7]]},"template:templates/blog/detail":{"position":[[13,8],[22,9]]},"template:templates/docs/data-layer/factories":{"position":[[6913,9],[11476,8],[11792,8]]},"template:templates/docs/data-layer/relationships":{"position":[[1965,9],[2107,8],[2259,8],[2381,7],[2433,7],[2788,9],[2859,7],[3113,9],[3270,7],[3308,7],[4550,7],[4702,12],[4809,9],[4888,9],[4922,11],[5159,7]]}},"keywords":{}}],["comment.blogpost",{"_index":1042,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3336,16]]},"template:templates/docs/data-layer/relationships":{"position":[[3336,16]]}},"keywords":{}}],["comment.blogpostid",{"_index":1035,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2441,19]]},"template:templates/docs/data-layer/relationships":{"position":[[2441,19]]}},"keywords":{}}],["comment.buildcommentable(\"post",{"_index":1064,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5210,32]]},"template:templates/docs/data-layer/relationships":{"position":[[5210,32]]}},"keywords":{}}],["comment.commentableid",{"_index":1067,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5341,22],[5406,21]]},"template:templates/docs/data-layer/relationships":{"position":[[5341,22],[5406,21]]}},"keywords":{}}],["comment.createcommentable(\"post",{"_index":1065,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5270,33]]},"template:templates/docs/data-layer/relationships":{"position":[[5270,33]]}},"keywords":{}}],["comment.j",{"_index":1041,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3140,10]]},"template:templates/docs/data-layer/relationships":{"position":[[3140,10]]}},"keywords":{}}],["comment1",{"_index":1031,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2288,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2288,10]]}},"keywords":{}}],["comment2",{"_index":1032,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2299,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2299,10]]}},"keywords":{}}],["commentid",{"_index":1028,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2008,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2008,10]]}},"keywords":{}}],["common",{"_index":475,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1322,6]]},"template:docs/data-layer/factories":{"position":[[15965,6]]},"template:docs/data-layer/models":{"position":[[2138,6]]},"template:docs/data-layer/orm":{"position":[[2620,6]]},"template:docs/getting-started/overview":{"position":[[818,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1914,6],[10440,6],[11524,6]]},"template:docs/route-handlers/shorthands":{"position":[[101,6]]},"template:docs/testing/acceptance-tests":{"position":[[5678,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4050,6]]},"template:templates/docs/data-layer/database":{"position":[[1322,6]]},"template:templates/docs/data-layer/factories":{"position":[[15965,6]]},"template:templates/docs/data-layer/models":{"position":[[2138,6]]},"template:templates/docs/data-layer/orm":{"position":[[2620,6]]},"template:templates/docs/getting-started/overview":{"position":[[818,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1914,6],[10440,6],[11524,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[101,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5678,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4050,6]]}},"keywords":{}}],["commun",{"_index":332,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2969,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13214,9]]},"template:docs/route-handlers/functions":{"position":[[877,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[2969,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13214,9]]},"template:templates/docs/route-handlers/functions":{"position":[[877,13]]}},"keywords":{}}],["complet",{"_index":415,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[838,8]]},"template:docs/data-layer/database":{"position":[[317,8]]},"template:docs/getting-started/overview":{"position":[[7267,10]]},"template:docs/getting-started/what-is-mirage":{"position":[[341,8]]},"template:docs/route-handlers/shorthands":{"position":[[486,8]]},"template:docs/testing/assertions":{"position":[[3875,9]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[838,8]]},"template:templates/docs/data-layer/database":{"position":[[317,8]]},"template:templates/docs/getting-started/overview":{"position":[[7267,10]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[341,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[486,8]]},"template:templates/docs/testing/assertions":{"position":[[3875,9]]}},"keywords":{}}],["complex",{"_index":192,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2846,7]]},"template:docs/data-layer/orm":{"position":[[160,7],[2430,8],[8405,7],[8644,7]]},"template:docs/getting-started/overview":{"position":[[1255,7]]},"template:templates/docs/advanced/environment-options":{"position":[[2846,7]]},"template:templates/docs/data-layer/orm":{"position":[[160,7],[2430,8],[8405,7],[8644,7]]},"template:templates/docs/getting-started/overview":{"position":[[1255,7]]}},"keywords":{}}],["complic",{"_index":946,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1887,11]]},"template:templates/docs/data-layer/orm":{"position":[[1887,11]]}},"keywords":{}}],["compon",{"_index":871,"title":{},"text":{"template:docs/data-layer/models":{"position":[[568,11]]},"template:docs/testing/integration-and-unit-tests":{"position":[[185,10],[563,9],[1289,9],[2024,10],[2057,9],[2525,9],[3469,10],[3543,10],[3879,10],[4459,9],[6631,9]]},"template:templates/docs/data-layer/models":{"position":[[568,11]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[185,10],[563,9],[1289,9],[2024,10],[2057,9],[2525,9],[3469,10],[3543,10],[3879,10],[4459,9],[6631,9]]}},"keywords":{}}],["compos",{"_index":687,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[10632,7]]},"template:templates/docs/data-layer/factories":{"position":[[10632,7]]}},"keywords":{}}],["compound",{"_index":1366,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[6720,8],[8872,8],[10672,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6720,8],[8872,8],[10672,8]]}},"keywords":{}}],["compris",{"_index":744,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15860,8]]},"template:templates/docs/data-layer/factories":{"position":[[15860,8]]}},"keywords":{}}],["conan",{"_index":1551,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[4264,8],[4556,8]]},"template:templates/docs/route-handlers/functions":{"position":[[4264,8],[4556,8]]}},"keywords":{}}],["concept",{"_index":1282,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10881,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1379,8]]},"template:docs/route-handlers/shorthands":{"position":[[66,7]]},"template:templates/docs/getting-started/overview":{"position":[[10881,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1379,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[66,7]]}},"keywords":{}}],["conceptu",{"_index":1425,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[12968,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12968,12]]}},"keywords":{}}],["concern",{"_index":759,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16596,9]]},"template:docs/getting-started/overview":{"position":[[1044,9]]},"template:templates/docs/data-layer/factories":{"position":[[16596,9]]},"template:templates/docs/getting-started/overview":{"position":[[1044,9]]}},"keywords":{}}],["concis",{"_index":766,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17303,7]]},"template:docs/getting-started/overview":{"position":[[9795,8]]},"template:templates/docs/data-layer/factories":{"position":[[17303,7]]},"template:templates/docs/getting-started/overview":{"position":[[9795,8]]}},"keywords":{}}],["confid",{"_index":1676,"title":{},"text":{"template:docs/testing/assertions":{"position":[[520,10],[821,10],[1448,10]]},"template:templates/docs/testing/assertions":{"position":[[520,10],[821,10],[1448,10]]}},"keywords":{}}],["config",{"_index":116,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[439,7],[1102,10]]},"template:docs/advanced/server-configuration":{"position":[[965,7],[1240,6],[1657,6],[2268,7],[3165,10],[3543,10],[5132,10]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1455,6]]},"template:docs/getting-started/overview":{"position":[[8809,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1047,8],[1078,10]]},"template:docs/testing/setup-mirage":{"position":[[1080,6],[1498,10]]},"template:templates/docs/advanced/environment-options":{"position":[[439,7],[1102,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[965,7],[1240,6],[1657,6],[2268,7],[3165,10],[3543,10],[5132,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1455,6]]},"template:templates/docs/getting-started/overview":{"position":[[8809,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1047,8],[1078,10]]},"template:templates/docs/testing/setup-mirage":{"position":[[1080,6],[1498,10]]}},"keywords":{}}],["config.j",{"_index":247,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[179,10]]},"template:docs/testing/acceptance-tests":{"position":[[4668,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[179,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4668,9]]}},"keywords":{}}],["config.model",{"_index":137,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1174,16]]},"template:docs/advanced/server-configuration":{"position":[[3216,16],[3594,16],[5183,16]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1129,16]]},"template:docs/testing/setup-mirage":{"position":[[1549,16]]},"template:templates/docs/advanced/environment-options":{"position":[[1174,16]]},"template:templates/docs/advanced/server-configuration":{"position":[[3216,16],[3594,16],[5183,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1129,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[1549,16]]}},"keywords":{}}],["config/environ",{"_index":431,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1546,27]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1546,27]]}},"keywords":{}}],["config/environment.j",{"_index":100,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[88,21],[119,21],[552,21],[691,21],[2275,21],[2873,21]]},"template:docs/testing/assertions":{"position":[[2581,21]]},"template:templates/docs/advanced/environment-options":{"position":[[88,21],[119,21],[552,21],[691,21],[2275,21],[2873,21]]},"template:templates/docs/testing/assertions":{"position":[[2581,21]]}},"keywords":{}}],["configur",{"_index":56,"title":{"template:docs/advanced/server-configuration":{"position":[[7,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[7,13]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[762,9],[842,9]]},"template:docs/advanced/environment-options":{"position":[[2077,9]]},"template:docs/advanced/server-configuration":{"position":[[8,13],[45,10],[3874,13]]},"template:docs/advanced/switching-between-scenarios":{"position":[[626,9],[952,9]]},"template:docs/data-layer/fixtures":{"position":[[1590,13]]},"template:docs/data-layer/orm":{"position":[[8843,11]]},"template:docs/getting-started/installation":{"position":[[305,13],[396,14],[526,14]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10709,12]]},"template:docs/getting-started/what-is-mirage":{"position":[[401,9]]},"template:docs/route-handlers/functions":{"position":[[7168,9]]},"template:docs/testing/assertions":{"position":[[3960,13]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5241,13]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[762,9],[842,9]]},"template:templates/docs/advanced/environment-options":{"position":[[2077,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[8,13],[45,10],[3874,13]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[626,9],[952,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1590,13]]},"template:templates/docs/data-layer/orm":{"position":[[8843,11]]},"template:templates/docs/getting-started/installation":{"position":[[305,13],[396,14],[526,14]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10709,12]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[401,9]]},"template:templates/docs/route-handlers/functions":{"position":[[7168,9]]},"template:templates/docs/testing/assertions":{"position":[[3960,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5241,13]]}},"keywords":{}}],["conflict",{"_index":299,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1997,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[1997,8]]}},"keywords":{}}],["confus",{"_index":1721,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[1804,9]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1804,9]]}},"keywords":{}}],["consid",{"_index":922,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[401,8]]},"template:docs/testing/assertions":{"position":[[3683,10]]},"template:templates/docs/data-layer/orm":{"position":[[401,8]]},"template:templates/docs/testing/assertions":{"position":[[3683,10]]}},"keywords":{}}],["consist",{"_index":1674,"title":{},"text":{"template:docs/testing/assertions":{"position":[[264,11]]},"template:templates/docs/testing/assertions":{"position":[[264,11]]}},"keywords":{}}],["const",{"_index":71,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1077,5]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1268,5],[1350,5],[1691,5],[1748,5],[1839,5]]},"template:docs/data-layer/factories":{"position":[[14443,5]]},"template:docs/testing/setup-mirage":{"position":[[1440,5]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1077,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1268,5],[1350,5],[1691,5],[1748,5],[1839,5]]},"template:templates/docs/data-layer/factories":{"position":[[14443,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[1440,5]]}},"keywords":{}}],["constructor",{"_index":230,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[854,13]]},"template:templates/docs/advanced/mocking-guids":{"position":[[854,13]]}},"keywords":{}}],["consum",{"_index":1729,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[3625,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3625,8]]}},"keywords":{}}],["consumpt",{"_index":1097,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[365,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[365,11]]}},"keywords":{}}],["contact",{"_index":1379,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7768,8],[7893,11]]},"template:docs/route-handlers/shorthands":{"position":[[2087,8],[3909,11],[3979,8],[4037,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7768,8],[7893,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2087,8],[3909,11],[3979,8],[4037,7]]}},"keywords":{}}],["contact.addresses.destroy",{"_index":1611,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[4066,28]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4066,28]]}},"keywords":{}}],["contact.destroy",{"_index":1612,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[4095,18]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4095,18]]}},"keywords":{}}],["contacts.find(id",{"_index":1602,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[2155,19],[4047,18]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2155,19],[4047,18]]}},"keywords":{}}],["contacts?ids=1,3",{"_index":1599,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[1920,19]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1920,19]]}},"keywords":{}}],["contain",{"_index":172,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2103,8]]},"template:docs/advanced/server-configuration":{"position":[[228,8],[979,8],[1339,7]]},"template:docs/data-layer/factories":{"position":[[13848,8],[15984,7]]},"template:docs/getting-started/overview":{"position":[[36,8],[1005,7],[10906,7]]},"template:docs/route-handlers/functions":{"position":[[2130,8],[2447,8],[2827,8]]},"template:templates/docs/advanced/environment-options":{"position":[[2103,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[228,8],[979,8],[1339,7]]},"template:templates/docs/data-layer/factories":{"position":[[13848,8],[15984,7]]},"template:templates/docs/getting-started/overview":{"position":[[36,8],[1005,7],[10906,7]]},"template:templates/docs/route-handlers/functions":{"position":[[2130,8],[2447,8],[2827,8]]}},"keywords":{}}],["content-typ",{"_index":1577,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6295,12]]},"template:templates/docs/route-handlers/functions":{"position":[[6295,12]]}},"keywords":{}}],["context",{"_index":1561,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5456,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5536,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5456,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5536,7]]}},"keywords":{}}],["context.owner.lookup('service:stor",{"_index":1745,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5572,38]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5572,38]]}},"keywords":{}}],["context.server.schema[key].al",{"_index":1747,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5661,30]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5661,30]]}},"keywords":{}}],["context.server.schema[resource].al",{"_index":1750,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5764,38]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5764,38]]}},"keywords":{}}],["context.server.serializerorregistry.serializerfor(modelnam",{"_index":1752,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5854,61]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5854,61]]}},"keywords":{}}],["continu",{"_index":713,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13331,8]]},"template:templates/docs/data-layer/factories":{"position":[[13331,8]]}},"keywords":{}}],["control",{"_index":125,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[831,8]]},"template:docs/advanced/server-configuration":{"position":[[606,7]]},"template:docs/data-layer/serializers/index":{"position":[[5199,11]]},"template:docs/getting-started/overview":{"position":[[9969,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4811,8],[8053,10]]},"template:templates/docs/advanced/environment-options":{"position":[[831,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[606,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5199,11]]},"template:templates/docs/getting-started/overview":{"position":[[9969,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4811,8],[8053,10]]}},"keywords":{}}],["conveni",{"_index":1143,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5475,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5475,10]]}},"keywords":{}}],["convent",{"_index":34,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[390,12],[543,12]]},"template:docs/data-layer/fixtures":{"position":[[302,12],[1570,10],[3477,10],[4767,10]]},"template:docs/data-layer/serializers/index":{"position":[[6909,12]]},"template:docs/getting-started/overview":{"position":[[9317,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14401,11],[15305,12]]},"template:docs/getting-started/what-is-mirage":{"position":[[475,11]]},"template:docs/route-handlers/functions":{"position":[[5690,12],[7540,12]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5318,11]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[390,12],[543,12]]},"template:templates/docs/data-layer/fixtures":{"position":[[302,12],[1570,10],[3477,10],[4767,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6909,12]]},"template:templates/docs/getting-started/overview":{"position":[[9317,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14401,11],[15305,12]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[475,11]]},"template:templates/docs/route-handlers/functions":{"position":[[5690,12],[7540,12]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5318,11]]}},"keywords":{}}],["cooki",{"_index":365,"title":{"template:docs/advanced/simulating-cookie-responses":{"position":[[11,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[11,6]]}},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[12,6],[212,7],[269,7],[720,7]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[12,6],[212,7],[269,7],[720,7]]}},"keywords":{}}],["cookieexpir",{"_index":383,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[448,16]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[448,16]]}},"keywords":{}}],["cool",{"_index":1463,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15108,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15108,4]]}},"keywords":{}}],["core",{"_index":445,"title":{},"text":{"template:docs/data-layer/database":{"position":[[21,4]]},"template:templates/docs/data-layer/database":{"position":[[21,4]]}},"keywords":{}}],["correct",{"_index":481,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1566,7]]},"template:docs/data-layer/serializers/index":{"position":[[5695,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6204,7],[6975,7]]},"template:docs/testing/assertions":{"position":[[571,7],[704,7],[780,7],[888,8],[2310,8]]},"template:templates/docs/data-layer/database":{"position":[[1566,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5695,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6204,7],[6975,7]]},"template:templates/docs/testing/assertions":{"position":[[571,7],[704,7],[780,7],[888,8],[2310,8]]}},"keywords":{}}],["correctli",{"_index":90,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1647,9],[1685,9]]},"template:docs/data-layer/factories":{"position":[[7014,9]]},"template:docs/data-layer/relationships":{"position":[[4380,9]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1647,9],[1685,9]]},"template:templates/docs/data-layer/factories":{"position":[[7014,9]]},"template:templates/docs/data-layer/relationships":{"position":[[4380,9]]}},"keywords":{}}],["correspond",{"_index":1273,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10198,13]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17593,13]]},"template:docs/route-handlers/shorthands":{"position":[[582,13]]},"template:templates/docs/getting-started/overview":{"position":[[10198,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17593,13]]},"template:templates/docs/route-handlers/shorthands":{"position":[[582,13]]}},"keywords":{}}],["count",{"_index":1226,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5338,6],[6984,6]]},"template:docs/testing/acceptance-tests":{"position":[[1829,6],[3186,6],[3832,6],[5611,6]]},"template:docs/testing/assertions":{"position":[[3322,6],[3375,5]]},"template:templates/docs/getting-started/overview":{"position":[[5338,6],[6984,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1829,6],[3186,6],[3832,6],[5611,6]]},"template:templates/docs/testing/assertions":{"position":[[3322,6],[3375,5]]}},"keywords":{}}],["countri",{"_index":783,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[445,10],[667,7],[705,9],[2311,9],[2511,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3934,11],[4277,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[445,10],[667,7],[705,9],[2311,9],[2511,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3934,11],[4277,9]]}},"keywords":{}}],["countries(i",{"_index":1338,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4177,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4177,12]]}},"keywords":{}}],["countries.length",{"_index":1340,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4366,18]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4366,18]]}},"keywords":{}}],["countries[i",{"_index":1339,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4352,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4352,11]]}},"keywords":{}}],["cours",{"_index":1250,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[7617,7]]},"template:docs/testing/acceptance-tests":{"position":[[3863,6]]},"template:templates/docs/getting-started/overview":{"position":[[7617,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3863,6]]}},"keywords":{}}],["cover",{"_index":457,"title":{},"text":{"template:docs/data-layer/database":{"position":[[487,5]]},"template:docs/data-layer/relationships":{"position":[[6079,5]]},"template:docs/data-layer/serializers/index":{"position":[[7175,7]]},"template:docs/route-handlers/shorthands":{"position":[[5972,5]]},"template:templates/docs/data-layer/database":{"position":[[487,5]]},"template:templates/docs/data-layer/relationships":{"position":[[6079,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[7175,7]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5972,5]]}},"keywords":{}}],["creat",{"_index":245,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[141,8],[492,6],[714,8],[826,8],[870,7],[3790,6],[4107,7],[4469,7],[4505,6],[4746,7],[4797,7]]},"template:docs/data-layer/database":{"position":[[1615,6]]},"template:docs/data-layer/factories":{"position":[[1332,6],[2279,7],[4565,6],[5924,6],[5973,8],[6179,6],[6454,8],[6643,6],[7350,7],[7497,6],[7784,6],[8078,7],[8326,8],[8417,6],[8929,8],[8996,8],[9056,7],[9181,7],[9260,6],[9735,6],[10416,6],[10521,7],[10942,6],[11466,7],[11497,7],[12029,8],[12160,8],[13807,6],[15170,6],[16835,6]]},"template:docs/data-layer/fixtures":{"position":[[2704,8],[3023,6]]},"template:docs/data-layer/models":{"position":[[845,7],[968,8],[987,6],[1525,7],[1609,6],[1781,6],[1833,8]]},"template:docs/data-layer/orm":{"position":[[5379,6],[6502,8],[6555,8],[6668,6],[7218,6],[7510,8]]},"template:docs/data-layer/relationships":{"position":[[1501,6],[1763,8],[6348,6]]},"template:docs/data-layer/serializers/index":{"position":[[2655,6],[2719,7]]},"template:docs/getting-started/overview":{"position":[[69,6],[130,7],[1491,8],[1886,6],[3222,6],[3733,7],[5409,6],[6581,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5261,7],[16303,8],[16488,6],[16549,6]]},"template:docs/route-handlers/functions":{"position":[[4111,8]]},"template:docs/route-handlers/shorthands":{"position":[[711,8],[779,7],[965,7],[2223,8],[5666,6]]},"template:docs/testing/acceptance-tests":{"position":[[2865,6],[5240,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1723,8],[1911,6],[3190,6],[3389,6]]},"template:docs/testing/setup-mirage":{"position":[[215,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[141,8],[492,6],[714,8],[826,8],[870,7],[3790,6],[4107,7],[4469,7],[4505,6],[4746,7],[4797,7]]},"template:templates/docs/data-layer/database":{"position":[[1615,6]]},"template:templates/docs/data-layer/factories":{"position":[[1332,6],[2279,7],[4565,6],[5924,6],[5973,8],[6179,6],[6454,8],[6643,6],[7350,7],[7497,6],[7784,6],[8078,7],[8326,8],[8417,6],[8929,8],[8996,8],[9056,7],[9181,7],[9260,6],[9735,6],[10416,6],[10521,7],[10942,6],[11466,7],[11497,7],[12029,8],[12160,8],[13807,6],[15170,6],[16835,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[2704,8],[3023,6]]},"template:templates/docs/data-layer/models":{"position":[[845,7],[968,8],[987,6],[1525,7],[1609,6],[1781,6],[1833,8]]},"template:templates/docs/data-layer/orm":{"position":[[5379,6],[6502,8],[6555,8],[6668,6],[7218,6],[7510,8]]},"template:templates/docs/data-layer/relationships":{"position":[[1501,6],[1763,8],[6348,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2655,6],[2719,7]]},"template:templates/docs/getting-started/overview":{"position":[[69,6],[130,7],[1491,8],[1886,6],[3222,6],[3733,7],[5409,6],[6581,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5261,7],[16303,8],[16488,6],[16549,6]]},"template:templates/docs/route-handlers/functions":{"position":[[4111,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[711,8],[779,7],[965,7],[2223,8],[5666,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2865,6],[5240,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1723,8],[1911,6],[3190,6],[3389,6]]},"template:templates/docs/testing/setup-mirage":{"position":[[215,7]]}},"keywords":{}}],["createlist",{"_index":584,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4576,10],[6514,11],[7508,11],[10426,11],[10952,10],[15181,10]]},"template:docs/getting-started/overview":{"position":[[5419,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5269,10]]},"template:docs/testing/acceptance-tests":{"position":[[2876,10]]},"template:templates/docs/data-layer/factories":{"position":[[4576,10],[6514,11],[7508,11],[10426,11],[10952,10],[15181,10]]},"template:templates/docs/getting-started/overview":{"position":[[5419,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5269,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2876,10]]}},"keywords":{}}],["createserv",{"_index":333,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3079,12],[3457,12],[5043,12]]},"template:docs/testing/setup-mirage":{"position":[[1408,12]]},"template:templates/docs/advanced/server-configuration":{"position":[[3079,12],[3457,12],[5043,12]]},"template:templates/docs/testing/setup-mirage":{"position":[[1408,12]]}},"keywords":{}}],["createserver(finalconfig",{"_index":140,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1212,26]]},"template:docs/advanced/server-configuration":{"position":[[3312,26],[3632,26],[5281,26]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1167,26]]},"template:docs/testing/setup-mirage":{"position":[[1713,26]]},"template:templates/docs/advanced/environment-options":{"position":[[1212,26]]},"template:templates/docs/advanced/server-configuration":{"position":[[3312,26],[3632,26],[5281,26]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1167,26]]},"template:templates/docs/testing/setup-mirage":{"position":[[1713,26]]}},"keywords":{}}],["creation",{"_index":676,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9800,8]]},"template:docs/data-layer/fixtures":{"position":[[5284,9]]},"template:templates/docs/data-layer/factories":{"position":[[9800,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[5284,9]]}},"keywords":{}}],["crew",{"_index":1256,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8879,4]]},"template:templates/docs/getting-started/overview":{"position":[[8879,4]]}},"keywords":{}}],["crew-memb",{"_index":1257,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8936,15]]},"template:templates/docs/getting-started/overview":{"position":[[8936,15]]}},"keywords":{}}],["crewmemb",{"_index":1255,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8635,13]]},"template:templates/docs/getting-started/overview":{"position":[[8635,13]]}},"keywords":{}}],["critic",{"_index":1500,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[18742,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18742,8]]}},"keywords":{}}],["crystal",{"_index":599,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5757,8]]},"template:templates/docs/data-layer/factories":{"position":[[5757,8]]}},"keywords":{}}],["crystalschaef",{"_index":601,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5787,17]]},"template:templates/docs/data-layer/factories":{"position":[[5787,17]]}},"keywords":{}}],["cumbersom",{"_index":541,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1955,10]]},"template:docs/route-handlers/functions":{"position":[[7459,10]]},"template:templates/docs/data-layer/factories":{"position":[[1955,10]]},"template:templates/docs/route-handlers/functions":{"position":[[7459,10]]}},"keywords":{}}],["current",{"_index":166,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1958,9]]},"template:docs/advanced/server-configuration":{"position":[[749,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[519,9]]},"template:docs/getting-started/installation":{"position":[[1104,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9080,7],[10634,7],[13736,7],[17069,9],[17481,10]]},"template:templates/docs/advanced/environment-options":{"position":[[1958,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[749,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[519,9]]},"template:templates/docs/getting-started/installation":{"position":[[1104,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9080,7],[10634,7],[13736,7],[17069,9],[17481,10]]}},"keywords":{}}],["custom",{"_index":11,"title":{"template:docs/advanced/customizing-the-inflector":{"position":[[0,11]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[0,11]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1,11],[92,9],[1459,6]]},"template:docs/advanced/mocking-guids":{"position":[[316,9],[473,6]]},"template:docs/advanced/server-configuration":{"position":[[109,9]]},"template:docs/data-layer/factories":{"position":[[8255,9]]},"template:docs/data-layer/fixtures":{"position":[[1729,9]]},"template:docs/data-layer/relationships":{"position":[[6140,9]]},"template:docs/data-layer/serializers/index":{"position":[[1983,9],[2474,9],[2955,9],[3040,11],[3081,11],[3594,13],[7127,9]]},"template:docs/getting-started/overview":{"position":[[101,9],[7837,9],[9192,6]]},"template:docs/route-handlers/functions":{"position":[[5791,6],[6344,9]]},"template:docs/route-handlers/shorthands":{"position":[[155,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1,11],[92,9],[1459,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[316,9],[473,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[109,9]]},"template:templates/docs/data-layer/factories":{"position":[[8255,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1729,9]]},"template:templates/docs/data-layer/relationships":{"position":[[6140,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1983,9],[2474,9],[2955,9],[3040,11],[3081,11],[3594,13],[7127,9]]},"template:templates/docs/getting-started/overview":{"position":[[101,9],[7837,9],[9192,6]]},"template:templates/docs/route-handlers/functions":{"position":[[5791,6],[6344,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[155,6]]}},"keywords":{}}],["custom-inflector-rul",{"_index":76,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1236,25]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1236,25]]}},"keywords":{}}],["customiz",{"_index":1446,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13890,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13890,12]]}},"keywords":{}}],["d",{"_index":1285,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[122,2],[170,2],[3043,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[122,2],[170,2],[3043,2]]}},"keywords":{}}],["dark",{"_index":489,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1713,4],[1853,4]]},"template:templates/docs/data-layer/database":{"position":[[1713,4],[1853,4]]}},"keywords":{}}],["dasher",{"_index":791,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[747,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6683,10],[14051,11],[14416,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[747,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6683,10],[14051,11],[14416,10]]}},"keywords":{}}],["dasherize(attr",{"_index":1251,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8308,16],[8362,16]]},"template:templates/docs/getting-started/overview":{"position":[[8308,16],[8362,16]]}},"keywords":{}}],["data",{"_index":15,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[44,5],[328,4]]},"template:docs/advanced/environment-options":{"position":[[2469,4],[2527,4],[2607,4]]},"template:docs/advanced/server-configuration":{"position":[[1414,4],[1770,4],[2046,5],[2126,5],[3838,4],[3963,4],[4408,4],[4935,4]]},"template:docs/data-layer/database":{"position":[[38,4],[695,4],[1086,4],[1574,5]]},"template:docs/data-layer/factories":{"position":[[721,4],[1905,5],[3862,5],[4344,5],[5669,5],[5942,5],[6002,4],[6197,4],[6671,5],[12069,4],[16238,4],[17464,4]]},"template:docs/data-layer/fixtures":{"position":[[81,5],[183,4],[251,4],[810,4],[1434,4],[2436,4],[3254,5],[5279,4]]},"template:docs/data-layer/models":{"position":[[273,5],[621,4],[1842,4]]},"template:docs/data-layer/orm":{"position":[[67,4],[672,4],[927,5],[1203,5],[1679,5],[2236,5],[2338,5],[3197,5],[3566,5],[3624,4],[4554,5],[4909,4],[5287,5],[5490,4],[5615,5],[5766,5],[6531,4],[6584,4],[7094,4]]},"template:docs/data-layer/relationships":{"position":[[227,4],[6376,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[355,4],[567,4],[905,4],[1357,4],[1901,4]]},"template:docs/data-layer/serializers/index":{"position":[[276,5],[480,4],[839,4],[1045,5],[1798,4],[4278,5],[4386,5],[4642,5],[4991,5],[5223,4],[7212,4]]},"template:docs/getting-started/overview":{"position":[[478,5],[778,5],[792,4],[965,4],[1100,4],[1359,4],[1479,4],[1599,4],[1734,4],[1838,5],[2259,4],[2622,4],[2952,5],[3045,5],[3142,4],[3434,5],[4025,4],[4493,5],[5711,5],[6608,5],[7469,5],[7569,4],[8513,5],[10945,4],[10990,4],[11049,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7879,5],[7970,5],[9017,4],[9119,4],[9329,5],[9435,4],[9536,5],[9616,5],[9718,4],[9941,4],[10165,5],[10189,5],[10476,6],[10580,4],[10887,5],[11256,5],[11515,4],[17403,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[1486,4],[1554,5],[1905,4],[1965,4]]},"template:docs/route-handlers/functions":{"position":[[373,5],[1828,4],[1927,4],[2056,4],[2456,4],[2730,5],[4191,4],[4213,5],[4348,5]]},"template:docs/route-handlers/shorthands":{"position":[[732,5],[2713,4],[3404,4],[4219,4],[5906,4]]},"template:docs/testing/acceptance-tests":{"position":[[1505,4]]},"template:docs/testing/assertions":{"position":[[332,4],[579,4],[712,4],[788,4],[1304,4],[1499,4],[2116,4],[2302,4],[3847,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1738,4],[1861,4],[3031,4],[3239,4],[5192,4],[6318,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[44,5],[328,4]]},"template:templates/docs/advanced/environment-options":{"position":[[2469,4],[2527,4],[2607,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[1414,4],[1770,4],[2046,5],[2126,5],[3838,4],[3963,4],[4408,4],[4935,4]]},"template:templates/docs/data-layer/database":{"position":[[38,4],[695,4],[1086,4],[1574,5]]},"template:templates/docs/data-layer/factories":{"position":[[721,4],[1905,5],[3862,5],[4344,5],[5669,5],[5942,5],[6002,4],[6197,4],[6671,5],[12069,4],[16238,4],[17464,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[81,5],[183,4],[251,4],[810,4],[1434,4],[2436,4],[3254,5],[5279,4]]},"template:templates/docs/data-layer/models":{"position":[[273,5],[621,4],[1842,4]]},"template:templates/docs/data-layer/orm":{"position":[[67,4],[672,4],[927,5],[1203,5],[1679,5],[2236,5],[2338,5],[3197,5],[3566,5],[3624,4],[4554,5],[4909,4],[5287,5],[5490,4],[5615,5],[5766,5],[6531,4],[6584,4],[7094,4]]},"template:templates/docs/data-layer/relationships":{"position":[[227,4],[6376,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[355,4],[567,4],[905,4],[1357,4],[1901,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[276,5],[480,4],[839,4],[1045,5],[1798,4],[4278,5],[4386,5],[4642,5],[4991,5],[5223,4],[7212,4]]},"template:templates/docs/getting-started/overview":{"position":[[478,5],[778,5],[792,4],[965,4],[1100,4],[1359,4],[1479,4],[1599,4],[1734,4],[1838,5],[2259,4],[2622,4],[2952,5],[3045,5],[3142,4],[3434,5],[4025,4],[4493,5],[5711,5],[6608,5],[7469,5],[7569,4],[8513,5],[10945,4],[10990,4],[11049,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7879,5],[7970,5],[9017,4],[9119,4],[9329,5],[9435,4],[9536,5],[9616,5],[9718,4],[9941,4],[10165,5],[10189,5],[10476,6],[10580,4],[10887,5],[11256,5],[11515,4],[17403,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1486,4],[1554,5],[1905,4],[1965,4]]},"template:templates/docs/route-handlers/functions":{"position":[[373,5],[1828,4],[1927,4],[2056,4],[2456,4],[2730,5],[4191,4],[4213,5],[4348,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[732,5],[2713,4],[3404,4],[4219,4],[5906,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1505,4]]},"template:templates/docs/testing/assertions":{"position":[[332,4],[579,4],[712,4],[788,4],[1304,4],[1499,4],[2116,4],[2302,4],[3847,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1738,4],[1861,4],[3031,4],[3239,4],[5192,4],[6318,4]]}},"keywords":{}}],["data'",{"_index":1731,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[3846,6],[4149,6],[6245,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3846,6],[4149,6],[6245,6]]}},"keywords":{}}],["data-cr",{"_index":511,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[472,13]]},"template:templates/docs/data-layer/factories":{"position":[[472,13]]}},"keywords":{}}],["data-driven",{"_index":543,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2036,11]]},"template:templates/docs/data-layer/factories":{"position":[[2036,11]]}},"keywords":{}}],["data-fetch",{"_index":1705,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[171,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[171,13]]}},"keywords":{}}],["data-load",{"_index":1406,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9991,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9991,12]]}},"keywords":{}}],["databas",{"_index":50,"title":{"template:docs/data-layer/database":{"position":[[4,8]]},"template:templates/docs/data-layer/database":{"position":[[4,8]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[710,8]]},"template:docs/advanced/mocking-guids":{"position":[[174,8],[335,8],[649,9],[685,8]]},"template:docs/advanced/switching-between-scenarios":{"position":[[286,9]]},"template:docs/data-layer/database":{"position":[[5,8],[71,9],[86,8],[224,8],[407,8],[635,8],[1255,8],[1350,8],[1487,8],[1901,8]]},"template:docs/data-layer/factories":{"position":[[934,8],[1378,9],[1722,8],[3155,8],[7036,9],[13475,9],[14852,9],[15116,8],[15576,8],[17650,9]]},"template:docs/data-layer/fixtures":{"position":[[67,8],[1475,9],[1822,8],[3218,8],[3800,8]]},"template:docs/data-layer/orm":{"position":[[51,8],[412,8],[6633,8],[6729,9],[7085,8],[7658,8],[8055,8],[8298,9]]},"template:docs/data-layer/relationships":{"position":[[1448,9]]},"template:docs/getting-started/overview":{"position":[[2181,9],[2195,8],[2557,8],[2698,9],[2821,8],[2986,8],[3026,8],[3931,8],[3951,8],[4182,9],[4766,9],[4880,8],[7204,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7585,8],[12723,9],[12906,9],[14080,8],[14809,8],[15006,8],[16277,8],[16475,9],[16952,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1278,8],[1454,8]]},"template:docs/route-handlers/shorthands":{"position":[[2727,9],[3418,9]]},"template:docs/testing/acceptance-tests":{"position":[[1589,8],[4303,8],[4472,8]]},"template:docs/testing/assertions":{"position":[[628,8],[763,9],[2107,8],[2293,8],[3606,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5061,8],[5136,8]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[710,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[174,8],[335,8],[649,9],[685,8]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[286,9]]},"template:templates/docs/data-layer/database":{"position":[[5,8],[71,9],[86,8],[224,8],[407,8],[635,8],[1255,8],[1350,8],[1487,8],[1901,8]]},"template:templates/docs/data-layer/factories":{"position":[[934,8],[1378,9],[1722,8],[3155,8],[7036,9],[13475,9],[14852,9],[15116,8],[15576,8],[17650,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[67,8],[1475,9],[1822,8],[3218,8],[3800,8]]},"template:templates/docs/data-layer/orm":{"position":[[51,8],[412,8],[6633,8],[6729,9],[7085,8],[7658,8],[8055,8],[8298,9]]},"template:templates/docs/data-layer/relationships":{"position":[[1448,9]]},"template:templates/docs/getting-started/overview":{"position":[[2181,9],[2195,8],[2557,8],[2698,9],[2821,8],[2986,8],[3026,8],[3931,8],[3951,8],[4182,9],[4766,9],[4880,8],[7204,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7585,8],[12723,9],[12906,9],[14080,8],[14809,8],[15006,8],[16277,8],[16475,9],[16952,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1278,8],[1454,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2727,9],[3418,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1589,8],[4303,8],[4472,8]]},"template:templates/docs/testing/assertions":{"position":[[628,8],[763,9],[2107,8],[2293,8],[3606,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5061,8],[5136,8]]}},"keywords":{}}],["date",{"_index":382,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[436,7]]},"template:docs/data-layer/factories":{"position":[[3807,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[436,7]]},"template:templates/docs/data-layer/factories":{"position":[[3807,6]]}},"keywords":{}}],["date(now.gettim",{"_index":384,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[471,18]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[471,18]]}},"keywords":{}}],["db",{"_index":1021,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1342,3],[1548,3],[1643,2]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16348,2],[17569,2],[17902,2],[18015,2],[18112,2],[18354,2],[18384,2]]},"template:templates/docs/data-layer/relationships":{"position":[[1342,3],[1548,3],[1643,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16348,2],[17569,2],[17902,2],[18015,2],[18112,2],[18354,2],[18384,2]]}},"keywords":{}}],["db.blog_post",{"_index":1461,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15030,14]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15030,14]]}},"keywords":{}}],["db.blog_posts.filter(p",{"_index":1468,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15480,22]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15480,22]]}},"keywords":{}}],["db.blogpost",{"_index":1483,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16672,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16672,12]]}},"keywords":{}}],["db.blogposts.filter(p",{"_index":1470,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15541,21]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15541,21]]}},"keywords":{}}],["db.dump",{"_index":923,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[443,10]]},"template:templates/docs/data-layer/orm":{"position":[[443,10]]}},"keywords":{}}],["deal",{"_index":915,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[193,7],[1013,4]]},"template:docs/data-layer/serializers/index":{"position":[[3738,7],[6670,7]]},"template:docs/getting-started/overview":{"position":[[1240,4],[5779,7],[5849,4]]},"template:docs/route-handlers/shorthands":{"position":[[91,4]]},"template:templates/docs/data-layer/orm":{"position":[[193,7],[1013,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3738,7],[6670,7]]},"template:templates/docs/getting-started/overview":{"position":[[1240,4],[5779,7],[5849,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[91,4]]}},"keywords":{}}],["declar",{"_index":771,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17493,7]]},"template:docs/getting-started/overview":{"position":[[6019,7]]},"template:templates/docs/data-layer/factories":{"position":[[17493,7]]},"template:templates/docs/getting-started/overview":{"position":[[6019,7]]}},"keywords":{}}],["default",{"_index":26,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[189,8],[1220,7]]},"template:docs/advanced/environment-options":{"position":[[239,8],[373,7],[897,7],[1029,8],[1055,7],[1439,8],[1461,8],[1867,8],[1915,7],[2147,7],[2500,8]]},"template:docs/advanced/mocking-guids":{"position":[[838,7]]},"template:docs/advanced/server-configuration":{"position":[[246,7],[757,7],[841,7],[908,7],[1221,7],[1496,8],[3118,7],[3496,7],[4646,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[657,7],[967,7],[1812,7],[1936,7],[2054,7],[2167,8]]},"template:docs/data-layer/database":{"position":[[755,7]]},"template:docs/data-layer/factories":{"position":[[890,7],[1099,7],[1590,7],[2370,7],[2534,7],[2860,7],[3515,7],[5459,7],[7619,7],[7678,7],[7911,7],[9341,7],[10135,7],[10744,7],[11589,7],[12392,7],[12658,7],[12920,7],[13166,7],[13599,7],[13912,7],[14183,7],[14505,7]]},"template:docs/data-layer/fixtures":{"position":[[397,7],[875,7],[1955,7],[2223,7],[2890,7],[2949,7],[3979,7],[4062,7],[4340,7],[4418,7],[4584,7],[4685,7]]},"template:docs/data-layer/models":{"position":[[953,7],[1317,7],[1688,7]]},"template:docs/data-layer/orm":{"position":[[3298,7],[4449,7],[5059,7],[5231,7],[6127,7]]},"template:docs/data-layer/relationships":{"position":[[641,7],[1942,7],[2738,7],[3090,7],[3158,7],[3717,7],[3788,7],[4107,7],[4178,7],[4679,7],[4786,7],[4865,7],[5535,7],[5629,7],[5686,7]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[375,7],[1220,7],[1651,7]]},"template:docs/data-layer/serializers/index":{"position":[[1008,7],[2154,7],[2337,7],[2794,7],[3160,9],[3448,7],[4141,7],[4785,7],[6024,7]]},"template:docs/getting-started/installation":{"position":[[340,8]]},"template:docs/getting-started/overview":{"position":[[2055,7],[3512,7],[4281,7],[6136,7],[6270,7],[7345,7],[8249,7],[8596,7],[10112,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[586,7],[802,7],[1030,7],[1222,7],[7311,8],[7630,7],[8230,8],[10527,8],[10809,8],[11007,7],[11686,7],[11797,7],[12261,7],[12390,7],[13504,7],[13546,7],[13638,7],[15688,7],[15841,7],[16617,7]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[97,7]]},"template:docs/route-handlers/functions":{"position":[[1037,7],[1270,7],[3679,7],[6055,8],[6523,7],[6876,8]]},"template:docs/route-handlers/shorthands":{"position":[[1146,7]]},"template:docs/testing/acceptance-tests":{"position":[[2544,7],[5288,7],[5403,7]]},"template:docs/testing/assertions":{"position":[[2757,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5511,7]]},"template:docs/testing/setup-mirage":{"position":[[1072,7]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[189,8],[1220,7]]},"template:templates/docs/advanced/environment-options":{"position":[[239,8],[373,7],[897,7],[1029,8],[1055,7],[1439,8],[1461,8],[1867,8],[1915,7],[2147,7],[2500,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[838,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[246,7],[757,7],[841,7],[908,7],[1221,7],[1496,8],[3118,7],[3496,7],[4646,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[657,7],[967,7],[1812,7],[1936,7],[2054,7],[2167,8]]},"template:templates/docs/data-layer/database":{"position":[[755,7]]},"template:templates/docs/data-layer/factories":{"position":[[890,7],[1099,7],[1590,7],[2370,7],[2534,7],[2860,7],[3515,7],[5459,7],[7619,7],[7678,7],[7911,7],[9341,7],[10135,7],[10744,7],[11589,7],[12392,7],[12658,7],[12920,7],[13166,7],[13599,7],[13912,7],[14183,7],[14505,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[397,7],[875,7],[1955,7],[2223,7],[2890,7],[2949,7],[3979,7],[4062,7],[4340,7],[4418,7],[4584,7],[4685,7]]},"template:templates/docs/data-layer/models":{"position":[[953,7],[1317,7],[1688,7]]},"template:templates/docs/data-layer/orm":{"position":[[3298,7],[4449,7],[5059,7],[5231,7],[6127,7]]},"template:templates/docs/data-layer/relationships":{"position":[[641,7],[1942,7],[2738,7],[3090,7],[3158,7],[3717,7],[3788,7],[4107,7],[4178,7],[4679,7],[4786,7],[4865,7],[5535,7],[5629,7],[5686,7]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[375,7],[1220,7],[1651,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1008,7],[2154,7],[2337,7],[2794,7],[3160,9],[3448,7],[4141,7],[4785,7],[6024,7]]},"template:templates/docs/getting-started/installation":{"position":[[340,8]]},"template:templates/docs/getting-started/overview":{"position":[[2055,7],[3512,7],[4281,7],[6136,7],[6270,7],[7345,7],[8249,7],[8596,7],[10112,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[586,7],[802,7],[1030,7],[1222,7],[7311,8],[7630,7],[8230,8],[10527,8],[10809,8],[11007,7],[11686,7],[11797,7],[12261,7],[12390,7],[13504,7],[13546,7],[13638,7],[15688,7],[15841,7],[16617,7]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[97,7]]},"template:templates/docs/route-handlers/functions":{"position":[[1037,7],[1270,7],[3679,7],[6055,8],[6523,7],[6876,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1146,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2544,7],[5288,7],[5403,7]]},"template:templates/docs/testing/assertions":{"position":[[2757,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5511,7]]},"template:templates/docs/testing/setup-mirage":{"position":[[1072,7]]}},"keywords":{}}],["default.j",{"_index":397,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[101,10]]},"template:docs/data-layer/factories":{"position":[[14272,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[101,10]]},"template:templates/docs/data-layer/factories":{"position":[[14272,11]]}},"keywords":{}}],["defin",{"_index":249,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[281,8],[404,7],[1898,7],[2154,6],[4012,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[895,7]]},"template:docs/data-layer/factories":{"position":[[513,6],[605,8],[669,7],[1278,7],[1978,6],[2437,6],[4394,8],[6956,7],[9915,6],[10005,6],[11433,6],[15781,6],[15952,6]]},"template:docs/data-layer/fixtures":{"position":[[2036,8]]},"template:docs/data-layer/models":{"position":[[151,6],[372,6],[747,8],[766,6],[2780,8],[2809,6]]},"template:docs/data-layer/orm":{"position":[[3092,8],[3209,6],[3403,6],[3748,8],[4320,7],[8916,6]]},"template:docs/data-layer/relationships":{"position":[[27,7],[56,6],[266,7],[299,6],[426,6],[488,6],[693,7],[1799,6]]},"template:docs/data-layer/serializers/index":{"position":[[1763,7],[2072,8],[2142,6],[2534,6],[3968,8]]},"template:docs/getting-started/overview":{"position":[[1639,8],[3302,6],[10226,8],[10520,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[608,7],[10334,7],[12137,6],[12625,6],[16210,6],[16764,6],[17544,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1495,8]]},"template:docs/route-handlers/functions":{"position":[[93,6],[2884,6]]},"template:docs/route-handlers/shorthands":{"position":[[4203,7],[4276,6],[4391,7],[4610,7],[4713,7],[4808,7],[4904,7],[5075,6],[5196,7]]},"template:docs/testing/acceptance-tests":{"position":[[1653,6],[4629,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[954,6],[1040,7],[2494,8]]},"template:docs/testing/setup-mirage":{"position":[[588,8],[1188,6]]},"template:index":{"position":[[116,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[281,8],[404,7],[1898,7],[2154,6],[4012,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[895,7]]},"template:templates/docs/data-layer/factories":{"position":[[513,6],[605,8],[669,7],[1278,7],[1978,6],[2437,6],[4394,8],[6956,7],[9915,6],[10005,6],[11433,6],[15781,6],[15952,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[2036,8]]},"template:templates/docs/data-layer/models":{"position":[[151,6],[372,6],[747,8],[766,6],[2780,8],[2809,6]]},"template:templates/docs/data-layer/orm":{"position":[[3092,8],[3209,6],[3403,6],[3748,8],[4320,7],[8916,6]]},"template:templates/docs/data-layer/relationships":{"position":[[27,7],[56,6],[266,7],[299,6],[426,6],[488,6],[693,7],[1799,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1763,7],[2072,8],[2142,6],[2534,6],[3968,8]]},"template:templates/docs/getting-started/overview":{"position":[[1639,8],[3302,6],[10226,8],[10520,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[608,7],[10334,7],[12137,6],[12625,6],[16210,6],[16764,6],[17544,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1495,8]]},"template:templates/docs/route-handlers/functions":{"position":[[93,6],[2884,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4203,7],[4276,6],[4391,7],[4610,7],[4713,7],[4808,7],[4904,7],[5075,6],[5196,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1653,6],[4629,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[954,6],[1040,7],[2494,8]]},"template:templates/docs/testing/setup-mirage":{"position":[[588,8],[1188,6]]},"template:templates/index":{"position":[[116,6]]}},"keywords":{}}],["definit",{"_index":173,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2131,11],[2242,10]]},"template:docs/advanced/server-configuration":{"position":[[1378,11],[1955,11]]},"template:docs/data-layer/factories":{"position":[[770,10],[3139,11],[12771,12]]},"template:docs/data-layer/models":{"position":[[1503,10]]},"template:docs/data-layer/orm":{"position":[[3475,10],[6490,11]]},"template:docs/data-layer/relationships":{"position":[[4623,11],[6317,11]]},"template:docs/getting-started/overview":{"position":[[1739,12],[4085,11],[9784,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2087,12],[11598,11],[17351,11],[17666,11]]},"template:docs/route-handlers/shorthands":{"position":[[215,11]]},"template:docs/testing/acceptance-tests":{"position":[[4524,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3214,11],[3932,12]]},"template:templates/docs/advanced/environment-options":{"position":[[2131,11],[2242,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1378,11],[1955,11]]},"template:templates/docs/data-layer/factories":{"position":[[770,10],[3139,11],[12771,12]]},"template:templates/docs/data-layer/models":{"position":[[1503,10]]},"template:templates/docs/data-layer/orm":{"position":[[3475,10],[6490,11]]},"template:templates/docs/data-layer/relationships":{"position":[[4623,11],[6317,11]]},"template:templates/docs/getting-started/overview":{"position":[[1739,12],[4085,11],[9784,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2087,12],[11598,11],[17351,11],[17666,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[215,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4524,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3214,11],[3932,12]]}},"keywords":{}}],["del",{"_index":1264,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[9546,3]]},"template:docs/route-handlers/functions":{"position":[[161,3],[6195,3]]},"template:docs/route-handlers/shorthands":{"position":[[1210,3]]},"template:templates/docs/getting-started/overview":{"position":[[9546,3]]},"template:templates/docs/route-handlers/functions":{"position":[[161,3],[6195,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1210,3]]}},"keywords":{}}],["delay",{"_index":1525,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[796,5],[1045,5],[1520,6],[1662,7]]},"template:templates/docs/route-handlers/functions":{"position":[[796,5],[1045,5],[1520,6],[1662,7]]}},"keywords":{}}],["deleg",{"_index":890,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1751,9]]},"template:docs/data-layer/orm":{"position":[[4741,10]]},"template:templates/docs/data-layer/models":{"position":[[1751,9]]},"template:templates/docs/data-layer/orm":{"position":[[4741,10]]}},"keywords":{}}],["delet",{"_index":904,"title":{},"text":{"template:docs/data-layer/models":{"position":[[2374,8],[2614,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13712,6]]},"template:docs/route-handlers/shorthands":{"position":[[3499,6],[5748,6]]},"template:templates/docs/data-layer/models":{"position":[[2374,8],[2614,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13712,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[3499,6],[5748,6]]}},"keywords":{}}],["depend",{"_index":310,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2436,12]]},"template:docs/data-layer/factories":{"position":[[5175,9],[5211,6]]},"template:docs/data-layer/serializers/index":{"position":[[784,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2405,12],[2689,13]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5227,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[2436,12]]},"template:templates/docs/data-layer/factories":{"position":[[5175,9],[5211,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[784,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2405,12],[2689,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5227,6]]}},"keywords":{}}],["deprec",{"_index":1353,"title":{"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[0,12]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[0,12]]}},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5241,10],[5982,11]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[1,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5241,10],[5982,11]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[1,12]]}},"keywords":{}}],["deprecated/unintent",{"_index":1357,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5668,24]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5668,24]]}},"keywords":{}}],["deriv",{"_index":283,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1390,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[1390,7]]}},"keywords":{}}],["design",{"_index":1248,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[7236,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8718,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[56,8]]},"template:templates/docs/getting-started/overview":{"position":[[7236,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8718,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[56,8]]}},"keywords":{}}],["desir",{"_index":1384,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8277,7]]},"template:docs/testing/setup-mirage":{"position":[[1051,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8277,7]]},"template:templates/docs/testing/setup-mirage":{"position":[[1051,9]]}},"keywords":{}}],["destroy",{"_index":1608,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[3517,10],[3828,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[3517,10],[3828,10]]}},"keywords":{}}],["destructur",{"_index":1496,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[18274,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18274,13]]}},"keywords":{}}],["detail",{"_index":671,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9588,7],[16204,7],[16907,7]]},"template:docs/data-layer/serializers/index":{"position":[[5289,8]]},"template:docs/getting-started/overview":{"position":[[7128,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[18627,8]]},"template:docs/testing/acceptance-tests":{"position":[[2309,7],[3242,6]]},"template:docs/testing/assertions":{"position":[[3709,7]]},"template:templates/docs/data-layer/factories":{"position":[[9588,7],[16204,7],[16907,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5289,8]]},"template:templates/docs/getting-started/overview":{"position":[[7128,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18627,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2309,7],[3242,6]]},"template:templates/docs/testing/assertions":{"position":[[3709,7]]}},"keywords":{}}],["detect",{"_index":1566,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5636,6]]},"template:templates/docs/route-handlers/functions":{"position":[[5636,6]]}},"keywords":{}}],["develop",{"_index":108,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[297,11],[675,12],[737,14],[955,11],[1684,11]]},"template:docs/advanced/server-configuration":{"position":[[547,11]]},"template:docs/advanced/switching-between-scenarios":{"position":[[156,11],[189,12],[695,11]]},"template:docs/data-layer/factories":{"position":[[143,10],[551,11],[977,10],[1872,7],[5103,11],[13416,11],[13463,11],[13711,12],[14316,11],[14584,10],[14955,11],[15077,11],[16794,9]]},"template:docs/data-layer/fixtures":{"position":[[1838,12]]},"template:docs/getting-started/installation":{"position":[[568,11],[1269,7],[1483,7]]},"template:docs/getting-started/overview":{"position":[[4170,11],[5729,11],[10354,7],[10636,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9170,7],[15144,10]]},"template:docs/getting-started/what-is-mirage":{"position":[[67,10],[297,9],[608,10],[729,11],[825,10],[1109,7]]},"template:docs/route-handlers/functions":{"position":[[1066,12]]},"template:docs/testing/acceptance-tests":{"position":[[4793,12],[4981,11],[5124,11]]},"template:docs/testing/assertions":{"position":[[2800,11]]},"template:index":{"position":[[66,10]]},"template:templates/docs/advanced/environment-options":{"position":[[297,11],[675,12],[737,14],[955,11],[1684,11]]},"template:templates/docs/advanced/server-configuration":{"position":[[547,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[156,11],[189,12],[695,11]]},"template:templates/docs/data-layer/factories":{"position":[[143,10],[551,11],[977,10],[1872,7],[5103,11],[13416,11],[13463,11],[13711,12],[14316,11],[14584,10],[14955,11],[15077,11],[16794,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1838,12]]},"template:templates/docs/getting-started/installation":{"position":[[568,11],[1269,7],[1483,7]]},"template:templates/docs/getting-started/overview":{"position":[[4170,11],[5729,11],[10354,7],[10636,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9170,7],[15144,10]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[67,10],[297,9],[608,10],[729,11],[825,10],[1109,7]]},"template:templates/docs/route-handlers/functions":{"position":[[1066,12]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4793,12],[4981,11],[5124,11]]},"template:templates/docs/testing/assertions":{"position":[[2800,11]]},"template:templates/index":{"position":[[66,10]]}},"keywords":{}}],["development-tim",{"_index":408,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[478,16]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[478,16]]}},"keywords":{}}],["dhaka",{"_index":811,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1301,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[1301,7]]}},"keywords":{}}],["didn't",{"_index":1378,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7683,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7683,6]]}},"keywords":{}}],["differ",{"_index":351,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4285,9]]},"template:docs/data-layer/factories":{"position":[[99,9],[520,9],[4301,9],[12038,9],[14619,9]]},"template:docs/data-layer/relationships":{"position":[[2532,9],[3471,9],[5078,9]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[428,9]]},"template:docs/data-layer/serializers/index":{"position":[[1923,9],[3720,9]]},"template:docs/getting-started/overview":{"position":[[2737,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7475,11],[9234,11]]},"template:docs/route-handlers/functions":{"position":[[6993,9]]},"template:docs/testing/acceptance-tests":{"position":[[1047,10],[2725,9],[2753,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[4285,9]]},"template:templates/docs/data-layer/factories":{"position":[[99,9],[520,9],[4301,9],[12038,9],[14619,9]]},"template:templates/docs/data-layer/relationships":{"position":[[2532,9],[3471,9],[5078,9]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[428,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1923,9],[3720,9]]},"template:templates/docs/getting-started/overview":{"position":[[2737,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7475,11],[9234,11]]},"template:templates/docs/route-handlers/functions":{"position":[[6993,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1047,10],[2725,9],[2753,9]]}},"keywords":{}}],["differenti",{"_index":953,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2480,13]]},"template:templates/docs/data-layer/orm":{"position":[[2480,13]]}},"keywords":{}}],["difficult",{"_index":1300,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1755,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1755,10]]}},"keywords":{}}],["directli",{"_index":312,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2504,8],[2819,8],[4848,9]]},"template:docs/data-layer/database":{"position":[[416,9],[644,9],[1359,8]]},"template:docs/data-layer/fixtures":{"position":[[1452,8]]},"template:docs/data-layer/models":{"position":[[515,8],[556,8],[1241,8]]},"template:docs/data-layer/orm":{"position":[[1062,8]]},"template:docs/data-layer/serializers/index":{"position":[[5528,8]]},"template:docs/getting-started/overview":{"position":[[5397,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2418,8],[2493,8],[3015,8],[3150,8],[18121,8]]},"template:docs/testing/acceptance-tests":{"position":[[2237,8],[5175,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[307,8],[3446,8],[3520,8],[3634,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2504,8],[2819,8],[4848,9]]},"template:templates/docs/data-layer/database":{"position":[[416,9],[644,9],[1359,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[1452,8]]},"template:templates/docs/data-layer/models":{"position":[[515,8],[556,8],[1241,8]]},"template:templates/docs/data-layer/orm":{"position":[[1062,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5528,8]]},"template:templates/docs/getting-started/overview":{"position":[[5397,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2418,8],[2493,8],[3015,8],[3150,8],[18121,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2237,8],[5175,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[307,8],[3446,8],[3520,8],[3634,8]]}},"keywords":{}}],["director",{"_index":612,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6122,9],[6318,9]]},"template:docs/data-layer/orm":{"position":[[1995,9],[2325,10],[4971,9],[5082,9],[5120,8],[5754,9],[7350,9],[7486,8],[7864,8],[7986,9]]},"template:templates/docs/data-layer/factories":{"position":[[6122,9],[6318,9]]},"template:templates/docs/data-layer/orm":{"position":[[1995,9],[2325,10],[4971,9],[5082,9],[5120,8],[5754,9],[7350,9],[7486,8],[7864,8],[7986,9]]}},"keywords":{}}],["directori",{"_index":171,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2067,9],[2093,9],[2155,9],[2329,10]]},"template:docs/advanced/server-configuration":{"position":[[1074,10],[1306,9],[1929,10]]},"template:docs/advanced/switching-between-scenarios":{"position":[[54,9]]},"template:docs/getting-started/installation":{"position":[[117,9]]},"template:docs/getting-started/overview":{"position":[[1801,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[436,10],[13519,9],[13561,9],[13677,9],[13872,9],[13946,9]]},"template:docs/testing/setup-mirage":{"position":[[1103,9]]},"template:templates/docs/advanced/environment-options":{"position":[[2067,9],[2093,9],[2155,9],[2329,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1074,10],[1306,9],[1929,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[54,9]]},"template:templates/docs/getting-started/installation":{"position":[[117,9]]},"template:templates/docs/getting-started/overview":{"position":[[1801,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[436,10],[13519,9],[13561,9],[13677,9],[13872,9],[13946,9]]},"template:templates/docs/testing/setup-mirage":{"position":[[1103,9]]}},"keywords":{}}],["directorid",{"_index":950,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2045,10],[2153,11],[2568,12],[6944,11],[6977,10],[7733,11],[8152,11],[8268,10]]},"template:templates/docs/data-layer/orm":{"position":[[2045,10],[2153,11],[2568,12],[6944,11],[6977,10],[7733,11],[8152,11],[8268,10]]}},"keywords":{}}],["disabl",{"_index":122,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[664,7],[911,8],[2659,7]]},"template:docs/getting-started/installation":{"position":[[1114,8]]},"template:docs/testing/assertions":{"position":[[2745,8]]},"template:templates/docs/advanced/environment-options":{"position":[[664,7],[911,8],[2659,7]]},"template:templates/docs/getting-started/installation":{"position":[[1114,8]]},"template:templates/docs/testing/assertions":{"position":[[2745,8]]}},"keywords":{}}],["discov",{"_index":342,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3942,9]]},"template:docs/data-layer/models":{"position":[[305,8]]},"template:docs/data-layer/relationships":{"position":[[382,10]]},"template:docs/data-layer/serializers/index":{"position":[[1847,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1391,8],[5514,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[3942,9]]},"template:templates/docs/data-layer/models":{"position":[[305,8]]},"template:templates/docs/data-layer/relationships":{"position":[[382,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1847,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1391,8],[5514,10]]}},"keywords":{}}],["discoveremberdatamodel",{"_index":136,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1144,29],[2356,23],[2927,24]]},"template:docs/advanced/server-configuration":{"position":[[1566,23],[3019,23],[3186,29],[3397,23],[3564,29],[4956,24],[5153,29]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[971,24],[1099,29],[1301,23],[1428,29]]},"template:docs/testing/setup-mirage":{"position":[[1348,23],[1519,29]]},"template:templates/docs/advanced/environment-options":{"position":[[1144,29],[2356,23],[2927,24]]},"template:templates/docs/advanced/server-configuration":{"position":[[1566,23],[3019,23],[3186,29],[3397,23],[3564,29],[4956,24],[5153,29]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[971,24],[1099,29],[1301,23],[1428,29]]},"template:templates/docs/testing/setup-mirage":{"position":[[1348,23],[1519,29]]}},"keywords":{"module:ember-cli-mirage/ember-data":{"position":[null]}}}],["discuss",{"_index":868,"title":{},"text":{"template:docs/data-layer/models":{"position":[[203,7]]},"template:docs/route-handlers/functions":{"position":[[7652,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[7472,7]]},"template:templates/docs/data-layer/models":{"position":[[203,7]]},"template:templates/docs/route-handlers/functions":{"position":[[7652,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[7472,7]]}},"keywords":{}}],["disk",{"_index":519,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[754,5]]},"template:templates/docs/data-layer/factories":{"position":[[754,5]]}},"keywords":{}}],["doc",{"_index":1080,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[6017,4]]},"template:docs/data-layer/serializers/index":{"position":[[3541,4],[5272,4],[7080,4]]},"template:docs/getting-started/overview":{"position":[[10837,4]]},"template:docs/route-handlers/shorthands":{"position":[[2781,4],[3472,4],[6023,5]]},"template:docs/testing/assertions":{"position":[[4007,4]]},"template:index":{"position":[[338,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6017,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3541,4],[5272,4],[7080,4]]},"template:templates/docs/getting-started/overview":{"position":[[10837,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2781,4],[3472,4],[6023,5]]},"template:templates/docs/testing/assertions":{"position":[[4007,4]]},"template:templates/index":{"position":[[338,4]]}},"keywords":{}}],["document",{"_index":53,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[737,8]]},"template:docs/getting-started/overview":{"position":[[167,13]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7520,10],[7537,9],[8881,9],[9088,9],[10681,10]]},"template:docs/route-handlers/functions":{"position":[[2662,11],[5244,8]]},"template:docs/testing/acceptance-tests":{"position":[[1294,13]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[737,8]]},"template:templates/docs/getting-started/overview":{"position":[[167,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7520,10],[7537,9],[8881,9],[9088,9],[10681,10]]},"template:templates/docs/route-handlers/functions":{"position":[[2662,11],[5244,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1294,13]]}},"keywords":{}}],["document.cooki",{"_index":393,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[738,16]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[738,16]]}},"keywords":{}}],["document.cookie=`remember_me=cookie-content-her",{"_index":387,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[513,49]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[513,49]]}},"keywords":{}}],["doesn't",{"_index":666,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9244,7]]},"template:docs/data-layer/fixtures":{"position":[[1689,7]]},"template:docs/data-layer/orm":{"position":[[6041,7]]},"template:docs/data-layer/relationships":{"position":[[3891,7],[4934,7]]},"template:docs/data-layer/serializers/index":{"position":[[6724,7]]},"template:docs/getting-started/overview":{"position":[[10183,7]]},"template:docs/testing/acceptance-tests":{"position":[[4883,7]]},"template:not-found":{"position":[[21,7]]},"template:templates/docs/data-layer/factories":{"position":[[9244,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[1689,7]]},"template:templates/docs/data-layer/orm":{"position":[[6041,7]]},"template:templates/docs/data-layer/relationships":{"position":[[3891,7],[4934,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6724,7]]},"template:templates/docs/getting-started/overview":{"position":[[10183,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4883,7]]},"template:templates/not-found":{"position":[[21,7]]}},"keywords":{}}],["domain",{"_index":959,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2817,7],[3693,6]]},"template:docs/route-handlers/functions":{"position":[[7033,6],[7182,6]]},"template:docs/route-handlers/shorthands":{"position":[[5952,6]]},"template:templates/docs/data-layer/orm":{"position":[[2817,7],[3693,6]]},"template:templates/docs/route-handlers/functions":{"position":[[7033,6],[7182,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5952,6]]}},"keywords":{}}],["domain=.dev-domain",{"_index":388,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[563,19]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[563,19]]}},"keywords":{}}],["don't",{"_index":729,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15015,5],[16121,5]]},"template:docs/data-layer/fixtures":{"position":[[1647,5]]},"template:docs/data-layer/orm":{"position":[[3382,5],[3664,5]]},"template:docs/data-layer/relationships":{"position":[[285,5]]},"template:docs/data-layer/serializers/index":{"position":[[1385,5]]},"template:docs/getting-started/overview":{"position":[[7080,5],[10073,5],[10469,5]]},"template:docs/testing/acceptance-tests":{"position":[[4823,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2678,5],[3058,5],[3560,5]]},"template:templates/docs/data-layer/factories":{"position":[[15015,5],[16121,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[1647,5]]},"template:templates/docs/data-layer/orm":{"position":[[3382,5],[3664,5]]},"template:templates/docs/data-layer/relationships":{"position":[[285,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1385,5]]},"template:templates/docs/getting-started/overview":{"position":[[7080,5],[10073,5],[10469,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4823,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2678,5],[3058,5],[3560,5]]}},"keywords":{}}],["done",{"_index":1057,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4977,4]]},"template:templates/docs/data-layer/relationships":{"position":[[4977,4]]}},"keywords":{}}],["donnelli",{"_index":597,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5701,10]]},"template:templates/docs/data-layer/factories":{"position":[[5701,10]]}},"keywords":{}}],["don’t",{"_index":869,"title":{},"text":{"template:docs/data-layer/models":{"position":[[358,5]]},"template:templates/docs/data-layer/models":{"position":[[358,5]]}},"keywords":{}}],["down",{"_index":752,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16185,4]]},"template:docs/getting-started/overview":{"position":[[1335,5],[9917,4]]},"template:docs/testing/assertions":{"position":[[3818,4]]},"template:templates/docs/data-layer/factories":{"position":[[16185,4]]},"template:templates/docs/getting-started/overview":{"position":[[1335,5],[9917,4]]},"template:templates/docs/testing/assertions":{"position":[[3818,4]]}},"keywords":{}}],["drama",{"_index":564,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3677,8],[4016,7],[4236,7]]},"template:docs/testing/assertions":{"position":[[3201,7]]},"template:templates/docs/data-layer/factories":{"position":[[3677,8],[4016,7],[4236,7]]},"template:templates/docs/testing/assertions":{"position":[[3201,7]]}},"keywords":{}}],["dramat",{"_index":699,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[11992,12]]},"template:docs/route-handlers/shorthands":{"position":[[178,12]]},"template:templates/docs/data-layer/factories":{"position":[[11992,12]]},"template:templates/docs/route-handlers/shorthands":{"position":[[178,12]]}},"keywords":{}}],["drop",{"_index":1271,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[9912,4]]},"template:docs/testing/assertions":{"position":[[3813,4]]},"template:templates/docs/getting-started/overview":{"position":[[9912,4]]},"template:templates/docs/testing/assertions":{"position":[[3813,4]]}},"keywords":{}}],["dump",{"_index":846,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3809,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[3809,4]]}},"keywords":{}}],["dunkirk",{"_index":467,"title":{},"text":{"template:docs/data-layer/database":{"position":[[873,9],[1192,9]]},"template:docs/data-layer/orm":{"position":[[563,9]]},"template:docs/getting-started/overview":{"position":[[658,9]]},"template:docs/route-handlers/functions":{"position":[[279,9],[998,9],[1401,9]]},"template:docs/testing/setup-mirage":{"position":[[1687,10]]},"template:templates/docs/data-layer/database":{"position":[[873,9],[1192,9]]},"template:templates/docs/data-layer/orm":{"position":[[563,9]]},"template:templates/docs/getting-started/overview":{"position":[[658,9]]},"template:templates/docs/route-handlers/functions":{"position":[[279,9],[998,9],[1401,9]]},"template:templates/docs/testing/setup-mirage":{"position":[[1687,10]]}},"keywords":{}}],["duplic",{"_index":968,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[3678,9]]},"template:docs/getting-started/overview":{"position":[[1133,10]]},"template:templates/docs/data-layer/orm":{"position":[[3678,9]]},"template:templates/docs/getting-started/overview":{"position":[[1133,10]]}},"keywords":{}}],["durat",{"_index":1663,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4561,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4561,8]]}},"keywords":{}}],["dure",{"_index":132,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[943,6],[1314,6]]},"template:docs/data-layer/factories":{"position":[[544,6]]},"template:docs/data-layer/fixtures":{"position":[[1831,6],[2394,6]]},"template:docs/getting-started/overview":{"position":[[5722,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5525,6]]},"template:docs/route-handlers/functions":{"position":[[1059,6],[1085,6]]},"template:docs/testing/acceptance-tests":{"position":[[4912,6]]},"template:docs/testing/assertions":{"position":[[2449,6],[2788,6]]},"template:templates/docs/advanced/environment-options":{"position":[[943,6],[1314,6]]},"template:templates/docs/data-layer/factories":{"position":[[544,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[1831,6],[2394,6]]},"template:templates/docs/getting-started/overview":{"position":[[5722,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5525,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1059,6],[1085,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4912,6]]},"template:templates/docs/testing/assertions":{"position":[[2449,6],[2788,6]]}},"keywords":{}}],["dynam",{"_index":452,"title":{},"text":{"template:docs/data-layer/database":{"position":[[326,7]]},"template:docs/data-layer/factories":{"position":[[2098,11],[2996,8],[4329,7]]},"template:docs/data-layer/relationships":{"position":[[153,7]]},"template:docs/getting-started/overview":{"position":[[784,7],[1556,7],[2092,7],[2229,8],[2356,8],[3426,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[167,7],[1338,7]]},"template:docs/route-handlers/functions":{"position":[[2218,7],[2736,7],[2840,7],[2910,7],[2973,7]]},"template:templates/docs/data-layer/database":{"position":[[326,7]]},"template:templates/docs/data-layer/factories":{"position":[[2098,11],[2996,8],[4329,7]]},"template:templates/docs/data-layer/relationships":{"position":[[153,7]]},"template:templates/docs/getting-started/overview":{"position":[[784,7],[1556,7],[2092,7],[2229,8],[2356,8],[3426,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[167,7],[1338,7]]},"template:templates/docs/route-handlers/functions":{"position":[[2218,7],[2736,7],[2840,7],[2910,7],[2973,7]]}},"keywords":{}}],["e.g",{"_index":117,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[484,5]]},"template:docs/getting-started/overview":{"position":[[1090,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5785,4],[14195,5]]},"template:docs/route-handlers/functions":{"position":[[5378,4]]},"template:templates/docs/advanced/environment-options":{"position":[[484,5]]},"template:templates/docs/getting-started/overview":{"position":[[1090,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5785,4],[14195,5]]},"template:templates/docs/route-handlers/functions":{"position":[[5378,4]]}},"keywords":{}}],["each",{"_index":275,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1122,4]]},"template:docs/advanced/switching-between-scenarios":{"position":[[313,4],[376,4]]},"template:docs/data-layer/database":{"position":[[1216,4]]},"template:docs/data-layer/factories":{"position":[[6862,4],[6894,4],[11801,5],[13829,4],[14818,4]]},"template:docs/data-layer/fixtures":{"position":[[4988,4],[5051,4]]},"template:docs/data-layer/relationships":{"position":[[131,4],[3005,4],[3290,4],[3504,4]]},"template:docs/data-layer/serializers/index":{"position":[[2417,4],[3550,4]]},"template:docs/getting-started/overview":{"position":[[2774,4],[3972,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17682,4]]},"template:docs/route-handlers/functions":{"position":[[379,4],[1751,4]]},"template:docs/testing/acceptance-tests":{"position":[[1555,4],[1612,4],[1853,4]]},"template:docs/testing/setup-mirage":{"position":[[253,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[1122,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[313,4],[376,4]]},"template:templates/docs/data-layer/database":{"position":[[1216,4]]},"template:templates/docs/data-layer/factories":{"position":[[6862,4],[6894,4],[11801,5],[13829,4],[14818,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[4988,4],[5051,4]]},"template:templates/docs/data-layer/relationships":{"position":[[131,4],[3005,4],[3290,4],[3504,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2417,4],[3550,4]]},"template:templates/docs/getting-started/overview":{"position":[[2774,4],[3972,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17682,4]]},"template:templates/docs/route-handlers/functions":{"position":[[379,4],[1751,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1555,4],[1612,4],[1853,4]]},"template:templates/docs/testing/setup-mirage":{"position":[[253,4]]}},"keywords":{}}],["earlier",{"_index":702,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[12204,8]]},"template:templates/docs/data-layer/factories":{"position":[[12204,8]]}},"keywords":{}}],["easi",{"_index":677,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9881,4]]},"template:docs/data-layer/relationships":{"position":[[6340,4]]},"template:docs/getting-started/overview":{"position":[[3107,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4740,4],[9162,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[149,4],[798,4],[1321,4],[1617,4]]},"template:docs/route-handlers/shorthands":{"position":[[650,5]]},"template:templates/docs/data-layer/factories":{"position":[[9881,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6340,4]]},"template:templates/docs/getting-started/overview":{"position":[[3107,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4740,4],[9162,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[149,4],[798,4],[1321,4],[1617,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[650,5]]}},"keywords":{}}],["easier",{"_index":513,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[503,6]]},"template:docs/data-layer/orm":{"position":[[6589,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17727,6]]},"template:index":{"position":[[193,7]]},"template:templates/docs/data-layer/factories":{"position":[[503,6]]},"template:templates/docs/data-layer/orm":{"position":[[6589,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17727,6]]},"template:templates/index":{"position":[[193,7]]}},"keywords":{}}],["easili",{"_index":1314,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2623,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2623,6]]}},"keywords":{}}],["ec-mirag",{"_index":1431,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13231,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13231,10]]}},"keywords":{}}],["ecosystem",{"_index":1103,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[980,10],[1329,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5070,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[980,10],[1329,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5070,10]]}},"keywords":{}}],["edg",{"_index":187,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2733,4]]},"template:templates/docs/advanced/environment-options":{"position":[[2733,4]]}},"keywords":{}}],["edit",{"_index":606,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5986,7]]},"template:docs/data-layer/orm":{"position":[[6515,7],[6568,7],[7640,7]]},"template:docs/route-handlers/shorthands":{"position":[[724,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2161,4],[2629,4],[4563,4],[6735,4]]},"template:templates/docs/data-layer/factories":{"position":[[5986,7]]},"template:templates/docs/data-layer/orm":{"position":[[6515,7],[6568,7],[7640,7]]},"template:templates/docs/route-handlers/shorthands":{"position":[[724,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2161,4],[2629,4],[4563,4],[6735,4]]}},"keywords":{}}],["editor",{"_index":711,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13244,8]]},"template:templates/docs/data-layer/factories":{"position":[[13244,8]]}},"keywords":{}}],["effect",{"_index":186,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2643,7]]},"template:docs/data-layer/factories":{"position":[[11955,9],[12542,11],[17354,9]]},"template:docs/data-layer/serializers/index":{"position":[[7268,11]]},"template:docs/testing/acceptance-tests":{"position":[[4546,6]]},"template:templates/docs/advanced/environment-options":{"position":[[2643,7]]},"template:templates/docs/data-layer/factories":{"position":[[11955,9],[12542,11],[17354,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[7268,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4546,6]]}},"keywords":{}}],["elsewher",{"_index":652,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[8366,9]]},"template:templates/docs/data-layer/factories":{"position":[[8366,9]]}},"keywords":{}}],["emb",{"_index":1254,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8499,5]]},"template:templates/docs/getting-started/overview":{"position":[[8499,5]]}},"keywords":{}}],["ember",{"_index":14,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[38,5],[322,5]]},"template:docs/advanced/environment-options":{"position":[[1506,5],[1599,5],[1784,5],[2463,5],[2521,5],[2601,5]]},"template:docs/advanced/mocking-guids":{"position":[[408,5]]},"template:docs/advanced/server-configuration":{"position":[[322,5],[1408,5],[1460,5],[1764,5],[2040,5],[2120,5],[3832,5],[3957,5],[4402,5],[4929,5]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[674,5]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1144,5]]},"template:docs/data-layer/database":{"position":[[351,5],[1516,5]]},"template:docs/data-layer/factories":{"position":[[411,5],[715,5],[2244,5],[15455,5]]},"template:docs/data-layer/fixtures":{"position":[[682,5],[3170,5],[3387,5],[4121,5],[4744,5]]},"template:docs/data-layer/models":{"position":[[244,5],[267,5],[534,5],[736,5],[809,5]]},"template:docs/data-layer/orm":{"position":[[698,5],[3560,5],[3618,5],[5281,5]]},"template:docs/data-layer/relationships":{"position":[[221,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[349,5],[561,5],[1351,5],[1895,5]]},"template:docs/data-layer/serializers/index":{"position":[[385,5],[852,5],[974,5],[1039,5],[1323,5],[1359,5],[1792,5],[2682,5],[3191,5],[3896,5],[4495,5],[4593,5],[7032,5],[7289,5]]},"template:docs/getting-started/installation":{"position":[[37,5],[68,5],[288,5],[379,5],[562,5],[649,5],[692,5],[1410,5]]},"template:docs/getting-started/overview":{"position":[[702,5],[1593,5],[1728,5],[1832,5],[1926,5],[3261,5],[4356,5],[7147,5],[7546,5],[7563,5],[10152,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1736,5],[2352,5],[2916,5],[2966,5],[9178,5],[9338,5],[9712,5],[11509,5],[14389,5],[16508,5],[17397,5]]},"template:docs/getting-started/what-is-mirage":{"position":[[358,5],[819,5],[1004,5],[1899,5],[1937,5],[1959,5]]},"template:docs/route-handlers/functions":{"position":[[310,5],[854,5],[2174,5],[2478,5],[4150,5],[6970,5],[7104,5]]},"template:docs/route-handlers/shorthands":{"position":[[2635,5],[3326,5]]},"template:docs/testing/acceptance-tests":{"position":[[42,5],[584,5],[1347,5],[1375,5],[4087,5]]},"template:docs/testing/assertions":{"position":[[56,5],[541,5],[674,5],[874,5],[1469,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1732,5],[1855,5],[3025,5],[3098,5],[3269,5],[3463,5],[3537,5],[3646,5],[3840,5],[4143,5],[4209,5],[5186,5],[6239,5],[6312,5]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[38,5],[322,5]]},"template:templates/docs/advanced/environment-options":{"position":[[1506,5],[1599,5],[1784,5],[2463,5],[2521,5],[2601,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[408,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[322,5],[1408,5],[1460,5],[1764,5],[2040,5],[2120,5],[3832,5],[3957,5],[4402,5],[4929,5]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[674,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1144,5]]},"template:templates/docs/data-layer/database":{"position":[[351,5],[1516,5]]},"template:templates/docs/data-layer/factories":{"position":[[411,5],[715,5],[2244,5],[15455,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[682,5],[3170,5],[3387,5],[4121,5],[4744,5]]},"template:templates/docs/data-layer/models":{"position":[[244,5],[267,5],[534,5],[736,5],[809,5]]},"template:templates/docs/data-layer/orm":{"position":[[698,5],[3560,5],[3618,5],[5281,5]]},"template:templates/docs/data-layer/relationships":{"position":[[221,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[349,5],[561,5],[1351,5],[1895,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[385,5],[852,5],[974,5],[1039,5],[1323,5],[1359,5],[1792,5],[2682,5],[3191,5],[3896,5],[4495,5],[4593,5],[7032,5],[7289,5]]},"template:templates/docs/getting-started/installation":{"position":[[37,5],[68,5],[288,5],[379,5],[562,5],[649,5],[692,5],[1410,5]]},"template:templates/docs/getting-started/overview":{"position":[[702,5],[1593,5],[1728,5],[1832,5],[1926,5],[3261,5],[4356,5],[7147,5],[7546,5],[7563,5],[10152,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1736,5],[2352,5],[2916,5],[2966,5],[9178,5],[9338,5],[9712,5],[11509,5],[14389,5],[16508,5],[17397,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[358,5],[819,5],[1004,5],[1899,5],[1937,5],[1959,5]]},"template:templates/docs/route-handlers/functions":{"position":[[310,5],[854,5],[2174,5],[2478,5],[4150,5],[6970,5],[7104,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2635,5],[3326,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[42,5],[584,5],[1347,5],[1375,5],[4087,5]]},"template:templates/docs/testing/assertions":{"position":[[56,5],[541,5],[674,5],[874,5],[1469,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1732,5],[1855,5],[3025,5],[3098,5],[3269,5],[3463,5],[3537,5],[3646,5],[3840,5],[4143,5],[4209,5],[5186,5],[6239,5],[6312,5]]}},"keywords":{}}],["ember'",{"_index":27,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[198,7]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[198,7]]}},"keywords":{}}],["ember-auto-import",{"_index":1315,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2980,17]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2980,17]]}},"keywords":{}}],["ember-cli-mirag",{"_index":78,"title":{"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[30,16]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[30,16]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1270,19],[1329,18]]},"template:docs/advanced/server-configuration":{"position":[[67,17],[1599,16],[2616,17],[2683,16],[2915,16],[3050,19],[3428,19],[5014,19]]},"template:docs/data-layer/relationships":{"position":[[614,19],[1915,19],[2711,19]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1193,19],[1624,19]]},"template:docs/getting-started/installation":{"position":[[51,16]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[477,19],[1003,19],[1369,16],[10980,19],[11659,19],[11770,19],[12234,19],[12363,19],[16590,19]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[31,16]]},"template:docs/testing/setup-mirage":{"position":[[1379,19]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1270,19],[1329,18]]},"template:templates/docs/advanced/server-configuration":{"position":[[67,17],[1599,16],[2616,17],[2683,16],[2915,16],[3050,19],[3428,19],[5014,19]]},"template:templates/docs/data-layer/relationships":{"position":[[614,19],[1915,19],[2711,19]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1193,19],[1624,19]]},"template:templates/docs/getting-started/installation":{"position":[[51,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[477,19],[1003,19],[1369,16],[10980,19],[11659,19],[11770,19],[12234,19],[12363,19],[16590,19]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[31,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[1379,19]]}},"keywords":{}}],["ember-cli-mirage/ember-data",{"_index":1159,"title":{"module:ember-cli-mirage/ember-data":{"position":[[0,27]]}},"text":{},"keywords":{}}],["ember-cli-mirage/serializers/ember-data-seri",{"_index":1160,"title":{"module:ember-cli-mirage/serializers/ember-data-serializer":{"position":[[0,50]]}},"text":{},"keywords":{}}],["ember-cli-mirage/test-support",{"_index":1217,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5038,32]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5198,32]]},"template:docs/testing/acceptance-tests":{"position":[[733,32]]},"template:docs/testing/integration-and-unit-tests":{"position":[[508,32],[1234,32],[4351,32],[6442,32]]},"template:docs/testing/setup-mirage":{"position":[[344,32],[729,32],[1306,32]]},"template:templates/docs/getting-started/overview":{"position":[[5038,32]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5198,32]]},"template:templates/docs/testing/acceptance-tests":{"position":[[733,32]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[508,32],[1234,32],[4351,32],[6442,32]]},"template:templates/docs/testing/setup-mirage":{"position":[[344,32],[729,32],[1306,32]]}},"keywords":{}}],["ember-cli-mirage/test-support/setup-mirag",{"_index":1352,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5115,45]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5115,45]]}},"keywords":{}}],["ember-cli-mirage@x.x.x",{"_index":1286,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[125,22],[173,22]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[125,22],[173,22]]}},"keywords":{}}],["ember-cli-packg",{"_index":1317,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3123,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3123,16]]}},"keywords":{}}],["ember-inflector",{"_index":30,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[271,18],[1010,18]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[271,18],[1010,18]]}},"keywords":{}}],["ember-qunit",{"_index":1215,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[4995,14]]},"template:docs/testing/acceptance-tests":{"position":[[688,14]]},"template:docs/testing/integration-and-unit-tests":{"position":[[465,14],[1191,14],[4308,14],[6399,14]]},"template:docs/testing/setup-mirage":{"position":[[301,14],[686,14],[1263,14]]},"template:templates/docs/getting-started/overview":{"position":[[4995,14]]},"template:templates/docs/testing/acceptance-tests":{"position":[[688,14]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[465,14],[1191,14],[4308,14],[6399,14]]},"template:templates/docs/testing/setup-mirage":{"position":[[301,14],[686,14],[1263,14]]}},"keywords":{}}],["ember-uuid",{"_index":229,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[817,13]]},"template:templates/docs/advanced/mocking-guids":{"position":[[817,13]]}},"keywords":{}}],["ember/runloop",{"_index":1744,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5486,17]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5486,17]]}},"keywords":{}}],["ember/str",{"_index":1124,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3424,16]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3424,16]]}},"keywords":{}}],["ember/test-help",{"_index":1735,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4414,22],[5443,22],[6505,22]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4414,22],[5443,22],[6505,22]]}},"keywords":{}}],["emberdataseri",{"_index":357,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4619,19],[4828,19]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[4,19],[803,19],[1166,19],[1568,19],[1597,19]]},"template:docs/data-layer/serializers/index":{"position":[[1654,19]]},"template:templates/docs/advanced/server-configuration":{"position":[[4619,19],[4828,19]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[4,19],[803,19],[1166,19],[1568,19],[1597,19]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1654,19]]}},"keywords":{"module:ember-cli-mirage/serializers/ember-data-serializer":{"position":[null]}}}],["emberdataserializer.extend",{"_index":1087,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1228,28],[1659,28]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1228,28],[1659,28]]}},"keywords":{}}],["embroid",{"_index":1162,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[231,9],[247,9]]},"template:templates/docs/getting-started/installation":{"position":[[231,9],[247,9]]}},"keywords":{}}],["embroider_rebuild_addon",{"_index":1165,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[450,24]]},"template:templates/docs/getting-started/installation":{"position":[[450,24]]}},"keywords":{}}],["embroider_rebuild_addons=ember-cli-mirag",{"_index":1166,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[607,41]]},"template:templates/docs/getting-started/installation":{"position":[[607,41]]}},"keywords":{}}],["empti",{"_index":528,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1342,5],[2424,6],[15600,5]]},"template:docs/getting-started/overview":{"position":[[2998,6]]},"template:templates/docs/data-layer/factories":{"position":[[1342,5],[2424,6],[15600,5]]},"template:templates/docs/getting-started/overview":{"position":[[2998,6]]}},"keywords":{}}],["enabl",{"_index":103,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[209,8],[228,7],[395,7],[463,6],[642,8],[782,8],[885,8]]},"template:docs/advanced/server-configuration":{"position":[[1485,7]]},"template:docs/data-layer/serializers/index":{"position":[[4074,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[591,7]]},"template:docs/testing/assertions":{"position":[[2485,6],[2531,8]]},"template:templates/docs/advanced/environment-options":{"position":[[209,8],[228,7],[395,7],[463,6],[642,8],[782,8],[885,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[1485,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4074,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[591,7]]},"template:templates/docs/testing/assertions":{"position":[[2485,6],[2531,8]]}},"keywords":{}}],["encount",{"_index":924,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[604,9]]},"template:templates/docs/data-layer/orm":{"position":[[604,9]]}},"keywords":{}}],["end",{"_index":674,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9675,3]]},"template:docs/data-layer/orm":{"position":[[1529,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[929,3]]},"template:docs/getting-started/what-is-mirage":{"position":[[554,5]]},"template:docs/testing/assertions":{"position":[[3026,3]]},"template:templates/docs/data-layer/factories":{"position":[[9675,3]]},"template:templates/docs/data-layer/orm":{"position":[[1529,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[929,3]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[554,5]]},"template:templates/docs/testing/assertions":{"position":[[3026,3]]}},"keywords":{}}],["endpoint",{"_index":1234,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5834,9],[8472,9]]},"template:docs/route-handlers/functions":{"position":[[7493,9]]},"template:templates/docs/getting-started/overview":{"position":[[5834,9],[8472,9]]},"template:templates/docs/route-handlers/functions":{"position":[[7493,9]]}},"keywords":{}}],["enforc",{"_index":644,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7853,7]]},"template:templates/docs/data-layer/factories":{"position":[[7853,7]]}},"keywords":{}}],["engin",{"_index":193,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2854,7]]},"template:templates/docs/advanced/environment-options":{"position":[[2854,7]]}},"keywords":{}}],["enough",{"_index":956,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2627,6],[7532,6],[8599,6]]},"template:docs/getting-started/overview":{"position":[[10794,6]]},"template:docs/route-handlers/functions":{"position":[[7553,7]]},"template:templates/docs/data-layer/orm":{"position":[[2627,6],[7532,6],[8599,6]]},"template:templates/docs/getting-started/overview":{"position":[[10794,6]]},"template:templates/docs/route-handlers/functions":{"position":[[7553,7]]}},"keywords":{}}],["ensur",{"_index":356,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4571,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[294,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[4571,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[294,6]]}},"keywords":{}}],["enter",{"_index":631,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7282,5]]},"template:templates/docs/data-layer/factories":{"position":[[7282,5]]}},"keywords":{}}],["entir",{"_index":724,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[14732,6]]},"template:docs/getting-started/overview":{"position":[[10097,6]]},"template:docs/route-handlers/functions":{"position":[[7097,6]]},"template:index":{"position":[[262,8]]},"template:templates/docs/data-layer/factories":{"position":[[14732,6]]},"template:templates/docs/getting-started/overview":{"position":[[10097,6]]},"template:templates/docs/route-handlers/functions":{"position":[[7097,6]]},"template:templates/index":{"position":[[262,8]]}},"keywords":{}}],["env",{"_index":115,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[435,3]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1224,3],[1356,3],[1427,4],[1537,3]]},"template:templates/docs/advanced/environment-options":{"position":[[435,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1224,3],[1356,3],[1427,4],[1537,3]]}},"keywords":{}}],["env.mirage_scenario",{"_index":436,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1771,19]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1771,19]]}},"keywords":{}}],["env['ember-cli-mirag",{"_index":98,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[47,23],[181,23],[614,23],[754,23],[2301,23],[2899,23]]},"template:docs/testing/assertions":{"position":[[2674,23]]},"template:templates/docs/advanced/environment-options":{"position":[[47,23],[181,23],[614,23],[754,23],[2301,23],[2899,23]]},"template:templates/docs/testing/assertions":{"position":[[2674,23]]}},"keywords":{}}],["environ",{"_index":94,"title":{"template:docs/advanced/environment-options":{"position":[[0,11]]},"template:templates/docs/advanced/environment-options":{"position":[[0,11]]}},"text":{"template:docs/advanced/environment-options":{"position":[[1,11],[148,12],[581,12],[720,12],[1542,13],[1669,11],[1711,11],[2806,11]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1028,12]]},"template:docs/data-layer/factories":{"position":[[14714,12]]},"template:docs/getting-started/installation":{"position":[[475,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1280,11]]},"template:docs/testing/acceptance-tests":{"position":[[1399,12]]},"template:docs/testing/assertions":{"position":[[2558,11],[2647,12]]},"template:templates/docs/advanced/environment-options":{"position":[[1,11],[148,12],[581,12],[720,12],[1542,13],[1669,11],[1711,11],[2806,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1028,12]]},"template:templates/docs/data-layer/factories":{"position":[[14714,12]]},"template:templates/docs/getting-started/installation":{"position":[[475,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1280,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1399,12]]},"template:templates/docs/testing/assertions":{"position":[[2558,11],[2647,12]]}},"keywords":{}}],["environment/config.j",{"_index":426,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1245,22]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1245,22]]}},"keywords":{}}],["episode9",{"_index":997,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7888,8]]},"template:templates/docs/data-layer/orm":{"position":[[7888,8]]}},"keywords":{}}],["episode9.upd",{"_index":999,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7968,17]]},"template:templates/docs/data-layer/orm":{"position":[[7968,17]]}},"keywords":{}}],["equip",{"_index":1503,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[255,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[255,8]]}},"keywords":{}}],["equival",{"_index":712,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13275,10]]},"template:docs/route-handlers/shorthands":{"position":[[1036,10],[1431,10],[1718,10],[2051,10],[2398,10],[3046,10],[3700,10],[3939,10]]},"template:templates/docs/data-layer/factories":{"position":[[13275,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1036,10],[1431,10],[1718,10],[2051,10],[2398,10],[3046,10],[3700,10],[3939,10]]}},"keywords":{}}],["error",{"_index":1272,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10138,5]]},"template:docs/route-handlers/functions":{"position":[[6757,7]]},"template:docs/testing/acceptance-tests":{"position":[[4063,6],[4118,6],[4189,5],[4288,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1399,5],[1479,7],[1593,5],[1613,7]]},"template:templates/docs/getting-started/overview":{"position":[[10138,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6757,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4063,6],[4118,6],[4189,5],[4288,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1399,5],[1479,7],[1593,5],[1613,7]]}},"keywords":{}}],["error(`id",{"_index":241,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[1175,9]]},"template:templates/docs/advanced/mocking-guids":{"position":[[1175,9]]}},"keywords":{}}],["es6",{"_index":1312,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2512,3]]},"template:docs/route-handlers/functions":{"position":[[5359,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2512,3]]},"template:templates/docs/route-handlers/functions":{"position":[[5359,3]]}},"keywords":{}}],["eslint-plugin-pretti",{"_index":1172,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[868,22]]},"template:templates/docs/getting-started/installation":{"position":[[868,22]]}},"keywords":{}}],["eslintignor",{"_index":1174,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[925,14]]},"template:templates/docs/getting-started/installation":{"position":[[925,14]]}},"keywords":{}}],["especi",{"_index":987,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7132,10]]},"template:templates/docs/data-layer/orm":{"position":[[7132,10]]}},"keywords":{}}],["etc",{"_index":1201,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3590,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14547,4],[16028,4]]},"template:templates/docs/getting-started/overview":{"position":[[3590,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14547,4],[16028,4]]}},"keywords":{}}],["even",{"_index":842,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3581,4]]},"template:docs/data-layer/orm":{"position":[[2420,4],[4835,4],[8308,4],[8577,4]]},"template:docs/data-layer/serializers/index":{"position":[[6703,4]]},"template:docs/getting-started/overview":{"position":[[10020,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4686,4],[8612,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[328,4]]},"template:docs/testing/acceptance-tests":{"position":[[5671,4]]},"template:docs/testing/assertions":{"position":[[242,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2971,4]]},"template:docs/testing/setup-mirage":{"position":[[1183,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[3581,4]]},"template:templates/docs/data-layer/orm":{"position":[[2420,4],[4835,4],[8308,4],[8577,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6703,4]]},"template:templates/docs/getting-started/overview":{"position":[[10020,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4686,4],[8612,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[328,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5671,4]]},"template:templates/docs/testing/assertions":{"position":[[242,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2971,4]]},"template:templates/docs/testing/setup-mirage":{"position":[[1183,4]]}},"keywords":{}}],["event",{"_index":298,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1986,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[1986,5]]}},"keywords":{}}],["eventu",{"_index":326,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2845,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17614,11]]},"template:templates/docs/advanced/server-configuration":{"position":[[2845,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17614,11]]}},"keywords":{}}],["everyon",{"_index":1383,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8268,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8268,8]]}},"keywords":{}}],["everyth",{"_index":279,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1272,10]]},"template:docs/data-layer/factories":{"position":[[10581,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[15595,10],[18682,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1272,10]]},"template:templates/docs/data-layer/factories":{"position":[[10581,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15595,10],[18682,10]]}},"keywords":{}}],["exactli",{"_index":264,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[619,7],[1261,7]]},"template:docs/data-layer/factories":{"position":[[2165,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1994,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[619,7],[1261,7]]},"template:templates/docs/data-layer/factories":{"position":[[2165,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1994,7]]}},"keywords":{}}],["exampl",{"_index":24,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[148,8],[413,8],[560,8]]},"template:docs/advanced/environment-options":{"position":[[451,8],[2213,8],[2823,8]]},"template:docs/advanced/mocking-guids":{"position":[[722,7]]},"template:docs/advanced/server-configuration":{"position":[[702,8],[2766,8],[2983,7],[3344,7],[4861,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[787,8],[1045,8]]},"template:docs/data-layer/database":{"position":[[658,8]]},"template:docs/data-layer/factories":{"position":[[121,8],[5956,7],[8300,7],[9988,8],[13788,8]]},"template:docs/data-layer/models":{"position":[[1989,8],[2505,8]]},"template:docs/data-layer/orm":{"position":[[2968,8],[6365,7]]},"template:docs/data-layer/relationships":{"position":[[2630,8],[3021,8],[3653,8],[4526,8]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1522,7]]},"template:docs/data-layer/serializers/index":{"position":[[892,7],[3174,8],[3770,8]]},"template:docs/getting-started/overview":{"position":[[312,7],[7662,8],[9346,8],[10389,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9478,8],[12791,8]]},"template:docs/route-handlers/functions":{"position":[[184,8],[2194,8],[2400,7],[4133,8],[4996,7],[5714,8],[5804,8]]},"template:docs/route-handlers/shorthands":{"position":[[231,8],[742,8],[1907,8]]},"template:docs/testing/acceptance-tests":{"position":[[95,8],[2076,7],[3921,7]]},"template:docs/testing/assertions":{"position":[[971,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1928,8]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[148,8],[413,8],[560,8]]},"template:templates/docs/advanced/environment-options":{"position":[[451,8],[2213,8],[2823,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[722,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[702,8],[2766,8],[2983,7],[3344,7],[4861,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[787,8],[1045,8]]},"template:templates/docs/data-layer/database":{"position":[[658,8]]},"template:templates/docs/data-layer/factories":{"position":[[121,8],[5956,7],[8300,7],[9988,8],[13788,8]]},"template:templates/docs/data-layer/models":{"position":[[1989,8],[2505,8]]},"template:templates/docs/data-layer/orm":{"position":[[2968,8],[6365,7]]},"template:templates/docs/data-layer/relationships":{"position":[[2630,8],[3021,8],[3653,8],[4526,8]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1522,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[892,7],[3174,8],[3770,8]]},"template:templates/docs/getting-started/overview":{"position":[[312,7],[7662,8],[9346,8],[10389,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9478,8],[12791,8]]},"template:templates/docs/route-handlers/functions":{"position":[[184,8],[2194,8],[2400,7],[4133,8],[4996,7],[5714,8],[5804,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[231,8],[742,8],[1907,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[95,8],[2076,7],[3921,7]]},"template:templates/docs/testing/assertions":{"position":[[971,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1928,8]]}},"keywords":{}}],["except",{"_index":725,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[14764,6]]},"template:docs/getting-started/overview":{"position":[[5878,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[18215,9]]},"template:docs/route-handlers/shorthands":{"position":[[4822,6],[4865,7],[5503,6]]},"template:templates/docs/data-layer/factories":{"position":[[14764,6]]},"template:templates/docs/getting-started/overview":{"position":[[5878,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18215,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4822,6],[4865,7],[5503,6]]}},"keywords":{}}],["exclud",{"_index":162,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1751,7]]},"template:templates/docs/advanced/environment-options":{"position":[[1751,7]]}},"keywords":{}}],["excludefilesfrombuild",{"_index":149,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1417,21],[1813,21]]},"template:templates/docs/advanced/environment-options":{"position":[[1417,21],[1813,21]]}},"keywords":{}}],["exist",{"_index":272,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1042,5]]},"template:docs/data-layer/models":{"position":[[464,5],[585,5]]},"template:docs/data-layer/relationships":{"position":[[5011,5]]},"template:docs/data-layer/serializers/index":{"position":[[1089,5]]},"template:docs/getting-started/overview":{"position":[[7810,6],[10049,8],[10408,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[43,8],[13034,8],[17079,7]]},"template:docs/testing/acceptance-tests":{"position":[[304,5],[2166,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3123,5]]},"template:not-found":{"position":[[29,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[1042,5]]},"template:templates/docs/data-layer/models":{"position":[[464,5],[585,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5011,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1089,5]]},"template:templates/docs/getting-started/overview":{"position":[[7810,6],[10049,8],[10408,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[43,8],[13034,8],[17079,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[304,5],[2166,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3123,5]]},"template:templates/not-found":{"position":[[29,6]]}},"keywords":{}}],["expect",{"_index":661,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[8865,7]]},"template:docs/data-layer/fixtures":{"position":[[4246,9]]},"template:docs/data-layer/orm":{"position":[[708,7],[2176,8],[4544,7]]},"template:docs/data-layer/serializers/index":{"position":[[1027,8],[3201,7],[3907,6],[4603,7]]},"template:docs/getting-started/installation":{"position":[[989,6],[1461,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6597,6]]},"template:docs/testing/assertions":{"position":[[211,6],[953,7],[1508,7],[2214,9]]},"template:templates/docs/data-layer/factories":{"position":[[8865,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[4246,9]]},"template:templates/docs/data-layer/orm":{"position":[[708,7],[2176,8],[4544,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1027,8],[3201,7],[3907,6],[4603,7]]},"template:templates/docs/getting-started/installation":{"position":[[989,6],[1461,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6597,6]]},"template:templates/docs/testing/assertions":{"position":[[211,6],[953,7],[1508,7],[2214,9]]}},"keywords":{}}],["experi",{"_index":1106,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1291,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1291,10]]}},"keywords":{}}],["expires=${cookieexpiration.toutcstr",{"_index":390,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[591,44]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[591,44]]}},"keywords":{}}],["explicilti",{"_index":161,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1740,10]]},"template:templates/docs/advanced/environment-options":{"position":[[1740,10]]}},"keywords":{}}],["explicit",{"_index":714,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13671,8]]},"template:docs/data-layer/relationships":{"position":[[3548,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13066,9]]},"template:templates/docs/data-layer/factories":{"position":[[13671,8]]},"template:templates/docs/data-layer/relationships":{"position":[[3548,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13066,9]]}},"keywords":{}}],["explicitli",{"_index":276,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1134,10]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[107,10]]},"template:docs/getting-started/installation":{"position":[[436,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1134,10]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[107,10]]},"template:templates/docs/getting-started/installation":{"position":[[436,10]]}},"keywords":{}}],["export",{"_index":67,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1029,6],[1213,6]]},"template:docs/advanced/environment-options":{"position":[[1048,6]]},"template:docs/advanced/mocking-guids":{"position":[[831,6]]},"template:docs/advanced/server-configuration":{"position":[[254,6],[765,6],[849,6],[916,6],[3111,6],[3489,6],[5075,6]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1805,6],[2020,6],[2047,6]]},"template:docs/data-layer/database":{"position":[[748,6]]},"template:docs/data-layer/factories":{"position":[[883,6],[1092,6],[1583,6],[2363,6],[2527,6],[2853,6],[3508,6],[5452,6],[7612,6],[7671,6],[7904,6],[9334,6],[10128,6],[10737,6],[11582,6],[12385,6],[12651,6],[12913,6],[13159,6],[13592,6],[13905,6],[13983,9],[14176,6],[14498,6]]},"template:docs/data-layer/fixtures":{"position":[[390,6],[868,6],[1948,6],[2216,6],[2883,6],[2942,6],[3972,6],[4055,6],[4333,6],[4411,6],[4577,6],[4678,6]]},"template:docs/data-layer/models":{"position":[[946,6],[1310,6],[1681,6]]},"template:docs/data-layer/orm":{"position":[[3291,6],[4442,6],[5052,6],[5224,6]]},"template:docs/data-layer/relationships":{"position":[[634,6],[1935,6],[2731,6],[3083,6],[3151,6],[3710,6],[3781,6],[4100,6],[4171,6],[4672,6],[4779,6],[4858,6],[5528,6],[5622,6],[5679,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1213,6],[1644,6]]},"template:docs/data-layer/serializers/index":{"position":[[2193,9],[2330,6],[2787,6],[3441,6],[4134,6],[4778,6]]},"template:docs/getting-started/overview":{"position":[[2048,6],[3505,6],[4274,6],[6129,6],[6263,6],[8242,6],[8589,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[577,8],[786,8],[1023,6],[1230,6],[5021,6],[11000,6],[11679,6],[11790,6],[12254,6],[12383,6],[15681,6],[15834,6],[16610,6]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[73,9]]},"template:docs/route-handlers/functions":{"position":[[1263,6],[6516,6]]},"template:docs/testing/acceptance-tests":{"position":[[2537,6],[5281,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5504,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1029,6],[1213,6]]},"template:templates/docs/advanced/environment-options":{"position":[[1048,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[831,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[254,6],[765,6],[849,6],[916,6],[3111,6],[3489,6],[5075,6]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1805,6],[2020,6],[2047,6]]},"template:templates/docs/data-layer/database":{"position":[[748,6]]},"template:templates/docs/data-layer/factories":{"position":[[883,6],[1092,6],[1583,6],[2363,6],[2527,6],[2853,6],[3508,6],[5452,6],[7612,6],[7671,6],[7904,6],[9334,6],[10128,6],[10737,6],[11582,6],[12385,6],[12651,6],[12913,6],[13159,6],[13592,6],[13905,6],[13983,9],[14176,6],[14498,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[390,6],[868,6],[1948,6],[2216,6],[2883,6],[2942,6],[3972,6],[4055,6],[4333,6],[4411,6],[4577,6],[4678,6]]},"template:templates/docs/data-layer/models":{"position":[[946,6],[1310,6],[1681,6]]},"template:templates/docs/data-layer/orm":{"position":[[3291,6],[4442,6],[5052,6],[5224,6]]},"template:templates/docs/data-layer/relationships":{"position":[[634,6],[1935,6],[2731,6],[3083,6],[3151,6],[3710,6],[3781,6],[4100,6],[4171,6],[4672,6],[4779,6],[4858,6],[5528,6],[5622,6],[5679,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1213,6],[1644,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2193,9],[2330,6],[2787,6],[3441,6],[4134,6],[4778,6]]},"template:templates/docs/getting-started/overview":{"position":[[2048,6],[3505,6],[4274,6],[6129,6],[6263,6],[8242,6],[8589,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[577,8],[786,8],[1023,6],[1230,6],[5021,6],[11000,6],[11679,6],[11790,6],[12254,6],[12383,6],[15681,6],[15834,6],[16610,6]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[73,9]]},"template:templates/docs/route-handlers/functions":{"position":[[1263,6],[6516,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2537,6],[5281,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5504,6]]}},"keywords":{}}],["expos",{"_index":1169,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[711,7]]},"template:templates/docs/getting-started/installation":{"position":[[711,7]]}},"keywords":{}}],["extend",{"_index":355,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4520,6],[4606,7],[4821,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[24,7],[1553,9]]},"template:docs/data-layer/serializers/index":{"position":[[2899,9]]},"template:docs/getting-started/overview":{"position":[[8087,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[4520,6],[4606,7],[4821,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[24,7],[1553,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2899,9]]},"template:templates/docs/getting-started/overview":{"position":[[8087,6]]}},"keywords":{}}],["extern",{"_index":337,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3370,8]]},"template:docs/route-handlers/functions":{"position":[[6802,8],[7122,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[3370,8]]},"template:templates/docs/route-handlers/functions":{"position":[[6802,8],[7122,8]]}},"keywords":{}}],["externalag",{"_index":1091,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1782,15]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1782,15]]}},"keywords":{}}],["externalnam",{"_index":1089,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1708,15]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1708,15]]}},"keywords":{}}],["extra",{"_index":1648,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3941,5]]},"template:docs/testing/assertions":{"position":[[1442,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3941,5]]},"template:templates/docs/testing/assertions":{"position":[[1442,5]]}},"keywords":{}}],["extract",{"_index":1292,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[658,9]]},"template:docs/route-handlers/functions":{"position":[[4734,10],[4913,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[658,9]]},"template:templates/docs/route-handlers/functions":{"position":[[4734,10],[4913,10]]}},"keywords":{}}],["facilit",{"_index":413,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[727,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[727,10]]}},"keywords":{}}],["fact",{"_index":983,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[6075,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8894,5]]},"template:templates/docs/data-layer/orm":{"position":[[6075,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8894,5]]}},"keywords":{}}],["factori",{"_index":495,"title":{"template:docs/data-layer/factories":{"position":[[0,9]]},"template:templates/docs/data-layer/factories":{"position":[[0,9]]}},"text":{"template:docs/data-layer/factories":{"position":[[1,9],[422,9],[614,9],[635,7],[1270,7],[2178,9],[2216,7],[2336,7],[2413,7],[2500,7],[2645,8],[2826,7],[2972,7],[3131,7],[3393,8],[3440,7],[4267,9],[4370,9],[4514,7],[4654,8],[4686,7],[5013,7],[5384,7],[5641,7],[6212,10],[6613,9],[8201,9],[9858,9],[9975,8],[10048,8],[10094,8],[10322,8],[10703,8],[11548,8],[11944,10],[12358,7],[12611,8],[12763,7],[12866,8],[13066,8],[13112,8],[13403,9],[13440,9],[15733,7],[15803,7]]},"template:docs/data-layer/fixtures":{"position":[[118,9],[2358,10],[5252,9]]},"template:docs/data-layer/models":{"position":[[1629,9],[1853,9]]},"template:docs/data-layer/relationships":{"position":[[6259,10]]},"template:docs/getting-started/overview":{"position":[[3061,10],[3072,9],[3231,7],[3332,8],[3478,7],[3725,7],[4077,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2079,7],[3182,8],[3227,7],[12868,9],[14786,7],[15054,7],[15656,9],[16226,7],[16771,9],[16831,9],[16907,7],[17091,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1518,9],[1910,7],[1923,9]]},"template:docs/testing/acceptance-tests":{"position":[[1640,9],[1968,9],[2456,7],[2510,7],[2784,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2484,9],[3924,7]]},"template:index":{"position":[[103,9]]},"template:templates/docs/data-layer/factories":{"position":[[1,9],[422,9],[614,9],[635,7],[1270,7],[2178,9],[2216,7],[2336,7],[2413,7],[2500,7],[2645,8],[2826,7],[2972,7],[3131,7],[3393,8],[3440,7],[4267,9],[4370,9],[4514,7],[4654,8],[4686,7],[5013,7],[5384,7],[5641,7],[6212,10],[6613,9],[8201,9],[9858,9],[9975,8],[10048,8],[10094,8],[10322,8],[10703,8],[11548,8],[11944,10],[12358,7],[12611,8],[12763,7],[12866,8],[13066,8],[13112,8],[13403,9],[13440,9],[15733,7],[15803,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[118,9],[2358,10],[5252,9]]},"template:templates/docs/data-layer/models":{"position":[[1629,9],[1853,9]]},"template:templates/docs/data-layer/relationships":{"position":[[6259,10]]},"template:templates/docs/getting-started/overview":{"position":[[3061,10],[3072,9],[3231,7],[3332,8],[3478,7],[3725,7],[4077,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2079,7],[3182,8],[3227,7],[12868,9],[14786,7],[15054,7],[15656,9],[16226,7],[16771,9],[16831,9],[16907,7],[17091,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1518,9],[1910,7],[1923,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1640,9],[1968,9],[2456,7],[2510,7],[2784,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2484,9],[3924,7]]},"template:templates/index":{"position":[[103,9]]}},"keywords":{}}],["factory'",{"_index":632,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7368,9]]},"template:templates/docs/data-layer/factories":{"position":[[7368,9]]}},"keywords":{}}],["factory.extend",{"_index":549,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2378,16],[2542,16],[2868,16],[3523,16],[5467,16],[7919,16],[9349,16],[10143,16],[10752,16],[11597,16],[12400,16],[12666,16],[12928,16],[13174,16]]},"template:docs/getting-started/overview":{"position":[[3520,16]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[15696,16],[15849,16]]},"template:docs/testing/acceptance-tests":{"position":[[2552,16]]},"template:templates/docs/data-layer/factories":{"position":[[2378,16],[2542,16],[2868,16],[3523,16],[5467,16],[7919,16],[9349,16],[10143,16],[10752,16],[11597,16],[12400,16],[12666,16],[12928,16],[13174,16]]},"template:templates/docs/getting-started/overview":{"position":[[3520,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15696,16],[15849,16]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2552,16]]}},"keywords":{}}],["factory/fixtur",{"_index":1489,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[17520,15]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17520,15]]}},"keywords":{}}],["factory/fixture/serializer/model",{"_index":271,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[996,32]]},"template:templates/docs/advanced/server-configuration":{"position":[[996,32]]}},"keywords":{}}],["fail",{"_index":1653,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4215,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4215,7]]}},"keywords":{}}],["faith",{"_index":1412,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11326,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11326,8]]}},"keywords":{}}],["fake",{"_index":873,"title":{},"text":{"template:docs/data-layer/models":{"position":[[652,4]]},"template:docs/getting-started/overview":{"position":[[3040,4],[5827,6],[8465,6],[10087,4],[10700,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14896,6]]},"template:templates/docs/data-layer/models":{"position":[[652,4]]},"template:templates/docs/getting-started/overview":{"position":[[3040,4],[5827,6],[8465,6],[10087,4],[10700,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14896,6]]}},"keywords":{}}],["faker",{"_index":560,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3476,5],[5420,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2184,5],[2279,5],[2664,5],[3046,5],[3080,5],[3108,5],[3164,6],[3191,5],[3263,5],[3274,8],[3413,6],[3828,6],[4628,6]]},"template:templates/docs/data-layer/factories":{"position":[[3476,5],[5420,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2184,5],[2279,5],[2664,5],[3046,5],[3080,5],[3108,5],[3164,6],[3191,5],[3263,5],[3274,8],[3413,6],[3828,6],[4628,6]]}},"keywords":{}}],["faker-js/fak",{"_index":561,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3489,18],[5433,18]]},"template:templates/docs/data-layer/factories":{"position":[[3489,18],[5433,18]]}},"keywords":{}}],["faker.date.past().tolocaledatestr",{"_index":562,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3598,39]]},"template:templates/docs/data-layer/factories":{"position":[[3598,39]]}},"keywords":{}}],["faker.j",{"_index":570,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3763,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1666,8],[2022,9],[2807,8],[3006,8]]},"template:templates/docs/data-layer/factories":{"position":[[3763,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1666,8],[2022,9],[2807,8],[3006,8]]}},"keywords":{}}],["faker.list.cycl",{"_index":1329,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3646,16],[4122,17],[4201,18]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3646,16],[4122,17],[4201,18]]}},"keywords":{}}],["faker.list.random",{"_index":1328,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3627,18],[3884,18],[3957,19]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3627,18],[3884,18],[3957,19]]}},"keywords":{}}],["faker.name.findnam",{"_index":592,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5500,22]]},"template:templates/docs/data-layer/factories":{"position":[[5500,22]]}},"keywords":{}}],["faker.name.firstnam",{"_index":1473,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15735,23],[15783,23],[15887,23],[15934,23]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15735,23],[15783,23],[15887,23],[15934,23]]}},"keywords":{}}],["faker.random.arrayel",{"_index":1333,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3907,26],[4037,27]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3907,26],[4037,27]]}},"keywords":{}}],["faker.random.numb",{"_index":1341,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4422,19],[4529,21]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4422,19],[4529,21]]}},"keywords":{}}],["faker.random.number.rang",{"_index":1330,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3667,25],[4391,26]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3667,25],[4391,26]]}},"keywords":{}}],["faker.random.number.range(18",{"_index":1342,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4485,29]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4485,29]]}},"keywords":{}}],["fall",{"_index":1152,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[6007,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6007,4]]}},"keywords":{}}],["fals",{"_index":114,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[421,5],[791,5],[1041,6],[1451,6],[2681,6],[2952,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10800,5]]},"template:templates/docs/advanced/environment-options":{"position":[[421,5],[791,5],[1041,6],[1451,6],[2681,6],[2952,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10800,5]]}},"keywords":{}}],["far",{"_index":655,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[8607,4]]},"template:docs/getting-started/overview":{"position":[[7315,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10419,3]]},"template:templates/docs/data-layer/factories":{"position":[[8607,4]]},"template:templates/docs/getting-started/overview":{"position":[[7315,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10419,3]]}},"keywords":{}}],["fast",{"_index":948,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1906,5]]},"template:docs/route-handlers/functions":{"position":[[1119,6]]},"template:templates/docs/data-layer/orm":{"position":[[1906,5]]},"template:templates/docs/route-handlers/functions":{"position":[[1119,6]]}},"keywords":{}}],["fastboot",{"_index":1176,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[964,8],[1042,8],[1161,9],[1171,8],[1282,8],[1343,8]]},"template:templates/docs/getting-started/installation":{"position":[[964,8],[1042,8],[1161,9],[1171,8],[1282,8],[1343,8]]}},"keywords":{}}],["fastboot_disabled=tru",{"_index":1183,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1387,22]]},"template:templates/docs/getting-started/installation":{"position":[[1387,22]]}},"keywords":{}}],["fat",{"_index":1145,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5659,3]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5659,3]]}},"keywords":{}}],["featur",{"_index":128,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[874,7],[1246,7]]},"template:docs/advanced/server-configuration":{"position":[[1449,7]]},"template:docs/data-layer/database":{"position":[[334,8]]},"template:docs/data-layer/factories":{"position":[[156,7],[9847,7],[11925,8],[14645,7]]},"template:docs/getting-started/installation":{"position":[[1210,7]]},"template:docs/getting-started/overview":{"position":[[10456,8],[10657,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2285,8],[8023,7],[8164,7],[17124,7]]},"template:docs/testing/assertions":{"position":[[2520,7],[2734,7]]},"template:templates/docs/advanced/environment-options":{"position":[[874,7],[1246,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[1449,7]]},"template:templates/docs/data-layer/database":{"position":[[334,8]]},"template:templates/docs/data-layer/factories":{"position":[[156,7],[9847,7],[11925,8],[14645,7]]},"template:templates/docs/getting-started/installation":{"position":[[1210,7]]},"template:templates/docs/getting-started/overview":{"position":[[10456,8],[10657,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2285,8],[8023,7],[8164,7],[17124,7]]},"template:templates/docs/testing/assertions":{"position":[[2520,7],[2734,7]]}},"keywords":{}}],["fetch",{"_index":221,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[527,6],[937,7]]},"template:docs/data-layer/orm":{"position":[[4892,8],[5473,5]]},"template:docs/data-layer/relationships":{"position":[[1615,5]]},"template:docs/data-layer/serializers/index":{"position":[[4545,5],[4628,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9379,5],[9779,5],[10459,8]]},"template:docs/route-handlers/shorthands":{"position":[[1249,8],[1540,8],[1871,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[666,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[527,6],[937,7]]},"template:templates/docs/data-layer/orm":{"position":[[4892,8],[5473,5]]},"template:templates/docs/data-layer/relationships":{"position":[[1615,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4545,5],[4628,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9379,5],[9779,5],[10459,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1249,8],[1540,8],[1871,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[666,5]]}},"keywords":{}}],["few",{"_index":934,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1333,3]]},"template:docs/getting-started/overview":{"position":[[900,3],[8016,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1489,3],[1610,3],[2110,3]]},"template:docs/route-handlers/shorthands":{"position":[[6003,3]]},"template:templates/docs/data-layer/orm":{"position":[[1333,3]]},"template:templates/docs/getting-started/overview":{"position":[[900,3],[8016,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1489,3],[1610,3],[2110,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[6003,3]]}},"keywords":{}}],["fewer",{"_index":1593,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[7589,5]]},"template:templates/docs/route-handlers/functions":{"position":[[7589,5]]}},"keywords":{}}],["field",{"_index":474,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1238,6]]},"template:docs/data-layer/models":{"position":[[2713,6]]},"template:templates/docs/data-layer/database":{"position":[[1238,6]]},"template:templates/docs/data-layer/models":{"position":[[2713,6]]}},"keywords":{}}],["file",{"_index":101,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[110,5],[1479,5],[1768,5]]},"template:docs/advanced/server-configuration":{"position":[[223,4],[2470,5]]},"template:docs/advanced/switching-between-scenarios":{"position":[[112,5],[139,4],[559,4],[984,4],[1098,4],[1500,5],[2009,5]]},"template:docs/data-layer/factories":{"position":[[746,4],[1055,5],[2292,5],[13555,5],[13820,4],[14037,4],[14801,5]]},"template:docs/data-layer/fixtures":{"position":[[48,5],[654,4],[830,5],[1808,4],[1911,5],[2083,5],[2102,5],[3894,6],[3906,5],[5185,5]]},"template:docs/data-layer/models":{"position":[[383,5],[855,4]]},"template:docs/data-layer/orm":{"position":[[5391,5]]},"template:docs/data-layer/serializers/index":{"position":[[2731,4]]},"template:docs/getting-started/overview":{"position":[[14,4],[1774,5],[1982,5],[4237,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[416,5],[549,4],[4996,4],[12680,6],[13751,5],[14233,4],[16247,4],[16558,4],[16655,4],[16926,5],[17536,4]]},"template:docs/testing/acceptance-tests":{"position":[[645,5],[4678,4],[4784,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1073,5]]},"template:docs/testing/setup-mirage":{"position":[[1140,4]]},"template:templates/docs/advanced/environment-options":{"position":[[110,5],[1479,5],[1768,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[223,4],[2470,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[112,5],[139,4],[559,4],[984,4],[1098,4],[1500,5],[2009,5]]},"template:templates/docs/data-layer/factories":{"position":[[746,4],[1055,5],[2292,5],[13555,5],[13820,4],[14037,4],[14801,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[48,5],[654,4],[830,5],[1808,4],[1911,5],[2083,5],[2102,5],[3894,6],[3906,5],[5185,5]]},"template:templates/docs/data-layer/models":{"position":[[383,5],[855,4]]},"template:templates/docs/data-layer/orm":{"position":[[5391,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2731,4]]},"template:templates/docs/getting-started/overview":{"position":[[14,4],[1774,5],[1982,5],[4237,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[416,5],[549,4],[4996,4],[12680,6],[13751,5],[14233,4],[16247,4],[16558,4],[16655,4],[16926,5],[17536,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[645,5],[4678,4],[4784,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1073,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[1140,4]]}},"keywords":{}}],["file-bas",{"_index":781,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[315,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[315,10]]}},"keywords":{}}],["filenam",{"_index":790,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[723,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14037,9],[14122,10],[14427,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[723,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14037,9],[14122,10],[14427,10]]}},"keywords":{}}],["fillin",{"_index":1734,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4400,6],[6491,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4400,6],[6491,6]]}},"keywords":{}}],["fillin('.titl",{"_index":488,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1691,16]]},"template:templates/docs/data-layer/database":{"position":[[1691,16]]}},"keywords":{}}],["fillin('input",{"_index":1659,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4387,15]]},"template:docs/testing/assertions":{"position":[[1149,15]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2286,15],[2854,15],[4937,15],[7126,15]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4387,15]]},"template:templates/docs/testing/assertions":{"position":[[1149,15]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2286,15],[2854,15],[4937,15],[7126,15]]}},"keywords":{}}],["filter",{"_index":1695,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3056,6]]},"template:templates/docs/testing/assertions":{"position":[[3056,6]]}},"keywords":{}}],["filter(key",{"_index":942,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1757,11]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5646,11]]},"template:templates/docs/data-layer/orm":{"position":[[1757,11]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5646,11]]}},"keywords":{}}],["filter[genr",{"_index":1701,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3521,16]]},"template:templates/docs/testing/assertions":{"position":[[3521,16]]}},"keywords":{}}],["final",{"_index":304,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2181,8]]},"template:docs/data-layer/factories":{"position":[[15492,7]]},"template:docs/data-layer/serializers/index":{"position":[[5502,5],[6578,7]]},"template:docs/route-handlers/functions":{"position":[[3467,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[2181,8]]},"template:templates/docs/data-layer/factories":{"position":[[15492,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5502,5],[6578,7]]},"template:templates/docs/route-handlers/functions":{"position":[[3467,5]]}},"keywords":{}}],["finalconfig",{"_index":135,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1086,11]]},"template:docs/advanced/server-configuration":{"position":[[3149,11],[3527,11],[5116,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1062,11]]},"template:docs/testing/setup-mirage":{"position":[[1482,11]]},"template:templates/docs/advanced/environment-options":{"position":[[1086,11]]},"template:templates/docs/advanced/server-configuration":{"position":[[3149,11],[3527,11],[5116,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1062,11]]},"template:templates/docs/testing/setup-mirage":{"position":[[1482,11]]}},"keywords":{}}],["find",{"_index":18,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[67,4]]},"template:docs/advanced/switching-between-scenarios":{"position":[[94,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13087,4],[15379,4],[16100,4]]},"template:docs/route-handlers/shorthands":{"position":[[1311,5],[1601,5],[2284,5],[2927,5],[3583,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4177,4],[4638,4],[6810,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[67,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[94,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13087,4],[15379,4],[16100,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1311,5],[1601,5],[2284,5],[2927,5],[3583,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4177,4],[4638,4],[6810,4]]}},"keywords":{}}],["findal",{"_index":1732,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4103,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4103,7]]}},"keywords":{}}],["findrecord",{"_index":1709,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[575,12],[781,11],[857,13],[1301,12],[1542,11],[1646,13],[4088,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[575,12],[781,11],[857,13],[1301,12],[1542,11],[1646,13],[4088,10]]}},"keywords":{}}],["fine",{"_index":629,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7164,5]]},"template:templates/docs/data-layer/factories":{"position":[[7164,5]]}},"keywords":{}}],["first",{"_index":516,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[629,5],[1235,5],[8020,5],[9156,5],[11301,5],[16456,5],[16560,5],[17035,5],[17139,5]]},"template:docs/data-layer/orm":{"position":[[583,5]]},"template:docs/data-layer/serializers/index":{"position":[[668,5],[5953,5]]},"template:docs/getting-started/overview":{"position":[[1508,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1691,5],[17118,5],[17913,5]]},"template:docs/route-handlers/functions":{"position":[[424,5],[1878,5],[5893,5]]},"template:docs/testing/acceptance-tests":{"position":[[881,5]]},"template:docs/testing/assertions":{"position":[[1087,5],[2479,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4115,5]]},"template:docs/testing/setup-mirage":{"position":[[490,5],[979,5],[1871,5]]},"template:templates/docs/data-layer/factories":{"position":[[629,5],[1235,5],[8020,5],[9156,5],[11301,5],[16456,5],[16560,5],[17035,5],[17139,5]]},"template:templates/docs/data-layer/orm":{"position":[[583,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[668,5],[5953,5]]},"template:templates/docs/getting-started/overview":{"position":[[1508,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1691,5],[17118,5],[17913,5]]},"template:templates/docs/route-handlers/functions":{"position":[[424,5],[1878,5],[5893,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[881,5]]},"template:templates/docs/testing/assertions":{"position":[[1087,5],[2479,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4115,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[490,5],[979,5],[1871,5]]}},"keywords":{}}],["first-class",{"_index":407,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[454,11]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3968,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[454,11]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3968,11]]}},"keywords":{}}],["first-nam",{"_index":1550,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[4250,13]]},"template:templates/docs/route-handlers/functions":{"position":[[4250,13]]}},"keywords":{}}],["first_nam",{"_index":1462,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15076,12],[15713,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15076,12],[15713,12]]}},"keywords":{}}],["firstnam",{"_index":1475,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15866,11]]},"template:docs/route-handlers/functions":{"position":[[4545,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15866,11]]},"template:templates/docs/route-handlers/functions":{"position":[[4545,10]]}},"keywords":{}}],["fit",{"_index":1515,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1752,3]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1752,3]]}},"keywords":{}}],["five",{"_index":556,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3069,4]]},"template:templates/docs/data-layer/factories":{"position":[[3069,4]]}},"keywords":{}}],["fix",{"_index":664,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9108,3]]},"template:docs/getting-started/installation":{"position":[[770,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2898,3],[9950,3]]},"template:templates/docs/data-layer/factories":{"position":[[9108,3]]},"template:templates/docs/getting-started/installation":{"position":[[770,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2898,3],[9950,3]]}},"keywords":{}}],["fixtur",{"_index":323,"title":{"template:docs/data-layer/fixtures":{"position":[[0,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[0,8]]}},"text":{"template:docs/advanced/server-configuration":{"position":[[2745,9]]},"template:docs/data-layer/factories":{"position":[[17606,8]]},"template:docs/data-layer/fixtures":{"position":[[1,8],[40,7],[243,7],[269,8],[596,9],[646,7],[715,7],[822,7],[1800,7],[2027,8],[2154,7],[2332,8],[2369,8],[2428,7],[2733,8],[3886,7],[4151,8],[5177,7],[5301,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12672,7],[16239,7],[16785,8],[16845,8],[16918,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1532,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2745,9]]},"template:templates/docs/data-layer/factories":{"position":[[17606,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[1,8],[40,7],[243,7],[269,8],[596,9],[646,7],[715,7],[822,7],[1800,7],[2027,8],[2154,7],[2332,8],[2369,8],[2428,7],[2733,8],[3886,7],[4151,8],[5177,7],[5301,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12672,7],[16239,7],[16785,8],[16845,8],[16918,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1532,8]]}},"keywords":{}}],["fixtures/blog_posts.j",{"_index":1450,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14238,23]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14238,23]]}},"keywords":{}}],["flat",{"_index":775,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[35,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[35,4]]}},"keywords":{}}],["flexib",{"_index":1452,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14308,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14308,8]]}},"keywords":{}}],["flexibl",{"_index":1520,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[42,8],[7440,9]]},"template:templates/docs/route-handlers/functions":{"position":[[42,8],[7440,9]]}},"keywords":{}}],["flip",{"_index":508,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[356,8]]},"template:templates/docs/data-layer/factories":{"position":[[356,8]]}},"keywords":{}}],["focus",{"_index":767,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17315,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[774,7]]},"template:docs/testing/acceptance-tests":{"position":[[1960,7]]},"template:templates/docs/data-layer/factories":{"position":[[17315,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[774,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1960,7]]}},"keywords":{}}],["folder",{"_index":1009,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[343,7]]},"template:docs/getting-started/installation":{"position":[[330,6]]},"template:templates/docs/data-layer/relationships":{"position":[[343,7]]},"template:templates/docs/getting-started/installation":{"position":[[330,6]]}},"keywords":{}}],["follow",{"_index":84,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1410,6]]},"template:docs/data-layer/fixtures":{"position":[[348,10]]},"template:docs/data-layer/orm":{"position":[[5527,9]]},"template:docs/data-layer/relationships":{"position":[[3045,9],[3681,9]]},"template:docs/data-layer/serializers/index":{"position":[[915,7],[2843,7]]},"template:docs/getting-started/installation":{"position":[[596,10],[912,9]]},"template:docs/getting-started/overview":{"position":[[146,9],[1972,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[87,10],[698,6],[11582,9],[14382,6],[14835,8]]},"template:docs/testing/acceptance-tests":{"position":[[4035,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5292,9]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1410,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[348,10]]},"template:templates/docs/data-layer/orm":{"position":[[5527,9]]},"template:templates/docs/data-layer/relationships":{"position":[[3045,9],[3681,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[915,7],[2843,7]]},"template:templates/docs/getting-started/installation":{"position":[[596,10],[912,9]]},"template:templates/docs/getting-started/overview":{"position":[[146,9],[1972,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[87,10],[698,6],[11582,9],[14382,6],[14835,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4035,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5292,9]]}},"keywords":{}}],["foo",{"_index":1063,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5200,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5200,5]]}},"keywords":{}}],["forbid",{"_index":371,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[118,7]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[118,7]]}},"keywords":{}}],["foreach(key",{"_index":943,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1787,12]]},"template:templates/docs/data-layer/orm":{"position":[[1787,12]]}},"keywords":{}}],["foreach(post",{"_index":619,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6761,15]]},"template:templates/docs/data-layer/factories":{"position":[[6761,15]]}},"keywords":{}}],["foreach(resourc",{"_index":1749,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5728,17]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5728,17]]}},"keywords":{}}],["foreign",{"_index":622,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6988,7]]},"template:docs/data-layer/fixtures":{"position":[[1632,7],[2788,7],[3448,7],[3502,7],[4504,7],[4803,7],[5132,7]]},"template:docs/data-layer/orm":{"position":[[2056,7],[6988,7],[7598,7]]},"template:docs/data-layer/relationships":{"position":[[1362,7],[1713,7],[5116,7]]},"template:docs/getting-started/overview":{"position":[[7013,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7723,7],[8555,7],[8726,7],[8979,7],[9756,7],[9879,7],[15384,7],[15631,7]]},"template:docs/route-handlers/functions":{"position":[[4718,7],[4782,7],[4877,7]]},"template:templates/docs/data-layer/factories":{"position":[[6988,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[1632,7],[2788,7],[3448,7],[3502,7],[4504,7],[4803,7],[5132,7]]},"template:templates/docs/data-layer/orm":{"position":[[2056,7],[6988,7],[7598,7]]},"template:templates/docs/data-layer/relationships":{"position":[[1362,7],[1713,7],[5116,7]]},"template:templates/docs/getting-started/overview":{"position":[[7013,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7723,7],[8555,7],[8726,7],[8979,7],[9756,7],[9879,7],[15384,7],[15631,7]]},"template:templates/docs/route-handlers/functions":{"position":[[4718,7],[4782,7],[4877,7]]}},"keywords":{}}],["forgiv",{"_index":1478,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16125,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16125,7]]}},"keywords":{}}],["forgot",{"_index":1397,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9665,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9665,6]]}},"keywords":{}}],["form",{"_index":65,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[935,6]]},"template:docs/data-layer/factories":{"position":[[1196,4]]},"template:docs/data-layer/fixtures":{"position":[[765,4]]},"template:docs/data-layer/models":{"position":[[1447,4]]},"template:docs/data-layer/relationships":{"position":[[6165,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5252,5],[6212,4],[6269,4]]},"template:docs/route-handlers/functions":{"position":[[4075,5]]},"template:docs/route-handlers/shorthands":{"position":[[439,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[935,6]]},"template:templates/docs/data-layer/factories":{"position":[[1196,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[765,4]]},"template:templates/docs/data-layer/models":{"position":[[1447,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6165,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5252,5],[6212,4],[6269,4]]},"template:templates/docs/route-handlers/functions":{"position":[[4075,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[439,4]]}},"keywords":{}}],["format",{"_index":819,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1682,6],[1752,6]]},"template:docs/data-layer/orm":{"position":[[686,6],[744,6],[1045,10],[3012,10],[4223,9]]},"template:docs/data-layer/serializers/index":{"position":[[234,9],[805,6],[1020,6],[1104,7],[1256,6],[1645,8],[1933,7],[2021,7],[6764,8]]},"template:docs/getting-started/overview":{"position":[[1013,10],[7366,9],[7602,7],[7851,10],[8065,8],[8122,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7487,9],[14677,6],[14848,6],[15263,6],[15347,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1580,10]]},"template:docs/route-handlers/shorthands":{"position":[[2603,6],[3294,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[1682,6],[1752,6]]},"template:templates/docs/data-layer/orm":{"position":[[686,6],[744,6],[1045,10],[3012,10],[4223,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[234,9],[805,6],[1020,6],[1104,7],[1256,6],[1645,8],[1933,7],[2021,7],[6764,8]]},"template:templates/docs/getting-started/overview":{"position":[[1013,10],[7366,9],[7602,7],[7851,10],[8065,8],[8122,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7487,9],[14677,6],[14848,6],[15263,6],[15347,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1580,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2603,6],[3294,6]]}},"keywords":{}}],["fortun",{"_index":545,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2145,12]]},"template:docs/getting-started/overview":{"position":[[5889,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3765,12],[18095,12]]},"template:templates/docs/data-layer/factories":{"position":[[2145,12]]},"template:templates/docs/getting-started/overview":{"position":[[5889,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3765,12],[18095,12]]}},"keywords":{}}],["found",{"_index":1770,"title":{"template:not-found":{"position":[[4,5]]},"template:templates/not-found":{"position":[[4,5]]}},"text":{"template:not-found":{"position":[[5,5]]},"template:templates/not-found":{"position":[[5,5]]}},"keywords":{}}],["framework",{"_index":1514,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1405,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3424,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1405,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3424,9]]}},"keywords":{}}],["frontend",{"_index":1502,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[58,8],[288,8],[599,8]]},"template:docs/route-handlers/shorthands":{"position":[[5839,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[58,8],[288,8],[599,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5839,8]]}},"keywords":{}}],["frustrat",{"_index":1307,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2227,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2227,11]]}},"keywords":{}}],["full",{"_index":1265,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[9568,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[196,4],[18660,4]]},"template:docs/route-handlers/functions":{"position":[[5322,4]]},"template:docs/route-handlers/shorthands":{"position":[[1090,4],[5439,4]]},"template:templates/docs/getting-started/overview":{"position":[[9568,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[196,4],[18660,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5322,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1090,4],[5439,4]]}},"keywords":{}}],["fulli",{"_index":1278,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10630,5]]},"template:docs/route-handlers/functions":{"position":[[7017,5]]},"template:templates/docs/getting-started/overview":{"position":[[10630,5]]},"template:templates/docs/route-handlers/functions":{"position":[[7017,5]]}},"keywords":{}}],["function",{"_index":68,"title":{"template:docs/route-handlers/functions":{"position":[[0,9]]},"template:templates/docs/route-handlers/functions":{"position":[[0,9]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1036,8]]},"template:docs/advanced/server-configuration":{"position":[[163,8],[272,8],[354,9],[811,9],[856,8],[923,8],[2332,9],[2360,8],[3379,8],[3661,8],[5082,8],[5310,8]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[343,8]]},"template:docs/advanced/switching-between-scenarios":{"position":[[122,8],[2029,8]]},"template:docs/data-layer/factories":{"position":[[2778,9],[5261,9]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[66,13],[655,9],[757,9],[1325,8]]},"template:docs/data-layer/serializers/index":{"position":[[5637,8]]},"template:docs/getting-started/overview":{"position":[[344,8],[397,8],[3404,9],[4200,8],[8675,8],[9927,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[594,8],[761,8],[810,8],[1038,8],[1237,8],[1254,8],[18302,8],[18343,10]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[105,8]]},"template:docs/getting-started/what-is-mirage":{"position":[[1298,9]]},"template:docs/route-handlers/functions":{"position":[[1,9],[11,8],[104,8],[486,8],[1278,10],[1670,10],[3287,8],[3545,8],[3847,8],[5327,8],[5369,8],[5473,8],[5504,8],[6531,10],[7387,8],[7412,8],[7595,8]]},"template:docs/route-handlers/shorthands":{"position":[[245,8],[756,8]]},"template:docs/testing/acceptance-tests":{"position":[[5696,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[298,8],[5519,10]]},"template:docs/testing/setup-mirage":{"position":[[1170,9],[1199,8]]},"template:index":{"position":[[219,10]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1036,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[163,8],[272,8],[354,9],[811,9],[856,8],[923,8],[2332,9],[2360,8],[3379,8],[3661,8],[5082,8],[5310,8]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[343,8]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[122,8],[2029,8]]},"template:templates/docs/data-layer/factories":{"position":[[2778,9],[5261,9]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[66,13],[655,9],[757,9],[1325,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5637,8]]},"template:templates/docs/getting-started/overview":{"position":[[344,8],[397,8],[3404,9],[4200,8],[8675,8],[9927,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[594,8],[761,8],[810,8],[1038,8],[1237,8],[1254,8],[18302,8],[18343,10]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[105,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1298,9]]},"template:templates/docs/route-handlers/functions":{"position":[[1,9],[11,8],[104,8],[486,8],[1278,10],[1670,10],[3287,8],[3545,8],[3847,8],[5327,8],[5369,8],[5473,8],[5504,8],[6531,10],[7387,8],[7412,8],[7595,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[245,8],[756,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5696,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[298,8],[5519,10]]},"template:templates/docs/testing/setup-mirage":{"position":[[1170,9],[1199,8]]},"template:templates/index":{"position":[[219,10]]}},"keywords":{}}],["function(assert",{"_index":485,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1638,16]]},"template:docs/data-layer/factories":{"position":[[15252,16],[16309,16],[16981,16]]},"template:docs/data-layer/fixtures":{"position":[[2529,16]]},"template:docs/getting-started/overview":{"position":[[5211,16],[5472,16],[6661,16]]},"template:docs/testing/acceptance-tests":{"position":[[900,16],[1723,16],[3080,16],[3263,16],[3698,16],[4229,16],[5517,16],[5804,16]]},"template:docs/testing/assertions":{"position":[[1026,16],[1710,16],[3081,16]]},"template:docs/testing/integration-and-unit-tests":{"position":[[688,16],[1419,16],[2185,16],[2653,16],[4587,16],[6759,16]]},"template:docs/testing/setup-mirage":{"position":[[509,16],[998,16],[1890,16]]},"template:templates/docs/data-layer/database":{"position":[[1638,16]]},"template:templates/docs/data-layer/factories":{"position":[[15252,16],[16309,16],[16981,16]]},"template:templates/docs/data-layer/fixtures":{"position":[[2529,16]]},"template:templates/docs/getting-started/overview":{"position":[[5211,16],[5472,16],[6661,16]]},"template:templates/docs/testing/acceptance-tests":{"position":[[900,16],[1723,16],[3080,16],[3263,16],[3698,16],[4229,16],[5517,16],[5804,16]]},"template:templates/docs/testing/assertions":{"position":[[1026,16],[1710,16],[3081,16]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[688,16],[1419,16],[2185,16],[2653,16],[4587,16],[6759,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[509,16],[998,16],[1890,16]]}},"keywords":{}}],["function(config",{"_index":134,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1063,16]]},"template:docs/advanced/server-configuration":{"position":[[3126,16],[3504,16]]},"template:docs/testing/setup-mirage":{"position":[[1459,16]]},"template:templates/docs/advanced/environment-options":{"position":[[1063,16]]},"template:templates/docs/advanced/server-configuration":{"position":[[3126,16],[3504,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[1459,16]]}},"keywords":{}}],["function(db",{"_index":1493,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[17978,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17978,12]]}},"keywords":{}}],["function(environ",{"_index":429,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1326,21]]},"template:docs/testing/assertions":{"position":[[2620,21]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1326,21]]},"template:templates/docs/testing/assertions":{"position":[[2620,21]]}},"keywords":{}}],["function(hook",{"_index":1219,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5108,15]]},"template:docs/testing/acceptance-tests":{"position":[[803,15]]},"template:docs/testing/integration-and-unit-tests":{"position":[[588,15],[1314,15],[2083,15],[2551,15],[4485,15],[6657,15]]},"template:docs/testing/setup-mirage":{"position":[[414,15],[887,15],[1779,15]]},"template:templates/docs/getting-started/overview":{"position":[[5108,15]]},"template:templates/docs/testing/acceptance-tests":{"position":[[803,15]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[588,15],[1314,15],[2083,15],[2551,15],[4485,15],[6657,15]]},"template:templates/docs/testing/setup-mirage":{"position":[[414,15],[887,15],[1779,15]]}},"keywords":{}}],["function(schema",{"_index":881,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1123,16]]},"template:docs/data-layer/serializers/index":{"position":[[5749,16],[6224,16]]},"template:docs/route-handlers/functions":{"position":[[4461,16],[5939,16],[6566,16]]},"template:docs/route-handlers/shorthands":{"position":[[2432,16],[3085,16]]},"template:templates/docs/data-layer/models":{"position":[[1123,16]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5749,16],[6224,16]]},"template:templates/docs/route-handlers/functions":{"position":[[4461,16],[5939,16],[6566,16]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2432,16],[3085,16]]}},"keywords":{}}],["function(serv",{"_index":437,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1820,16],[2062,16]]},"template:docs/data-layer/database":{"position":[[763,16]]},"template:docs/data-layer/factories":{"position":[[1107,16],[1598,16],[13607,16],[13920,16],[14513,16]]},"template:docs/data-layer/fixtures":{"position":[[405,16],[1963,16],[2231,16]]},"template:docs/data-layer/models":{"position":[[1325,16],[1696,16]]},"template:docs/getting-started/overview":{"position":[[4289,16]]},"template:docs/testing/acceptance-tests":{"position":[[5296,16]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1820,16],[2062,16]]},"template:templates/docs/data-layer/database":{"position":[[763,16]]},"template:templates/docs/data-layer/factories":{"position":[[1107,16],[1598,16],[13607,16],[13920,16],[14513,16]]},"template:templates/docs/data-layer/fixtures":{"position":[[405,16],[1963,16],[2231,16]]},"template:templates/docs/data-layer/models":{"position":[[1325,16],[1696,16]]},"template:templates/docs/getting-started/overview":{"position":[[4289,16]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5296,16]]}},"keywords":{}}],["further",{"_index":638,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7729,7]]},"template:templates/docs/data-layer/factories":{"position":[[7729,7]]}},"keywords":{}}],["futur",{"_index":325,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2795,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17464,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[2795,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17464,6]]}},"keywords":{}}],["g",{"_index":546,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2250,1]]},"template:docs/data-layer/fixtures":{"position":[[688,1]]},"template:docs/data-layer/models":{"position":[[815,1]]},"template:docs/data-layer/serializers/index":{"position":[[2688,1]]},"template:docs/getting-started/overview":{"position":[[1932,1],[3267,1]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16514,1]]},"template:templates/docs/data-layer/factories":{"position":[[2250,1]]},"template:templates/docs/data-layer/fixtures":{"position":[[688,1]]},"template:templates/docs/data-layer/models":{"position":[[815,1]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2688,1]]},"template:templates/docs/getting-started/overview":{"position":[[1932,1],[3267,1]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16514,1]]}},"keywords":{}}],["gain",{"_index":1683,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1432,4]]},"template:templates/docs/testing/assertions":{"position":[[1432,4]]}},"keywords":{}}],["gap",{"_index":1377,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7619,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7619,3]]}},"keywords":{}}],["garrett",{"_index":835,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3097,8],[3315,8],[4013,8],[4636,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[3097,8],[3315,8],[4013,8],[4636,8]]}},"keywords":{}}],["gener",{"_index":210,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[249,8],[356,8],[414,8]]},"template:docs/data-layer/factories":{"position":[[803,9],[2110,8],[2205,8],[3060,8],[3791,8],[4292,8],[5302,10],[5655,8],[6843,9],[15759,8]]},"template:docs/data-layer/fixtures":{"position":[[90,8],[633,10]]},"template:docs/data-layer/models":{"position":[[798,10]]},"template:docs/data-layer/orm":{"position":[[2657,10],[5349,9],[5589,8],[8736,10]]},"template:docs/data-layer/serializers/index":{"position":[[2642,9],[6622,8]]},"template:docs/getting-started/installation":{"position":[[1357,10]]},"template:docs/getting-started/overview":{"position":[[1698,8],[1873,9],[1958,9],[3115,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[387,9],[1780,8],[11855,9],[12009,9],[12860,7],[17762,10]]},"template:docs/testing/acceptance-tests":{"position":[[4006,7]]},"template:docs/testing/assertions":{"position":[[3558,7]]},"template:templates/docs/advanced/mocking-guids":{"position":[[249,8],[356,8],[414,8]]},"template:templates/docs/data-layer/factories":{"position":[[803,9],[2110,8],[2205,8],[3060,8],[3791,8],[4292,8],[5302,10],[5655,8],[6843,9],[15759,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[90,8],[633,10]]},"template:templates/docs/data-layer/models":{"position":[[798,10]]},"template:templates/docs/data-layer/orm":{"position":[[2657,10],[5349,9],[5589,8],[8736,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2642,9],[6622,8]]},"template:templates/docs/getting-started/installation":{"position":[[1357,10]]},"template:templates/docs/getting-started/overview":{"position":[[1698,8],[1873,9],[1958,9],[3115,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[387,9],[1780,8],[11855,9],[12009,9],[12860,7],[17762,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4006,7]]},"template:templates/docs/testing/assertions":{"position":[[3558,7]]}},"keywords":{}}],["genr",{"_index":536,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1692,6],[1820,6],[3656,6],[3935,6],[4009,6],[4081,6],[4155,6],[4229,6]]},"template:docs/data-layer/orm":{"position":[[1421,6],[2136,6],[4657,6],[5718,6],[6927,6],[7423,6]]},"template:docs/testing/assertions":{"position":[[3137,6],[3194,6]]},"template:templates/docs/data-layer/factories":{"position":[[1692,6],[1820,6],[3656,6],[3935,6],[4009,6],[4081,6],[4155,6],[4229,6]]},"template:templates/docs/data-layer/orm":{"position":[[1421,6],[2136,6],[4657,6],[5718,6],[6927,6],[7423,6]]},"template:templates/docs/testing/assertions":{"position":[[3137,6],[3194,6]]}},"keywords":{}}],["genre(i",{"_index":563,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3641,8]]},"template:templates/docs/data-layer/factories":{"position":[[3641,8]]}},"keywords":{}}],["genres.length",{"_index":567,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3716,15]]},"template:templates/docs/data-layer/factories":{"position":[[3716,15]]}},"keywords":{}}],["genres[i",{"_index":566,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3705,8]]},"template:templates/docs/data-layer/factories":{"position":[[3705,8]]}},"keywords":{}}],["get",{"_index":760,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16641,4]]},"template:docs/data-layer/fixtures":{"position":[[3563,4]]},"template:docs/data-layer/orm":{"position":[[4830,4],[7117,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[533,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3244,4]]},"template:templates/docs/data-layer/factories":{"position":[[16641,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[3563,4]]},"template:templates/docs/data-layer/orm":{"position":[[4830,4],[7117,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[533,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3244,4]]}},"keywords":{}}],["getcontext",{"_index":1743,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5425,10],[5546,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5425,10],[5546,13]]}},"keywords":{}}],["getter",{"_index":1066,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5334,6],[5838,6]]},"template:templates/docs/data-layer/relationships":{"position":[[5334,6],[5838,6]]}},"keywords":{}}],["getuuid",{"_index":228,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[802,7],[958,10],[1005,10]]},"template:templates/docs/advanced/mocking-guids":{"position":[[802,7],[958,10],[1005,10]]}},"keywords":{}}],["github",{"_index":8,"title":{},"text":{"template:blog/detail":{"position":[[69,7]]},"template:templates/blog/detail":{"position":[[69,7]]}},"keywords":{}}],["give",{"_index":313,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2537,5]]},"template:docs/data-layer/database":{"position":[[285,6]]},"template:docs/data-layer/factories":{"position":[[3848,5],[4721,5],[4915,5],[14862,6]]},"template:docs/data-layer/orm":{"position":[[8582,5]]},"template:docs/data-layer/serializers/index":{"position":[[1268,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[823,4],[11308,4]]},"template:docs/testing/assertions":{"position":[[506,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[2537,5]]},"template:templates/docs/data-layer/database":{"position":[[285,6]]},"template:templates/docs/data-layer/factories":{"position":[[3848,5],[4721,5],[4915,5],[14862,6]]},"template:templates/docs/data-layer/orm":{"position":[[8582,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1268,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[823,4],[11308,4]]},"template:templates/docs/testing/assertions":{"position":[[506,4]]}},"keywords":{}}],["given",{"_index":703,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[12213,5]]},"template:docs/data-layer/orm":{"position":[[7648,5]]},"template:docs/route-handlers/functions":{"position":[[3359,5],[3733,5]]},"template:docs/route-handlers/shorthands":{"position":[[4309,5]]},"template:docs/testing/acceptance-tests":{"position":[[219,5],[278,5],[2147,5]]},"template:templates/docs/data-layer/factories":{"position":[[12213,5]]},"template:templates/docs/data-layer/orm":{"position":[[7648,5]]},"template:templates/docs/route-handlers/functions":{"position":[[3359,5],[3733,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4309,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[219,5],[278,5],[2147,5]]}},"keywords":{}}],["global",{"_index":1530,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1145,6],[1227,6],[7159,8]]},"template:docs/testing/acceptance-tests":{"position":[[1099,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1028,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1145,6],[1227,6],[7159,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1099,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1028,6]]}},"keywords":{}}],["go",{"_index":406,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[441,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9969,5],[12485,2],[14462,2]]},"template:docs/testing/integration-and-unit-tests":{"position":[[7498,2]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[441,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9969,5],[12485,2],[14462,2]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[7498,2]]}},"keywords":{}}],["goe",{"_index":747,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16052,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8694,4],[15969,4]]},"template:templates/docs/data-layer/factories":{"position":[[16052,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8694,4],[15969,4]]}},"keywords":{}}],["good",{"_index":459,"title":{},"text":{"template:docs/data-layer/database":{"position":[[552,4]]},"template:docs/data-layer/fixtures":{"position":[[5366,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3523,4]]},"template:templates/docs/data-layer/database":{"position":[[552,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[5366,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3523,4]]}},"keywords":{}}],["graciou",{"_index":1319,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3343,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3343,8]]}},"keywords":{}}],["graph",{"_index":616,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6650,6],[11417,7],[12048,6]]},"template:docs/data-layer/fixtures":{"position":[[3869,5]]},"template:docs/data-layer/orm":{"position":[[5481,5],[7230,5],[8665,7]]},"template:docs/data-layer/relationships":{"position":[[6355,6]]},"template:docs/data-layer/serializers/index":{"position":[[584,5]]},"template:docs/getting-started/overview":{"position":[[6590,6]]},"template:templates/docs/data-layer/factories":{"position":[[6650,6],[11417,7],[12048,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[3869,5]]},"template:templates/docs/data-layer/orm":{"position":[[5481,5],[7230,5],[8665,7]]},"template:templates/docs/data-layer/relationships":{"position":[[6355,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[584,5]]},"template:templates/docs/getting-started/overview":{"position":[[6590,6]]}},"keywords":{}}],["great",{"_index":540,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1921,5],[4384,5]]},"template:docs/getting-started/overview":{"position":[[10002,5]]},"template:docs/testing/assertions":{"position":[[1419,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[103,5]]},"template:templates/docs/data-layer/factories":{"position":[[1921,5],[4384,5]]},"template:templates/docs/getting-started/overview":{"position":[[10002,5]]},"template:templates/docs/testing/assertions":{"position":[[1419,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[103,5]]}},"keywords":{}}],["group",{"_index":678,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9889,5]]},"template:templates/docs/data-layer/factories":{"position":[[9889,5]]}},"keywords":{}}],["guess",{"_index":1364,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[6472,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6472,5]]}},"keywords":{}}],["guid",{"_index":52,"title":{"template:docs/advanced/mocking-guids":{"position":[[8,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[8,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8,5]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[730,6]]},"template:docs/advanced/mocking-guids":{"position":[[9,5],[37,5],[780,6]]},"template:docs/data-layer/database":{"position":[[530,7]]},"template:docs/data-layer/factories":{"position":[[15725,7]]},"template:docs/data-layer/models":{"position":[[1878,7]]},"template:docs/data-layer/relationships":{"position":[[6106,7]]},"template:docs/data-layer/serializers/index":{"position":[[2065,6]]},"template:docs/getting-started/overview":{"position":[[9233,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9,5],[288,5],[1470,5],[1591,5],[8425,5],[11386,5],[13402,5],[17188,5],[17210,5],[18617,5],[18727,5]]},"template:docs/testing/acceptance-tests":{"position":[[1187,5]]},"template:docs/testing/assertions":{"position":[[3909,7]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[730,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[9,5],[37,5],[780,6]]},"template:templates/docs/data-layer/database":{"position":[[530,7]]},"template:templates/docs/data-layer/factories":{"position":[[15725,7]]},"template:templates/docs/data-layer/models":{"position":[[1878,7]]},"template:templates/docs/data-layer/relationships":{"position":[[6106,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2065,6]]},"template:templates/docs/getting-started/overview":{"position":[[9233,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9,5],[288,5],[1470,5],[1591,5],[8425,5],[11386,5],[13402,5],[17188,5],[17210,5],[18617,5],[18727,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1187,5]]},"template:templates/docs/testing/assertions":{"position":[[3909,7]]}},"keywords":{}}],["guy",{"_index":1519,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1918,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1918,4]]}},"keywords":{}}],["h1",{"_index":1637,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[2390,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2390,4]]}},"keywords":{}}],["h1>whoops!{{model.title}} A custom identity manager must implement these methods: fetch, which must return an identifier not used yet. set, which is called with an id of a record being insert in mirage's database. reset, which should reset database to initial state. Here's an example implementation for an identity manager that mocks GUIDs: import { v4 as getUuid } from \"ember-uuid\"; export default class { constructor() { this.ids = new Set(); } // Returns a new unused unique identifier. fetch() { let uuid = getUuid(); while (this.ids.has(uuid)) { uuid = getUuid(); } this.ids.add(uuid); return uuid; } // Registers an identifier as used. Must throw if identifier is already used. set(id) { if (this.ids.has(id)) { throw new Error(`ID ${id} has already been used.`); } this.ids.add(id); } // Resets all used identifiers to unused. reset() { this.ids.clear(); } } ","route":"docs.advanced.mocking-guids","keywords":[]},"template:docs/advanced/server-configuration":{"id":"template:docs/advanced/server-configuration","type":"template","title":"Server configuration","text":" Server configuration The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. Typically, the /mirage/config.js file contains a single default export which is a function defining all your Mirage route handlers. Ember CLI Mirage then uses this function, along with all the other modules you've defined in mirage/models, mirage/fixtures, mirage/factories, and mirage/serializers, to create your Mirage JS server when your app boots up in development and testing. You can now opt in to having more control over exactly how your Mirage server is instantiated using the same code as the mirageJS examples of creating a server by changing your current default export that represents the routes to a normal function, then creating a new default export function that creates the mirageJS server. This new default export function receives a single argument named config, which contains all the factory/fixture/serializer/model modules that exist in your project's /mirage directory. This saves you from having to import each module explicitly and then pass it into your Mirage server, just like you're used to with the default setup. The config argument maps exactly to everything inside of your /mirage directory - notably, it does not contain the autogenerated Mirage model definitions derived from your Ember Data models, which is an important feature of Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper has been provided named discoverEmberDataModels from the ember-cli-mirage package that you can use to augment your config with these models so that your Mirage schema is automatically inferred from your host application's Ember Data models and relationships. The snippet below shows how to do this. Note that the order here matters if you also have models defined in your /mirage/models directory, as those model definitions would \"win\" in the event of a conflict with the ones autodiscovered from Ember Data. (However, most of time if you are inferring your Mirage schema from Ember Data, you shouldn't need to define additional models.) Finally, your route handlers just need to be passed to the routes() key in your Mirage config. You can do this inline, or you can make them a separate function, and organize that function however you choose. You should also add miragejs to your project's dependencies in your package.json file, since you are now importing directly from it. Note that this gives you the added benefit of being able to upgrade miragejs independently of ember-cli-mirage. All the objects from miragejs are re-exported in ember-cli-mirage such as Model, belongsTo, hasMany as well as Fixtures, Traits for example. These should in the future also be imported directly from miragejs as eventually these re-exports will be removed. This will help align the ember-cli-mirage users with the rest of the Mirage JS community. // Example with inline routes import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { // this.namespace = '/api' // this.resource('user') }, }; return createServer(finalConfig); } // Example with routes in an external function import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } Serializers If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your server configuration to have mirage perform this for you. When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage version of the model. With serializers, you may have created a mirage serializer to override some methods, but would still like Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than the way you merge the models. applyEmberDataSerializers will apply the primaryKey and attrs from your ember data serializers to your mirage serializers. If you have not created a mirage serializer it will create one and extend it from your mirage application serializer. Ensure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand how to use primaryKey and transforms. If you have not created a mirage serializer named application, the created serializer will extend EmberDataSerializer directly. // Example of having Mirage adjust/create your serializers similiar to ember data models import { discoverEmberDataModels, applyEmberDataSerializers } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export function makeServer(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, serializers: applyEmberDataSerializers(config.serializers), routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } ","route":"docs.advanced.server-configuration","keywords":[]},"template:docs/advanced/simulating-cookie-responses":{"id":"template:docs/advanced/simulating-cookie-responses","type":"template","title":"Simulating cookie responses","text":" Simulating cookie responses Although Mirage allows setting headers in a response, the XMLHttpRequest spec explicitly forbids access to Set-Cookie and Set-Cookie2 headers. As a result Mirage responses cannot set cookies via headers. However, you can simulate receiving cookies from an ajax call at the browser level by setting them in a route function handler: this.post('/users/login', schema => { // log in for 24 hours let now = new Date(); let cookieExpiration = new Date(now.getTime() + (24 * 3600 * 1000)); document.cookie=`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires=${cookieExpiration.toUTCString()};`; return schema.users.find(1); }); Your Ember client code will now have access to any cookies set using document.cookie. ","route":"docs.advanced.simulating-cookie-responses","keywords":[]},"template:docs/advanced/switching-between-scenarios":{"id":"template:docs/advanced/switching-between-scenarios","type":"template","title":"Switching between scenarios","text":" Switching between scenarios Mirage adds a /scenarios directory to your project, where you'll find a default.js file. The function in this file will run in development mode and act as your \"development seeds\". In testing it's ignored, so that your Mirage server starts out with a clean database. You can then use each test to seed Mirage as needed for that test. In this way, each test acts as its own Mirage scenario. Originally Mirage was going to add first-class support for development-time scenario switching, but currently only the scenarios/default.js file is used by Mirage. However, you can use various strategies to configure the behavior of your default scenario, to support multiple development server states or to facilitate things like running user acceptance testing. For example, you might want to test whether a user can complete a set of tasks specific to unique circumstances defined in a scenario. One strategy you could take is to configure your default scenario file to honor options passed to the runtime environment. For example, say you wanted to be able to run a scenario file like this: MIRAGE_SCENARIO=some-scenario ember s To affect the behavior of scenarios/default.js, add the MIRAGE_SCENARIO ENV variable to your environment/config.js: const { MIRAGE_SCENARIO } = process.env; module.exports = function(environment) { const ENV = { // ...other stuff MIRAGE_SCENARIO, // ...other stuff }; return ENV; } Then access this new config variable in your scenarios/default.js file: // scenarios/default.js import ENV from '../../config/environment'; import visitor from './visitor'; import subscriber from './subscriber'; import administrator from './administrator'; const scenarios = { visitor, subscriber, administrator } const activeScenario = ENV.MIRAGE_SCENARIO || 'visitor'; export default function(server) { const scenario = scenarios[activeScenario]; if (scenario) { scenario(server); } // plus whatever default scenario code you want } Like other Mirage objects, all scenario files must export a function like so: export default function(server) { // server.createList('post', 15); } Note that the server parameter is not provided by default. ","route":"docs.advanced.switching-between-scenarios","keywords":[]},"template:docs/data-layer/database":{"id":"template:docs/data-layer/database","type":"template","title":"The Database","text":" The Database At the core of Mirage's data layer is a simple in-memory database. This database stores all of Mirage's initial state, and then your route handlers access and modify that state as you use your application. The database is what allows Mirage to mimic a production server, giving you the ability to write complete dynamic features in your Ember app. Most of your Mirage code will not access the database directly, but rather will interact with it through Mirage's ORM. We'll cover the ORM in the next section of these guides. However, it's good to know that whether or not you use the ORM, you can always interact with the database directly. For example, you could seed it with some data in scenarios/default.js // scenarios/default.js export default function(server) { server.db.loadData({ movies: [ { title: 'Interstellar' }, { title: 'Inception' }, { title: 'Dunkirk' }, ] }); } and then can access it in your route handlers using the schema argument: this.get('/movies', (schema, request) => { return schema.db.movies; }); This route handler would then respond with the data you loaded: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] Note that each record has an id field, since the database assigns all new records an auto-incrementing ID. The most common place you'll use the database directly is in your tests, where you can access it via this.server.db. It can be useful to assert against the state of Mirage's database to verify that your Ember app's network requests are sending over the correct data. // tests/movie-test.js test('I can create a movie', async function(assert) { await visit('/movies/new'); await fillIn('.title', 'The Dark Knight'); await click('.submit'); assert.dom('h2').includesText('New movie saved!'); assert.equal(this.server.db.movies[0].title, 'The Dark Knight'); }); You can view the rest of the Database APIs in the and API reference. Next, we'll learn about Mirage's ORM. ","route":"docs.data-layer.database","keywords":[]},"template:docs/data-layer/factories":{"id":"template:docs/data-layer/factories","type":"template","title":"Factories","text":" Factories One of the main benefits of using Mirage is the ability to quickly put your server into different states. For example, you might be developing a feature and want to see how the UI renders for both a logged-in user and an anonymous user. This is the kind of thing that's a pain when using a real backend server, but with Mirage it's as simple as flipping a JavaScript variable and live-reloading your Ember app. Factories are classes that help you organize your data-creation logic, making it easier to define different server states during development or within tests. Let's see how they work. Defining factories Your first factory Say we have a Movie model defined in Mirage. (Remember, if you're using Ember Data you won't have this file on disk. The Model definition will be automatically generated for you.) // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); To seed Mirage's database with some movies so you can start developing your app, use the server.create method in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.create('movie'); } server.create takes the singular hyphenated form of your model's class name as its first argument. Because we have no Factory defined for a Movie, server.create('movie') will just create an empty record and insert it into the database: // server.db.dump(); { movies: [ { id: '1' } ] } Not a very interesting record. However, we can pass attributes of our own as the second argument to server.create: // mirage/scenarios/default.js export default function(server) { server.create('movie', { title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' }); } Now our database looks like this { movies: [ { id: '1', title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' } ] } and we'll actually be able to develop our UI against realistic data. This is a great way to start, but it can be cumbersome to manually define every attribute (and relationship) when working on data-driven applications. It would be nice if we had a way to dynamically generate some of these attributes. Fortunately, that's exactly what Factories let us do! Let's generate a Factory for our movie using ember g mirage-factory movie which creates this file: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ }); Right now the Factory is empty. Let's define a property on it: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Movie title' }); Now server.create('movie') will use the properties from this factory. The inserted record will look like this: { movies: [ { id: '1', title: 'Movie title' } ] } We can also make this property a function. // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; } }); i is an incrementing index that lets us make our factory attributes more dynamic. If we use the server.createList method, we can quickly generate five movies server.createList('movie', 5); and with the above factory definition, our database will look like this: { movies: [ { id: '1', title: 'Movie 1' }, { id: '2', title: 'Movie 2' }, { id: '3', title: 'Movie 3' }, { id: '4', title: 'Movie 4' }, { id: '5', title: 'Movie 5' } ] } Let's add some more properties to our factory: // mirage/factories/movie.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ title(i) { return `Movie ${i}`; }, releaseDate() { return faker.date.past().toLocaleDateString(); }, genre(i) { let genres = [ 'Sci-Fi', 'Drama', 'Comedy' ]; return genres[i % genres.length]; } }); Here we've installed the Faker.js library to help us generate random dates. Now server.createList('movie', 5) gives us this data: { movies: [ { id: '1', title: 'Movie 1', releaseDate: '5/14/2018', genre: 'Sci-Fi' }, { id: '2', title: 'Movie 2', releaseDate: '2/22/2019', genre: 'Drama' }, { id: '3', title: 'Movie 3', releaseDate: '6/2/2018', genre: 'Comedy' }, { id: '4', title: 'Movie 4', releaseDate: '7/29/2018', genre: 'Sci-Fi' }, { id: '5', title: 'Movie 5', releaseDate: '6/30/2018', genre: 'Drama' }, ] } As you can see, Factories let us rapidly generate different scenarios for our dynamic server data. Attribute overrides Factories are great for defining the \"base case\" of your models, but there's plenty of times where you'll want to override attributes from your factory with specific values. The last argument to create and createList accepts a POJO of attributes that will override anything from your factory. // Using only the base factory server.create('movie'); // gives us this object: { id: '1', title: 'Movie 1', releaseDate: '01/01/2000' } // Passing in specific values to override certain attributes server.create('movie', { title: 'Interstellar' }); // gives us this object: { id: '2', title: 'Interstellar', releaseDate: '01/01/2000' } Think of your factory attributes as a reasonable \"base case\" for your models, and then override them in development and testing scenarios as you have need for specific values. Dependent attributes Attributes can depend on other attributes via this from within a function. This can be useful for quickly generating things like usernames from names: // mirage/factories/user.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ name() { return faker.name.findName(); }, username() { return this.name.replace(' ', '').toLowerCase(); } }); Calling server.createList('user', 3) with this factory would generate this data: [ { id: '1', name: 'Retha Donnelly', username: 'rethadonnelly' } { id: '2', name: 'Crystal Schaefer', username: 'crystalschaefer' } { id: '3', name: 'Jerome Schoen', username: 'jeromeschoen' } ] Relationships In the same way that you use the ORM to create relational data, as this example from the Creating and editing related data section of the illustrates let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', }); you can also create relational data with your factories: let nolan = server.create('director', { name: 'Christopher Nolan' }); server.create('movie', { director: nolan, title: 'Interstellar' }); nolan is a model instance, which is why we can just pass it in as an attribute override when creating the Interstellar movie. This also works when using createList: server.create('actor', { movies: server.createList('movie', 3) }); In this way you use factories to help you quickly create graphs of relational data: server.createList('user', 5).forEach(user => { server.createList('post', 10, { user }).forEach(post => { server.createList('comment', 5, { post }); }); }); This code generates 5 users, each of which has 10 posts with each post having 5 comments. Assuming these relationships are defined in your models, all the foreign keys would be set correctly in Mirage's database. The afterCreate hook In many cases, setting up relationships manually (as shown in the previous section) is perfectly fine. However there are times where it makes more sense to have base case relationships set up for you automatically. Enter afterCreate. It's a hook that's called after a model has been created using the factory's base attributes. This hook lets you perform additional logic on your newly-created models before they're returned from create and createList. Let's see how it works. Say you have these two models in your app: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ post: belongsTo() }); Let's further suppose that in your app, it is never valid to create a post without an associated user. You can use afterCreate to enforce this behavior: // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { post.update({ user: server.create('user') }); } }); The first argument to afterCreate is the object that was just created (in this case the post), and the second is a reference to the Mirage server instance, so that you can invoke other factories or inspect any other server state needed to customize your newly-created object. In this example we're immediately creating a user for this post. That way elsewhere in your app (say a test), you could just create a post server.create('post'); and you'd be working with a valid record, since that post would have an associated user. Now, there's one problem with the way we've implemented this so far. Our afterCreate hook updates the post's user regardless if that post already had a user associated with it. That means that this code let tomster = server.create('user', 'Tomster'); server.createList('post', 10, { user: tomster }); would not work as we expect, since the attribute overrides while the object is being created, but the logic in afterCreate runs after the post has been created. Thus, this post would be associated with the newly created post from the hook, rather than Tomster. To fix this, we can update our afterCreate hook to first check if the newly created post already has a user associated with it. Only if it doesn't will we create a new one and update the relationship. // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); Now callers can pass in specific users server.createList('post', 10, { user: tomster }); or omit specifying a user if the details of that user aren't important server.create('post'); and in both cases they'll end up with a valid record. afterCreate can also be used to create hasMany associations, as well as apply any other relevant creation logic. Traits Traits are an important feature of factories that make it easy to group related attributes. Define them by importing trait and adding a new key to your factory. For example, here we define a trait named published on our post factory: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }) }); You can pass anything into trait that you can into the base factory. We can use our new trait by passing in the name of the trait as a string argument to create or createList: server.create('post', 'published'); server.createList('post', 3, 'published'); The created posts will have all the base attributes, as well as everything under the published trait. You can also compose multiple traits together: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }), official: trait({ isOfficial: true }) }); We can pass our new traits into create or createList in any order: let officialPost = server.create('post', 'official'); let officialPublishedPost = server.create('post', 'official', 'published'); If multiple traits set the same attribute, the last trait wins. As always, you can pass in an object of attribute overrides as the last argument: server.create('post', 'published', { title: 'My first post' }); When combined with the afterCreate() hook, traits simplify the process of setting up related object graphs. Here we define a withComments trait that creates 3 comments for a newly created post: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', withComments: trait({ afterCreate(post, server) { server.createList('comment', 3, { post }); } }) }); We can use this trait to quickly make 10 posts with 3 comments each: server.createList('post', 10, 'withComments'); Combining traits with the afterCreate hook is one of the most powerful features of Mirage factories. Effective use of this technique will dramatically simplify the process of creating different graphs of relational data for your app. The association helper The association() helper provides some sugar for creating belongsTo relationships. As we saw earlier, given a Post that belongsTo a User, we were able to use the afterCreate hook to pre-wire that relationship: // mirage/factories/post.js import { Factory } from 'miragejs'; export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); The association() helper effectively replaces this code: // mirage/factories/post.js import { Factory, association } from 'miragejs'; export default Factory.extend({ user: association() }); This should help reduce some of the boilerplate in your factory definitions. You can also use association() within traits // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association() }) }); and it also accepts additional traits and overrides for the related model's factory: // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association('admin', { role: 'editor' }) }) }); There is no equivalent helper for hasMany relationships, so you can continue to use the afterCreate hook to seed those relationships. Using factories In development To use your factories to seed your development database, call server.create and server.createList in your scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); } There's no explicit API for switching scenarios in development, but you can just use JavaScript modules to split things up. For example, you could create a new file for each scenario that contains some seeding logic // mirage/scenarios/admin.js export default function(server) { server.create('user', { isAdmin: true }); } ...export all scenarios as an object from an index.js file // mirage/scenarios/index.js import anonymous from './anonymous'; import subscriber from './subscriber'; import admin from './admin'; export default scenarios = { anonymous, subscriber, admin } ...and then import that object into default.js. Now you can quickly switch your development state by changing a single variable: // mirage/scenarios/default.js import scenarios from './index'; // Choose one const state = // 'anonymous' // 'subscriber' 'admin' ; export default function(server) { scenarios[state](server); } This can be handy while developing your app or sharing the different states of a new feature with your team. In testing When running your app in the test environment, your entire Mirage server is loaded, except for your scenarios/default.js file. That means each test starts out with a clean database, giving you the opportunity to set up only the state needed for that test. It also keeps your development scenarios isolated from your tests, so that you don't inadvertently break your test suite while tweaking your development scenario. To seed Mirage's database within a test, use this.server to access the create and createList methods: test('I can see the movies on the homepage', async function(assert) { this.server.createList('movie', 5); await visit('/'); assert.dom('li.movie').exists({ length: 5 }); }); In this test, we start our Mirage server out with 5 movies. Then we boot up the Ember app and visit the / route, and finally assert that those movies show up in our UI. When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. You can read more about testing with Mirage in the section of these guides. Factory best practices In general, it's best to define a model's base factory using only the attributes and relationships that comprise the minimal valid state for that model. You can then use afterCreate and traits to define other common states that contain valid, related changes on top of the base case. This advice goes a long way towards keeping your test suite maintainable. If you don't use traits and afterCreate, your tests will become bogged down in irrelevant details related to setting up the data needed for that test. test('I can see the title of a post', async function(assert) { let session = server.create('session'); let user = server.create('user', { session }); server.create('post', { user, title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); This test is only concerned with asserting the title of a post gets rendered to the screen, but it has lots of boilerplate code that's only there to get the post in a valid state. If we used afterCreate instead, the developer writing this test could simply create a post with a specified title and slug, since those are the only details relevant to the test: test('I can see the title of a post', async function(assert) { server.create('post', { title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); afterCreate could take care of setting up the session and user in valid states, and associating the user with the post, so that the test can stay concise and focused on what it's actually testing. Effective use of traits and afterCreate keeps your test suite less brittle and more robust to changes in your data layer, since tests only declare the bare minimum setup logic needed to verify their assertions. Up next, we'll take a look at how to use Fixtures as an alternative way to seed your database. ","route":"docs.data-layer.factories","keywords":[]},"template:docs/data-layer/fixtures":{"id":"template:docs/data-layer/fixtures","type":"template","title":"Fixtures","text":" Fixtures Mirage also lets you use flat fixture files to seed your database with data. In general, we recommend using factories for most situations, since they tend to keep your mock data more maintainable. But there are certainly times where fixture data makes sense. Fixtures are nothing more than a conventional file-based way to accomplish the following: // mirage/scenarios/default.js export default function(server) { server.db.loadData({ countries: [ { id: 1, name: 'China' }, { id: 2, name: 'India' }, { id: 3, name: 'United States' } ] }); } Let's see how we can do the same thing using fixtures. Basic usage We'll start by generating a fixture file for our Country model: ember g mirage-fixture countries Fixture filenames should be the dasherized plural form of the model class. We can now add some data to our fixture file: // mirage/fixtures/countries.js export default [ { id: 1, name: 'China', largestCity: 'Shanghai' }, { id: 2, name: 'India', largestCity: 'Mumbai' }, { id: 3, name: 'United States', largestCity: 'New York City' }, { id: 4, name: 'Indonesia', largestCity: 'Jakarta' }, { id: 5, name: 'Pakistan', largestCity: 'Karachi' }, { id: 6, name: 'Brazil', largestCity: 'São Paulo' }, { id: 7, name: 'Nigeria', largestCity: 'Lagos' }, { id: 8, name: 'Bangladesh', largestCity: 'Dhaka' }, { id: 9, name: 'Russia', largestCity: 'Moscow' }, { id: 10, name: 'Mexico', largestCity: 'Mexico City' }, ]; Because this data will be read directly into Mirage's database, we want to use camelCase for all multi-word attributes. (Mirage uses the camelCasing convention to avoid configuration for things like identifying foreign keys.) Don't worry if your production API format doesn't use camelCase. We'll be able to customize Mirage's API format in the Serializer layer. To load our new fixture file into the database during development, we can call server.loadFixtures in our scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.loadFixtures(); } If we have multiple fixtures defined, server.loadFixtures() will load every file. You can load files selectively by passing in an argument list of fixture names to loadFixtures: // mirage/scenarios/default.js export default function(server) { server.loadFixtures('countries', 'cities'); // only load the countries and cities fixtures } Just like with factories, fixtures will be ignored during tests. If you want to load fixture data in a test, you can call this.server.loadFixtures: test('I can see the countries', async function(assert) { this.server.loadFixtures('countries'); await visit('/'); assert.dom('option.country').exists({ length: 100 }); }); Relationships There's no special API for creating relationships using fixtures – you just need to understand how Mirage uses foreign keys to wire up relationships. Let's say we had these models: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); Using the ORM we can create two related models: let chris = schema.users.create({ name: 'Chris Garrett' }); schema.posts.create({ author: chris, title: 'Coming Soon in Ember Octane' }); If we take a look at Mirage's database after this, we'll see this data: // server.db.dump() { users: [ { id: '1', name: 'Chris Garrett' } ], posts: [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ] } As you can see, Mirage added an authorId foreign key to the post. The convention for belongsTo foreign keys is `${relationshipName}Id` In this case, a post gets an authorId, even though that relationship points to a User model. The relationship name is always used rather than the model name, because models can have multiple relationships that point to the same type of model. Looking at the database dump above, if you wanted to recreate the same relationship graph using only fixture files, your files would look something like this: // mirage/fixtures/users.js export default [ { id: '1', name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; Once these fixtures are loaded into Mirage, all the ORM methods, Shorthands and Serializers would work as expected. If this happens to be a bi-directional relationship // mirage/models/user.js export default Model.extend({ + posts: hasMany() }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); then Mirage will add an array of foreign keys on the new hasMany association: // mirage/fixtures/users.js export default [ { id: '1', postIds: [ '1' ], name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; The convention for hasMany relationship foreign keys is `${singularize(relationshipName)}Ids` All associations have their own keys, because Mirage supports arbitrary one-way relationships. If two associations are inverses of each other, as in the above case, Mirage will keep the keys on each model in sync provided you use the ORM methods. As you can see, maintaining foreign keys and keeping them in sync across fixture files can get a little messy, which is why Mirage recommends using factories for most of your data creation. Still, fixtures can be quite useful in certain situations, so they're a good tool to have in your toolbox. ","route":"docs.data-layer.fixtures","keywords":[]},"template:docs/data-layer/models":{"id":"template:docs/data-layer/models","type":"template","title":"Models","text":" Models To take advantage of the ORM, Mirage needs to know about your application's models and their relationships. This section will teach you how to define and work with your models, and the next will discuss relationships. Note that if your Ember application uses Ember Data, Mirage will automatically discover your models and their relationships, so you don’t need to define any files within Mirage yourself. As a clarifying point, Mirage model instances only exist within Mirage's server, and are never shared directly with your Ember app or rendered directly in components. They exist solely to help you manage the data and relationships in your fake backend, but are serialized as a JSON string before they are sent over to your Ember app. Defining models To define a model, you can use the generator: ember g mirage-model blog-post This creates a file under /mirage/models: // mirage/models/blog-post.js import { Model } from 'miragejs'; export default Model; Creating models To create models, access the model's collection via the schema object, which is available in your route handlers: this.post('/blog-posts', function(schema) { let attrs = this.normalizedRequestAttrs(); schema.blogPosts.create(attrs); }); or as server.schema directly off of your Mirage server instance: // scenarios/default.js export default function(server) { server.schema.blogPosts.create({ title: 'Lorem ipsum' }); } Note that the collection is the pluralized form of the model's model name (the models/blog-post.js definition from above creates a schema.blogPosts collection). Outside of route handlers, you'll typically create models using Factories via server.create // scenarios/default.js export default function(server) { server.create('blog-post'); } which delegates to the collection's create method under the hood. We'll talk more about creating data using Factories later in these guides. Accessing models To access your models, use the various query methods from the model's collection. For example, use all() to return all known models: this.get('/blog-posts', (schema, request) => { return schema.blogPosts.all(); }); Here are some other common query methods: schema.blogPosts.find(1); schema.blogPosts.first(); schema.blogPosts.where({ isPublished: true }); schema.blogPosts.findBy({ title: 'Introduction' }); Check out the to see all available query methods. Updating and deleting models Once you're working with an instance of a model, there are other properties and methods you'll have access to. For example, you can update a model: let post = schema.blogPosts.find(1); post.update({ author: 'Obi-Wan' }); or delete one: let post = schema.blogPosts.find(2); post.destroy(); View the to see all the available fields and methods for model instances. Once your Models have been defined, the next step is to define the relationships between them, so you can really start to leverage the power of Mirage's ORM. Let's talk about how to do that next. ","route":"docs.data-layer.models","keywords":[]},"template:docs/data-layer/orm":{"id":"template:docs/data-layer/orm","type":"template","title":"Why an ORM?","text":" Why an ORM? Mirage originally shipped with just a database as its data layer. While helpful, users still had to write a lot of code to reproduce their modern, complex backends. In particular, dealing with relationships was a big pain point. The solution was to add an Object Relational Mapper, or ORM, to Mirage. Let's see how an ORM allows Mirage to do more of the heavy lifting for you. Motivation Consider a database that looks like this: db.dump(); // Result { movies: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] } The first problem you'll encounter when writing a route handler is how to transform this raw data into the format your Ember app expects – that is, how to match the format of your production API. Let's say your backend uses the JSON:API spec. Your response to a GET request for /api/movies/1 should look something like this: // GET /api/movies/1 { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' } } } Not a huge deal – we could just write this formatting logic directly in our route handler: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); return { data: { id: movie.id, type: 'movies', attributes: { title: movie.title } } }; }); This works. But let's say our Movie model had a few more attributes: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } Now our route handler needs to be more clever, and make sure all properties other than id end up in the attributes hash: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); let movieJSON = { data: { id: movie.id, type: 'movies', attributes: { } } }; Object.keys(movie) .filter(key => key !=== 'id') .forEach(key => { movieJSON[key] = movie[key]; }); return movieJSON; }); As you can see, things get complicated pretty fast. What if we add relationships to the mix? Let's say a Movie has a relationship to a director, and it stores that relationship using a directorId foreign key: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '23' } The expected HTTP response for this model now looks like this { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' }, relationships: { directors: { data: { type: 'people', id: '23' } } } } } meaning our route handlers need to get even more complex. In particular, they need a robust way to differentiate between a model's attributes (like title) and its relationship keys (like directorId). These sorts of problems turn out to be common enough that we can solve them generally, provided Mirage is aware of your application's models and their relationships. Problems solved by the ORM When Mirage knows about your application's domain, it can shoulder the responsibility for the low-level bookkeeping work needed to properly implement your mock server. Let's take a look at some examples of how it does this. Separation of formatting logic To start, we can tell Mirage about our application's schema by defining Mirage models. These models get registered with the ORM and tell Mirage about the shape of your data. Let's define a Movie model. // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Mirage models are schemaless in attributes, in that they don't require you to define plain attributes like title and releaseDate. So, the above model definition works regardless of what attributes your Movie model has. If you're using Ember Data, Mirage's ORM will automatically register your Ember Data models for you at run time, so you don't have to duplicate your domain information in two places. With the Movie model defined, we can update our route handler to use the ORM to respond with a Mirage model instance: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); The schema argument is how you interact with the ORM. By returning an instance of a Mirage model from a route handler instead of a plain JavaScript object, we can now take advantage of Mirage's Serializer layer. Serializers work by turning Models and Collections into formatted JSON responses. Mirage ships with a JSONAPISerializer out of the box, so assuming it's defined as your Application serializer // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); this route handler will now respond with the payload we expect: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } } } The ORM is already helping us keep our route handlers tidy by delegating the work of transforming our models into JSON to the Serializer layer. But it gets even more powerful when we add relationships to the mix. Fetching related data Let's say our Movie has a belongs-to relationship with a director: // mirage/models/movie.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ director: belongsTo('person') }); The director is an instance of a Person model: // mirage/models/person.js import { Model } from 'miragejs'; export default Model.extend({ }); Again, if you're using Ember Data, both the models and relationships will be automatically generated for you. No need to create this file. Without changing anything about our route handler or serializer, we can now fetch a graph of data by using JSON:API includes. The following request GET /api/movies/1?include=director will now generate this response: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }, relationships: { director: { data: { type: 'people', id: '1' } } } }, included: [ { id: '1', type: 'people', attributes: { name: 'Christopher Nolan' } } ] } The JSONAPISerializer is able to inspect the ORM so that it can put all models, attributes and relationships in the right place. Our route handler doesn't need to change at all. In fact, the route handler we wrote is the same as the default behavior of the Shorthand, meaning we can just switch to using that: - this.get('/movies/:id', (schema, request) => { - let id = request.params.id; - return schema.movies.find(id); - }); + this.get('/movies/:id'); This is another example of how the ORM helps various parts of Mirage, like Shorthands and Serializers, work together to simplify your server definition. Creating and editing related data The ORM also makes creating and editing related data easier than if you only worked with the raw database records. For instance, to create a Movie and Person with a relationship using only the database, you'd need to do something like this: server.db.loadData({ people: [ { id: '1', name: 'Christopher Nolan' } ], movies: [ { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '1' } ] }); Note the directorId foreign key on the Movies record must match the id on the associated People record. Managing raw database data like this quickly gets unwieldy, especially as relationships change over time. Using the ORM via server.schema, we can create this graph without managing any IDs: let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }); Passing in the model instance nolan as the director attribute when creating the movie is enough for all the keys to be properly set up. The ORM also keeps foreign keys in sync as relationships are edited. Given the database { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '2' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } we could update the movie's director like this: let episode9 = schema.movies.findBy({ title: 'Star Wars: The Rise of Skywalker' }); episode9.update({ director: schema.people.findBy({ name: 'J.J. Abrams' }); }); The new database would look like this: { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '3' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } Note how the directorId was changed in the database, even though we only ever worked with model instances. Importantly, this also holds true for more complex relationships, like one-to-many or many-to-many relationships that have an inverse. The ORM allows Mirage to abstract all this bookkeeping away from your code, and even gives Shorthands enough power to respect arbitrary updates to complex relationship graphs. These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's schema, it can take on more of the responsibility of configuring your mock server. Next, we'll take a look at how to actually define your models and their relationships in Mirage. ","route":"docs.data-layer.orm","keywords":[]},"template:docs/data-layer/relationships":{"id":"template:docs/data-layer/relationships","type":"template","title":"Relationships","text":" Relationships Once you've defined your models, you can define relationships between them using the belongsTo and hasMany helpers. Each helper adds some dynamic methods to your model. Just as another reminder, if you use Ember Data and have models and relationships defined there, you don't need to define any relationships within your Mirage folder, as those will be automatically discovered and set up for you. belongsTo To define a to-one relationship, import the belongsTo helper and define a new property on a model that points to another model: // mirage/models/blog-post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); This defines a belongsTo relationship to an Author model. The belongsTo helper adds several new properties and methods to your models. In this case, our blog-post model would now have an authorId property, as well as some methods for working with the associated author model: blogPost.authorId; // 1 blogPost.authorId = 2; // updates the relationship blogPost.author; // Author instance blogPost.author = anotherAuthor; blogPost.newAuthor(attrs); // new unsaved author blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) Note that when a child calls child.createParent, the new parent is immediately saved to the db, but the child's foreign key is updated on this instance only, and is not immediately persisted to the database. In other words, blogPost.createAuthor will create a new author record, insert it into the db, and update the blogPost.authorId in memory, but if you were to fetch the blogPost from the db again, the relationship would not be persisted. To persist the new foreign key, you would call blogPost.save() after creating the new author. hasMany To define a to-many relationship, use the hasMany helper: // mirage/models/blog-post.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ comments: hasMany() }); This helper adds a commentIds property to the blogPost model, as well as some methods for working with the associated comments collection: blogPost.commentIds; // [1, 2, 3] blogPost.commentIds = [2, 3]; // updates the relationship blogPost.comments; // array of related comments blogPost.comments = [comment1, comment2]; // updates the relationship blogPost.newComment(attrs); // new unsaved comment blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) Association options modelName If your associations model has a different name than the association itself, you can specify the modelName on the association. For example, // mirage/models/blog-post.js import { Model, belongsTo, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo(\"user\"), comments: hasMany(\"annotation\") }); would add all the named author and comment methods as listed above, but use user and annotation models for the actual relationships. inverse Often, relationships can be inverses of each other. For example, say we had the following two models: // blog-post.js export default Model.extend({ comments: hasMany() }); // comment.js export default Model.extend({ blogPost: belongsTo() }); In this case, blogPost.comments would point to a collection of Comment models, and each one of those Comment models would have a comment.blogPost relationship that pointed back to the original post. Mirage will often be able to infer that two relationships on two different models are inverses of each other, but sometimes you'll need to be explicit. This typically happens if a model has two relationships that point to the same model type. For example, suppose we had the following schema: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\"), reviewer: belongsTo(\"user\") }); In this case, Mirage doesn't know which relationship (blogPost.author or blogPost.reviewer) should by synchronized with the parent's user.blogPosts collection. So, you can specify which one by using the inverse option: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\", { inverse: \"blogPosts\" }), reviewer: belongsTo(\"user\", { inverse: null }) }); Now, if a blog post is added to user.blogPosts, that post's author will be correctly set. polymorphic You can specify whether an association is a polymorphic association by passing { polymorphic: true } as an option. For example, say you have a Comment that can belong to a BlogPost or a Picture. Here's how the model definitions would look: // app/models/comment.js export default Model.extend({ commentable: belongsTo({ polymorphic: true }) }); // app/models/blog-post.js export default Model.extend({ comments: hasMany() }); // app/models/picture.js export default Model.extend({ comments: hasMany() }); Note that commentable doesn't need a type (there's no validation done on which types of models can exist on that association). Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. let comment = schema.comments.create({ text: \"foo\" }); comment.buildCommentable(\"post\", { title: \"Lorem Ipsum\" }); comment.createCommentable(\"post\", { title: \"Lorem Ipsum\" }); // getter comment.commentableId; // { id: 1, type: 'blog-post' } // setter comment.commentableId = { id: 2, type: \"picture\" }; Has-many asssociations can also be polymorphic: // app/models/user.js export default Model.extend({ things: hasMany({ polymorphic: true }) }); // app/models/car.js export default Model.extend({ }); // app/models/watch.js export default Model.extend({ }); let user = schema.users.create({ name: \"Sam\" }); user.buildThing('car', { attrs }); user.createThing('watch', { attrs }); // getter user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] // setter user.thingIds = [ { id: 2, type: 'watch' }, ... ]; Be sure to check out the , and API docs to learn about all the available ORM methods. We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. Next, let's take a look at Factories, which leverage your new Model and Relationship definitions to make it easy to create graphs of relational data. ","route":"docs.data-layer.relationships","keywords":[]},"template:docs/data-layer/serializers/ember-data-serializer":{"id":"template:docs/data-layer/serializers/ember-data-serializer","type":"template","title":null,"text":"The EmberDataSerializer extends the RestSerializer with the added functionality ofprimaryKey and attrs (renamed transforms as attrs was already in use by Mirage) properties. These properties work the same as the properties provided. Primary Key This serializer provides for a property primaryKey that works the same as the primaryKey property on an ember data serializer. By default this property will be id but if you assign a different value, that value will be used in the JSON instead of id. This means that if you are using the primaryKey property on your ember data serializer, using the same property on the mirage serializer will perform the same function. If you were using the RestSerializer you would need to override the serialize and normalize functions to do the transform yourself. Using EmberDataSerializer you can let the serializer perform this transformation for you. To be clear, when data is received by Mirage, this will take the value of addressId from the JSON and use it as the id for the Mirage model. When Mirage serializers it's model into JSON, it will use the value for the id property and assign it to the property addressId. import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ primaryKey: \"addressId\" }); Transforms Transforms provides the same function as attrs for the ember data serializers however this transformation is happening on the server side for Mirage. This allows your mirage models to look more like your actual server models. Example of a Mirage serializer extending from EmberDataSerializer import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ transforms: { name: \"externalName\", address: {key: \"addressId\", serialize: \"ids\"}, age: {key: \"externalAge\"}, blogPosts: {key: \"blogPostIds\"} } }); If you would like Mirage to apply the transforms from your ember data serializers for you see . ","route":"docs.data-layer.serializers.ember-data-serializer","keywords":[]},"template:docs/data-layer/serializers/index":{"id":"template:docs/data-layer/serializers/index","type":"template","title":"Serializers","text":" Serializers A serializer is an object responsible for transforming a Model or Collection that's returned from your route handlers this.get('movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); into a formatted JSON payload // GET /movies/1 { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' } } } suitable for consumption by your Ember app. Serializers are the last main part of Mirage's architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models. Let's see how they work. Choosing which serializer to use The first step in working with Mirage's serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app. The JSON payload above is an example of an API that follows the JSON:API spec. You'll see it used a lot in the Ember ecosystem, because it's the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined. If you are starting a new app, it's recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don't use JSON:API. If your app does use JSON:API, Mirage ships with a JSONAPISerializer that will do the heavy lifting for you. Mirage also ships with two other named serializers, ActiveModelSerializer and RestSerializer, that match two other popular backend formats. EmberDataSerializer is also provided as a variation to the RestSerializer that uses the primaryKey and attrs defined in your applications ember data serializers, similar to how models are auto discovered. See the section on for more information. If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. Defining serializers Once you've selected the appropriate serializer, define your default application-wide serializer by exporting it from /mirage/serializers/application.js: // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); This specifies the serializer to use for each Model and Collection in your system. If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer. Let's use Mirage's generator to create a Movie serializer: ember g mirage-serializer movie This creates the file import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ }); which follows the best practice of model-specific serializers extending from your Application serializer. You can now customize the behavior of how Movie models and collections are serialized into JSON. Customizing serializers When it comes to customizing your application's serializers, you'll mostly be tweaking Mirage's defaults. For example, if your Ember app expects attribute names to be PascalCase // GET /movies/1 { Id: '1', ReleaseDate: 'Interstellar' } you might override the Serializer's keyForAttribute method: import { Serializer } from 'miragejs'; import { classify } from '@ember/string'; export default Serializer.extend({ keyForAttribute(attr) { return classify(attr); } }); See the API docs for each serializer to learn more about all the customization hooks available. Relationships Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships. For example, the JSONAPISerializer respects query param includes GET /movies/1?include=cast-members out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes. There's an option on JSONAPISerializer that enables this: import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); Now, a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { data: [ { type: 'people', id: '1' }, { type: 'people', id: '2' }, { type: 'people', id: '3' }, ] } } } } The Ember app could now use these ids to subsequently fetch the related cast members. Other times, an Ember app expects to get a link to fetch related data. The JSONAPISerializer also has a hook for this: // mirage/serializers/movie.js import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ links(movie) { return { 'cast-members': { related: `/api/movies/${movie.id}/cast-members` } }; } }); Now a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { links: { related: `/api/movies/1/cast-members` } } } } } The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details. Working with serialized JSON While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler. You can use the this.serialize helper method to do this - make sure to use a function instead of a fat arrow so you have access to the correct this: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta.size = movies.length; return json; }); The serialize helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer. You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies, 'movie-with-relationship'); json.meta.size = movies.length; return json; }); This route handler would use the mirage/serializers/movie-with-relationship.js serializer to transform the collection of movies into a json payload, which is then modified and then finally returned from the route handler. In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn't adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models. The more conventional your backend API is, the less code you'll need to write – not only in Mirage, but also in other parts of your Ember application! Be sure to check out the and docs to learn about all the hooks available to customize your serializer layer. Now that we've covered the ins and outs of Mirage's data layer, we're ready to see how we can use Mirage to effectively test our Ember application. ","route":"docs.data-layer.serializers.index","keywords":[]},"module:ember-cli-mirage/ember-data":{"id":"module:ember-cli-mirage/ember-data","type":"module","title":"ember-cli-mirage/ember-data","keywords":["discoverEmberDataModels","applyEmberDataSerializers"],"item":{"type":"module","id":"ember-cli-mirage/ember-data","attributes":{"file":"ember-cli-mirage/ember-data","functions":[{"name":"discoverEmberDataModels","description":"

Get all mirage models for each of the ember-data models

\n
","lineNumber":65,"access":"public","tags":[{"name":"method","value":"discoverEmberDataModels"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"models","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"},{"name":"applyEmberDataSerializers","description":"

Generate mirage serializers for each of the ember-data serializers\nif a mirage serializer already exists, apply the ember-data transforms

\n
","lineNumber":158,"access":"public","tags":[{"name":"method","value":"applyEmberDataSerializers"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"serializers","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"}],"variables":[]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}}},"module:ember-cli-mirage/serializers/ember-data-serializer":{"id":"module:ember-cli-mirage/serializers/ember-data-serializer","type":"module","title":"ember-cli-mirage/serializers/ember-data-serializer","keywords":["EmberDataSerializer"],"item":{"type":"module","id":"ember-cli-mirage/serializers/ember-data-serializer","attributes":{"file":"ember-cli-mirage/serializers/ember-data-serializer","functions":[],"variables":[{"name":"EmberDataSerializer","description":"

This serializer does not use following mirage properties to control how things are serialized

\n
attrs - see `serialize` on the transform property\nembed - see `serialize` on the transform property\nserializeIds - see serialize on the transform property\n
\n

The above configuration was applied to every property on the serializer, whereas the transforms allows you\nto specify a value for each property or relation.

\n

This serializer uses a property transforms that follows the Ember Data serializer format of attrs to specify the\nserialization (attrs is already in use by mirageJs).

\n

The startMirage has been modified to also generate serializers from the Ember Data serializers supporting\nthe key and the serialize/deserialize properties with the value of (true/ids/records). If a serializer is\nalready present in the mirage directory, the transforms will be added to it. If that serializer is not\na serializer of this type, there will be no effect. Ensure that your serializers and/or the application\nserializer in the mirage directory is a type of this serializer

\n
","lineNumber":33,"access":"public","tags":[{"name":"constructor","value":""}],"file":"ember-cli-mirage/serializers/ember-data-serializer","type":"any","exportType":"default"}]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}}},"template:docs/getting-started/installation":{"id":"template:docs/getting-started/installation","type":"template","title":"Installation","text":" Installation To install Mirage, run ember install ember-cli-mirage Ember should install the addon and add a /mirage directory to the root of your project. Check out the if you're coming from a previous version of Mirage. Note for Embroider users Embroider does not recognizes changes to Ember CLI Mirage configuration in mirage/ folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in EMBROIDER_REBUILD_ADDONS environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following: EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s Note for Prettier users There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you're using Prettier and install Mirage, you can either pin eslint-plugin-prettier to 2.6.0, or add the following to .eslintignore: /mirage/mirage Note for FastBoot users You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. FastBoot support is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. You can always bypass FastBoot page generation locally by running FASTBOOT_DISABLED=true ember serve Mirage will then run in the browser as expected, and you can develop your client app as normal. ","route":"docs.getting-started.installation","keywords":[]},"template:docs/getting-started/overview":{"id":"template:docs/getting-started/overview","type":"template","title":"Overview","text":" Overview The file mirage/config.js contains the boilerplate code to create a mirage server. You can customize the server that is created here by following the mirage documentation https://miragejs.com/docs/getting-started/overview/ Mirage lets you simulate API responses by writing route handlers. The simplest example of a route handler is a function that returns an object: // mirage/config.js function routes() { this.namespace = 'api'; this.get('/movies', () => { return { data: [ { id: 1, type: 'movies', attributes: { name: 'Interstellar' } }, { id: 2, type: 'movies', attributes: { name: 'Inception' } }, { id: 3, type: 'movies', attributes: { name: 'Dunkirk' } }, ] }; }); } Now whenever your Ember app makes a GET request to /api/movies, Mirage will respond with this data. Dynamic data This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: They're inflexible. What if you want to change the data for this route in your tests? They contain formatting logic. Logic that's concerned with the shape of your JSON payload (e.g. the data and attributes keys) is now duplicated across all your route handlers. They're too basic. Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. Mirage provides a data layer that lets you write more powerful server implementations. Let's see how it works by replacing our basic stub data above. Creating a model First, we'll need to tell Mirage that we have a dynamic Movie model. If you're using Ember Data and you already have a Movie model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won't have any files in the mirage/models directory. If you're not using Ember Data, you can use the mirage-model generator to create a model from the command line: $ ember g mirage-model movie This generates the following file: // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Writing a dynamic route handler Models let our route handlers take advantage of Mirage's in-memory database. The database makes our route handlers dynamic, so we can change the data that's returned without having to rewrite the handler. Let's update our route handler to be dynamic: this.get('/movies', (schema, request) => { return schema.movies.all(); }); The schema argument lets us access our new Movie model. This route will now respond with all the authors in Mirage's database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage's database, instead of having to write a different version of the handler for each scenario we want to simulate. Seeding the database Right now, if we sent a request to our new handler above, the response would look something like this: // GET /api/movies data: [ ] That's because Mirage's database is empty. To actually seed our database with fake data, we'll use factories. Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models. Let's create a factory for our author with $ ember g mirage-factory movie We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; // Movie 1, Movie 2, etc. }, year() { let min = 1950; let max = 2019; return Math.floor(Math.random() * (max - min + 1)) + min; }, rating: \"PG-13\" }); This factory creates objects like [ { title: 'Movie 1', year: 1992, rating: \"PG-13\" }, { title: 'Movie 2', year: 2008, rating: \"PG-13\" }, // ... ] and so on, which will automatically be inserted into the movies database table. The database will assign each record an id, and now we can interact with this data in our route handlers. To actually use our new factory definition, we can call the server.create and server.createList methods. To seed our development database, use the function in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); }; Now when our Ember app makes a GET request to /api/movies using the route handler above, we'll see something that looks like this: // GET /api/movies data: [ { id: 1, type: \"movies\", attributes: { title: \"Movie 1\", year: 1992, rating: \"PG-13\" } }, { id: 2, type: \"movies\", attributes: { title: \"Movie 2\", year: 2008, rating: \"PG-13\" } }, // ... ] As we can see, this response is now influenced by the run-time state of our database. In acceptance tests, scenarios/default.js is ignored, and instead you can use this.server to setup your database in the state needed for the test: // tests/acceptance/movies-test.js import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test(\"I can view the movies\", async function(assert) { this.server.createList(\"movie\", 3); await visit(\"/home\"); assert.dom(\"[data-test-id='movie-row']\").exists({ count: 3 }); }); }); You can also pass attribute overrides directly to create or createList: test(\"I can view the movie title\", async function(assert) { let movie = this.server.create('movie', { title: \"Interstellar\" }); await visit(`/movies/${movie.id}`); assert.dom('h1').includesText(\"Interstellar\"); }); You now have a simple way to set up your Mirage server's initial data, both during development and on a per-test basis. Associations Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean. Let's say your movie has many cast-members. You can declare this relationship in your model: // mirage/models/movie.js import { Model, hasMany } from 'miragejs'; export default Model.extend({ castMembers: hasMany() }); // mirage/models/cast-member.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ movie: belongsTo() }); Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: this.get('/movies/:id/cast-members', (schema, request) => { let movie = schema.movies.find(request.params.id); return movie.castMembers; }); and when creating graphs of related data: test(\"I can see a movie's cast members\", async function(assert) { server.create('movie', { title: 'Interstellar', castMembers: [ server.create('cast-member', { name: 'Matthew McConaughey' }), server.create('cast-member', { name: 'Anne Hathaway' }), server.create('cast-member', { name: 'Jessica Chastain' }) ] }); await visit('/'); assert.dom('li.cast-member').exists({ count: 3 }); }); Mirage uses foreign keys to keep track of these related models for you, so you don't have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage's database. Serializers Mirage is designed for you to be able to completely replicate your production server. So far, we've seen that Mirage's default payloads are formatted using the JSON:API spec. This spec produces payloads that look like this: // GET /movies/1 { data: { id: 1, type: 'movies', attributes: { title: 'Interstellar' } } } New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API. For example, your API responses might look more like this: // GET /movies/1 { movies: { id: 1, title: 'Interstellar' } } This is why Mirage serializers exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup. Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend: // mirage/serializers/application.js import { Serializer } from 'miragejs'; export default Serializer.extend({ keyForAttribute(attr) { return dasherize(attr); }, keyForRelationship(attr) { return dasherize(attr); } }); Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data: // mirage/serializers/movie.js import { Serializer } from 'miragejs'; export default Serializer.extend({ include: [ 'crewMembers' ] }); // mirage/config.js function routes() { this.get('/movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); } With the above config, a GET to /movies/1 would return automatically include related crew members: { movie: { id: 1, title: 'Interstellar' }, 'crew-members': [ { id: 1, 'movie-id': 1, name: 'Matthew McConaughey' }, { id: 1, 'movie-id': 1, name: 'Anne Hathaway' }, ... ] } Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the serializer guide to learn more. Shorthands Mirage has shorthands to reduce the code needed for conventional API routes. For example, the route handler this.get('/authors', (schema, request) => { return schema.authors.all(); }); can be written as this.get('/authors'); There are also shorthands for post, patch (or put), and del methods. Here's a full set of resourceful routes for an author resource: this.get('/authors'); this.get('/authors/:id'); this.post('/authors'); this.patch('/authors/:id'); this.del('/authors/:id'); Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control. Passthrough Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: // mirage/config.js this.passthrough(); Now you can develop as you normally would, for example against an existing API. When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need // mirage/config.js this.get('/comments'); this.passthrough(); and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. That should be enough to get you started! The rest of the docs are organized by Mirage's higher-level concepts: Route handlers contain the logic around what run-time data Mirage uses to respond to requests. The Data layer is how Mirage stores and tracks changes to your data over time. Keep reading to learn more! ","route":"docs.getting-started.overview","keywords":[]},"template:docs/getting-started/upgrade-guide/index":{"id":"template:docs/getting-started/upgrade-guide/index","type":"template","title":"Upgrade guide","text":" Upgrade guide If you're upgrading from an existing version of Mirage, you can run the following: # Using npm npm install -D ember-cli-mirage@X.X.X # Using yarn yarn add -D ember-cli-mirage@X.X.X Full Changelog You can view all of Mirage's release notes on our Releases page. 3.0 Upgrade guide Ensure that all the imports are updated for the objects that were moved to MirageJS. This is generally the imports in the files in the mirage directory. // from import { Model } from 'ember-cli-mirage'; //to import { Model } from 'miragejs'; Previous the file mirage/config.js was a exported default function that defined only your routes. Since MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS. Change the routes function to no longer be exported as the default function and give it a name, we suggest routes. Add the below boilerplate code to the top of the mirage/config.js. The end result would look like this. import { discoverEmberDataModels, } from 'ember-cli-mirage'; export default function (config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } // This would be your old default export function renamed function routes() { } The environment variable discoverEmberDataModels is now longer used. If you wish to not have ember-cli-mirage auto discover the models, just remove the ...discoverEmberDataModels(), 2.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Update import paths for miragejs imports 1.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Remove Faker.js When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call app.import in order to use the library in your application code. Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for Faker.js, a useful library to have alongside your Mirage factory definitions. There's a few problems with this, most notably that users had to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version. Now, thanks to Ember Auto Import, this is no longer the case. Using dependencies directly from npm is painless – just yarn/npm install them and import them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you. This also means that users can easily manage their project's version of Faker (and other similar dependencies) independently of the version of Mirage they're using. For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change. Here are the steps you'll need to take to fix this: Install Ember Auto Import (if it's not already installed) ember install ember-auto-import Install Faker.js directly from npm: yarn add -D faker # or npm install --save-dev faker Change all imports of faker from the ember-cli-packge to import directly from faker: - import { Factory, faker } from 'miragejs'; + import { Factory } from 'miragejs'; + import faker from 'faker'; There is a codemod that will do this for you, thanks to the gracious work of Casey Watts. Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \"useful\" additions. I thought this was a good idea at the time... it wasn't. 🙈 You can look at the module from v0.4.15 to see that we added the faker.list.random, faker.list.cycle and faker.random.number.range methods, so if you use these methods too, you'll need to refactor them. Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS: For faker.list.random, use faker.random.arrayElement: countries() { - return faker.list.random([ 'United States of America', 'Canada', 'Mexico' ]); + return faker.random.arrayElement([ 'United States of America', 'Canada', 'Mexico' ]); } For faker.list.cycle, use the remainder (modulo) operator: countries(i) { - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; + + return countries[i % countries.length]; } For faker.random.number.range, use faker.random.number with min and max options: age() { - return faker.random.number.range(18, 65); + return faker.random.number({ min: 18, max: 65 }); } After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like Chance.js, and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control. 2. New import for setupMirage Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem. // Before import setupMirage from \"ember-cli-mirage/test-support/setup-mirage\"; // After import { setupMirage } from \"ember-cli-mirage/test-support\"; 3. Remove deprecated forms of create, createList and normalizedRequestAttrs There are several places in Mirage's APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in. This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we're moving to 1.0, we're removing this deprecated/unintentional behavior. server.create and server.createList were coded to take a singularized model name, e.g. server.create('user'). It just so happens that server.create('users') also works. That pluralized version is now removed from Mirage. If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like server.create('users') to server.create('user'). Note this also applies to server.createList – the correct form is server.createList('user', 3), and the pluralized form server.createList('users', 3) is now unsupported. this.normalizedRequestAttrs in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. In this case, you can call this.normalizedRequestAttrs('blog-post') to tell Mirage to expect the payload to be for a blog-post model. This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. It just so happened that this.normalizedRequestAttrs('blogPost') also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. The correct usage is this.normalizedRequestAttrs('blog-post'). Using the camelized version of the model name is no longer supported. If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! 4. The normalizeIds serializer property now defaults to true This applies to the ActiveModelSerializer and RestSerializer. The normalize property on serializers helps Mirage's shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly. There was a gap in the default normalize method for a long time, in that it didn't take REST payloads that included foreign keys and looked like let payload = { contact: { id: 1, name: \"Link\", address: 1 } }; and turn that address key into a proper JSON:API relationship: data: { type: 'contacts', id: 1, attributes: { name: 'Link' }, relationships: { address: { data: { type: 'address', id: 1 } } } } We added this feature a while ago, and it's controlled with the normalizeIds property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn't be a breaking change.) We're now making true the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. 0.3.x → 0.4 Upgrade guide There is one primary change in 0.4 that could break your 0.3 app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being included in the payload. This actually goes against JSON:API's design. Foreign keys in the payload are known as Resource Linkage and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a post came back like this: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { data: { type: 'users', id: '1' } } } } } and you forgot to ?include=author in your GET request, Ember Data would potentially use the user:1 foreign key and lazily fetch the author by making a request to GET /authors/1. This is problematic because This is not how foreign keys are intended to be used It'd be better to see no data and fix the problem by going back up to your data-loading code and add ?include=author to your GET request, or If you do want your interface to lazily load the author, use resource links instead of the resource linkage data: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { links: { related: '/api/users/1' } } } } } Resource links can be defined on Mirage serializers using the links method (though including is likely the far more simpler and common approach to fetching related data). So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). This behavior is configurable via the alwaysIncludeLinkageData key on your JSONAPISerializers. It is set to false by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to true: // mirage/serializers/application.js import { JSONAPISerializer } from \"ember-cli-mirage\"; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource links or resource linkage data, and to update your Mirage code accordingly to give you the most faithful representation of your server. 0.2.x → 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. In 0.2, the following model definitions // mirage/models/author.js import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); would have generated a \"schema\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from post to author. To have a two-way sync'd relationship, known as an inverse, you'd need to define both sides of the relationship: // mirage/models/author.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ posts: hasMany() }); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); Practically speaking, to upgrade you'll need to go through your code and update relationships that implicitly had inverses (from 0.2.x's hasMany and belongsTo behavior) and update them to define both sides. This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you'd also need the author to have a postIds: [] array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.) Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it's probably because of something I haven't thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help! For more information on the motivation behind change, please read the 0-3 beta series release blog post. 0.1.x → 0.2 Upgrade guide If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: The default Mirage directory has changed. The default Mirage directory has moved from /app/mirage to /mirage. When you install 0.2.0, the default blueprint will add the /mirage directory to your project. You can delete it and move your current Mirage files to the new location with something like rm -rf mirage mv app/mirage mirage from the root of your project. Mirage's directory is also customizable (Although you should move it from the /app directory or else it will not be removed from the build in production mode). All multiword filenames are dasherized. In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. blog_posts: []), just name your file fixtures/blog_posts.js. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change /mirage/factories/blog_post.js /mirage/fixtures/blog_post.js # etc. to /mirage/factories/blog-post.js /mirage/fixtures/blog-post.js You will then use the new Serializer layer to do things like format keys in your json payloads. All JavaScript properties are camelCased. Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be db.blog_posts, and your factory keys might be first_name() {..}. Looks pretty cool right? Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) You'll need to update your route handlers, which may look like this: let posts = db.blog_posts.filter(p => p.author_id === 1); to let posts = db.blogPosts.filter(p => p.authorId === 1); Note that everything is camelCased, including foreign keys. Similarly, factories that look like export default Factory.extend({ first_name() { return faker.name.firstName(); }, last_name() { return faker.name.firstName(); } }); should be changed to export default Factory.extend({ firstName() { return faker.name.firstName(); }, lastName() { return faker.name.firstName(); } }); This goes for all attrs that server.create takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. Mirage now has its own Model layer (an ORM). In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. To create a model, use ember g mirage-model blog-post This will create a file like import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); Having that file sets up the db.blogPosts collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. We needed to add models for association support (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the models guide and serializers guide to see how having models can simplify your Mirage server. We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. The ORM object schema is now injected into route handlers. In Mirage 0.1.x, the db was the first parameter injected into route handlers: this.get(\"/posts\", function(db, request) { // work with db }); Now, the schema object is, so you can take advantage of the Model layer. Fortunately, the db hangs directly off of the schema, so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to this.get(\"/posts\", function({ db }, request) { // work with db }); and then start opting-in to the ORM (and using schema) one route handler at a time. Specify a Serializer. If you're using shorthands, you'll need to pick a serializer in /mirage/serializers/application.js. See the serializers guide for details. You can always view the full changelog to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please open an issue! ","route":"docs.getting-started.upgrade-guide.index","keywords":[]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"id":"template:docs/getting-started/upgrade-guide/v2-deprecations","type":"template","title":"Deprecations Added in v2.x of ember-cli-mirage","text":" Deprecations Added in v2.x of ember-cli-mirage miragejs re-exports only exporting routes as the default function ","route":"docs.getting-started.upgrade-guide.v2-deprecations","keywords":[]},"template:docs/getting-started/what-is-mirage":{"id":"template:docs/getting-started/what-is-mirage","type":"template","title":"What is Mirage?","text":" What is Mirage? Mirage is a JavaScript library that lets frontend developers mock out backend APIs. Unlike other mocking libraries, Mirage makes it easy to reproduce dynamic scenarios that are typically only possible when using a true production server. Equipped with a Mirage server, a frontend developer can build, test, and even share a complete working Ember application without having to use or configure any backend services. Why? Mirage was originally built to bring conventions to some home-grown HTTP mocking code that was getting unwieldy. It ended up proving most useful when it enabled frontend developers to work on their apps without having to rely on any local or staging backend services as part of their normal development workflow. Since then, Mirage has focused on making it as easy as possible for Ember developers to maintain a mock server alongside their codebase. How it works Mirage runs in the browser. It uses Pretender.js to intercept and respond to any network requests your Ember app makes, letting you build your app as if it were talking to a real server. In this way, you can develop and test your app against various server states without having to modify any application code. In addition to intercepting HTTP requests, Mirage provides a mock database and helper functions that make it easy to simulate dynamic backend services. Mirage borrows concepts from server-side frameworks like routes to handle HTTP requests a database and models for storing data and defining relationships factories and fixtures for stubbing data, and serializers for formatting HTTP responses to make it easy to simulate production server behavior. Alternatives These other libraries solve similar problems to Mirage and might be a better fit for your needs: Polly.js, a library for recording and replaying HTTP interactions Pretender.js, the low-level HTTP interceptor powering Mirage Ember Data Factory Guy, factories for Ember apps powered by Ember Data ","route":"docs.getting-started.what-is-mirage","keywords":[]},"template:docs/route-handlers/functions":{"id":"template:docs/route-handlers/functions","type":"template","title":"Functions","text":" Functions Function handlers are the most flexible way to write route handlers in Mirage. To define new function handlers, use the get, post, patch (or put) and del methods. Here's an example: // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); Now when your Ember app makes a GET request to /movies, it will receive this data. Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response. this.get('/movies', () => { ... }); this.post('/movies', () => { ... }); this.patch('/movies/:id', () => { ... }); this.del('/movies/:id', () => { ... }); Timing The last argument to a route handler is an options object you can use to adjust the timing. Use this to delay the response of a particular route and see how your Ember app behaves when communicating with a slow network. // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }, { timing: 4000 }); The default delay is 50ms during development, and 0 during testing (so your tests run fast). You can also set a global timing parameter for all routes. Individual timing parameters override the global setting. // mirage/config.js export default function() { this.namespace = 'api'; this.timing = 2000; this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); this.get('/complex-query', () => { return [1, 2, 3, 4, 5]; }, { timing: 3000 }); } If you want to add delays to a test, you can override the timing for individual tests by putting the timing parameter in your test test('this route works with a delay', function() { server.timing = 10000; // ... }); Because the server is reset after each test, this option won't leak into the rest of your suite. Accessing the data layer Route handlers receive schema as their first parameter, which lets them access Mirage's data layer: this.get('/movies', (schema) => { return schema.movies.all(); }); Most of your route handlers will interact with the data layer in some way. The second parameter is the request object, which contains information about the request your Ember app made. For example, you can access dynamic URL segments from it: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); You can also access the request body, for example to handle a POST or PATCH request that contains data sent over by the Ember app: this.post('/movies', (schema, request) => { let title = JSON.parse(request.requestBody).title; return schema.movies.create({ title }); }); The normalizedRequestAttrs helper (documented below) provides some sugar for working with the request data. Dynamic paths and query params The request object that's injected into your route handlers contains any dynamic route segments and query params. To define a route that has a dynamic segment, use colon syntax (:segment) in your path. The dynamic piece will be available via request.params.[segment]: this.get('/authors/:id', (schema, request) => { let id = request.params.id; return schema.authors.find(id); }) Query params from the request can also be accessed via request.queryParams.[param]. Helpers There are several helpers available when writing function route handlers. serialize This helper returns the JSON for the given Model or Collection after passing it through the Serializer layer. It's useful if you want to do some final munging on the serialized JSON before returning it. this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta = { page: 1 }; return json; }); By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer name as the second argument: this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies, 'sparse-movie'); json.meta = { page: 1 }; return json; }); normalizedRequestAttrs This helper returns the body of a request in a normalized form, suitable for working with and creating records. For example, if your Ember app makes a POST request with this data // POST /users { data: { type: 'users', attributes: { 'first-name': 'Conan', 'middle-name': 'the', 'last-name': 'Barbarian' }, relationships: { team: { data: { type: 'teams', id: 1 } } } } } then normalizedRequestAttrs() could be used like this this.post('/users', function(schema, request) { let attrs = this.normalizedRequestAttrs(); /* attrs = { firstName: 'Conan', middleName: 'the', lastName: 'Barbarian', teamId: '1' } */ return schema.users.create(attrs); }); Note that attribute keys were camelCased, and the team foreign key was extracted. This is because a user owns the team foreign key; if another relationship were included in the request but the user did not own its foreign key, it would not have been extracted. This helper method leverages your serializer's normalize method. In the example above, it's assumed that the app was using the JSONAPISerializer, which comes with the #normalize method already written. If you're not using one of the bundled serializers, you'll need to implement #normalize and have it return a JSON:API document to take advantage of this method. Additionally, you'll need to use a full function here, as opposed to an ES6 arrow function (e.g () => { ... }). This is because normalizedRequestAttrs requires the this context from the function handler, and an arrow function would bind this from the outer scope. normalizedRequestAttrs() relies on a modelName to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the modelName to the helper as the first argument: this.patch('/users/edit/:id', function(schema, request) { let attrs = this.normalizedRequestAttrs('user'); // ... }); Status codes and headers By default, Mirage sets the HTTP status code of a response based on the verb being used for the route: GET is 200 PATCH/PUT is 204 POST is 201 DEL is 204 PATCH/PUT and POST change to 200 if there is a response body. Additionally, a header for Content-Type is set to application/json. You can customize both the response code and headers by returning an instance of the Response class in your route handler: // mirage/config.js import { Response } from 'miragejs'; export default function() { this.post('/authors', function(schema, request) { let attrs = JSON.parse(request.requestBody).author; if (attrs.name) { return schema.authors.create(attrs); } else { return new Response(400, { some: 'header' }, { errors: ['name cannot be blank'] }); } }); } External origins You can use Mirage to simulate other-origin requests. By default, a route like this.get('/contacts', ...) will hit the same origin that's serving your Ember app. To handle a different origin, use a fully qualified domain name: this.get('http://api.twitter.com/v1', ...) If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via urlPrefix: // mirage/config.js this.urlPrefix = 'https://my.api.com'; // This route will handle requests to https://my.api.com/contacts this.get('/contacts', ...) That's it on writing low-level function route handlers! Function route handlers are flexible, but also cumbersome to write out for every endpoint. If you're working with an API that's conventional enough, hopefully you'll be writing fewer function route handlers and more Shorthands, which we'll discuss in the next section. ","route":"docs.route-handlers.functions","keywords":[]},"template:docs/route-handlers/shorthands":{"id":"template:docs/route-handlers/shorthands","type":"template","title":"Shorthands","text":" Shorthands APIs have become more standardized, so Mirage has the concept of Shorthands to deal with common scenarios. Shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. For example, this function route handler this.get('/movies', (schema, request) => { return schema.movies.all(); }); is pretty standard: it responds to a URL path with a collection of the same name. The Shorthand form of this is this.get('/movies'); This is a complete route handler. It infers the model name from the last part of the URL, and returns the corresponding collection. Returning a single movie by ID is just as easy: this.get('/movies/:id'); There are also Shorthands for creating and editing data. For example, this function route handler creates a new movie: this.post('/movies', (schema, request) => { let attrs = JSON.parse(request.requestBody).movie; return schema.movies.create(attrs); }); It's also pretty standard: it creates a new model using the attributes from the request payload. The equivalent Shorthand is this.post('/movies'); See the full list of available Shorthands below. Shorthands use default status codes based on the HTTP verb: GET, PATCH/PUT and DEL are 200 POST is 201 GET Shorthands Fetching a collection: // Shorthand this.get('/contacts'); // finds type by singularizing url this.get('/contacts', 'users'); // optionally specify the collection as second param // equivalent this.get('/contacts', (schema) => { return schema.contacts.all(); // users in the second case }); Fetching a model: // Shorthand this.get('/contacts/:id'); // finds type by singularizing url this.get('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.get('/contacts/:id', (schema, request) => { let id = request.params.id; return schema.contacts.find(id); // users in the second case }); Fetching multiple models by ID (for example, GET /contacts?ids=1,3): // Shorthand this.get('/contacts', { coalesce: true }); this.get('/contacts', 'users', { coalesce: true }); // equivalent this.get('/contacts', ({ contacts }, request) => { let ids = request.queryParams.ids; return contacts.find(ids); // users in the second case }); POST Shorthands Creating a resource: // Shorthand this.post('/contacts'); // finds type by singularizing url this.post('/contacts', 'user'); // optionally specify the type as second param // equivalent this.post('/contacts', function(schema, request) { let attrs = this.normalizedRequestAttrs(); return schema.contacts.create(attrs); }); For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. PATCH/PUT Shorthands Updating a resource: // Shorthand (these also work with this.put) this.patch('/contacts/:id'); // finds type by singularizing url this.patch('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.patch('/contacts/:id', function(schema, request) { let id = request.params.id; let attrs = this.normalizedRequestAttrs(); return schema.contacts.find(id).update(attrs); }); For this PATCH shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. DELETE Shorthands Destroying a resource: // Shorthand this.del('/contacts/:id'); // finds type by singularizing url this.del('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.del('/contacts/:id', (schema, request) => { let id = request.params.id; schema.contacts.find(id).destroy(); }); Destroying a resource and related models: // Shorthand this.del('/contacts/:id', ['contact', 'addresses']); // equivalent this.del('/contacts/:id', ({ contacts }, request) => { let id = request.params.id; let contact = contacts.find(id); contact.addresses.destroy(); contact.destroy(); }); To use this Shorthand, you must have the appropriate hasMany/belongsTo relationships defined in your data layer. Resource helper The resource helper lets you define multiple Shorthands for a given resource: // Resource helper usage this.resource('contacts'); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.patch('/contacts/:id'); // and this.put('/contacts/:id') this.del('/contacts/:id'); You can also whitelist which Shorthands will be defined using the only option: this.resource('contacts', { only: [ 'index', 'show' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); or which route handlers shouldn't be defined using except option: this.resource('contacts', { except: [ 'update' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.del('/contacts/:id'); If your route path and collection names do not match, you can define a relative or absolute path using the path option: this.resource('blog-posts', { path: '/posts' }); // Shorthands defined this.get('/posts', 'blog-posts'); this.get('/posts/:id', 'blog-posts'); this.post('/posts', 'blog-posts'); this.put('/posts/:id', 'blog-posts'); this.patch('/posts/:id', 'blog-posts'); this.del('/posts/:id', 'blog-posts'); Here is the full reference of the actions' names you can pass to the only / except options and the Shorthands they stand for: Action | Shorthand ------------------------------ index | this.get('/contacts') show | this.get('/contacts/:id') create | this.post('/contacts') update | this.patch('contacts/:id') (or this.put) delete | this.del('/contacts/:id') Shorthands are a key part of staying productive in your frontend codebase, but they only work so well because Mirage has a Data Layer that's aware of your application's domain model. We'll cover how it works in the next few sections of the docs. ","route":"docs.route-handlers.shorthands","keywords":[]},"template:docs/testing/acceptance-tests":{"id":"template:docs/testing/acceptance-tests","type":"template","title":"Acceptance tests","text":" Acceptance tests Acceptance testing your Ember app involves verifying some user behavior. For example, you may want to test that the user can view a list of movies on your app's homepage. Many of these tests rely on a given server state. In other words, you want to test that, given ten movie resources exist on the server at the time the user boots up the app, when the user visits the homepage they see a list of 10 movies. Mirage was originally built specifically for these sorts of high-level tests. Let's see how it works. Assuming you're using Application Tests (introduced in Ember 3.0), add the setupMirage hook to the top of your test file: import { setupApplicationTest } from 'ember-qunit'; + import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); (If you are using pre-3.0 style tests, Mirage should boot automatically via an initializer. The only other difference is that Mirage is accessed via server, a global, whereas in 3.0-style tests Mirage is accessed via this.server. The rest of this guide will assume 3.0-style tests, but you can just use server in place of this.server and the rest of the documentation applies the same.) Now we can run your Ember app's test suite with ember t -s. In the test environment, Mirage will load all your route handlers from mirage/config.js, but it will ignore your seed data from mirage/scenarios/default.js. That means each test starts off with a clean database state. Within each test, you can use your factories to define your initial server state: test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); After each test, Mirage's server will be reset, so none of this state will leak across tests. Keeping your tests focused Factories are important in keeping code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten movies, given those movies existed on the server. So, the server.createList('movie', 10) call was directly in the test. Say we wanted to test that when the user visits a details route for a movie titled \"Interstellar,\" they would see that title in an

tag. One way to accomplish this would be to update the movie factory itself: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Interstellar' }); The problem with this approach is that this change is very specific to this test. Suppose another test needed to verify something different about movies with different titles. Changing the factory to suit that case would break this test. For this reason, you should use create and createList to override specific attributes of your model. This will keep code relevant to your test near your test, without making the rest of your test suite brittle. test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); test(\"I see the movies's title on the detail route\", await function(assert) { let movie = this.server.create('movie', { title: 'Interstellar' }); await visit(`/movies/${movie.id}`); assert.dom('h1').hasText('Interstellar'); }); Arrange, Act, Assert Mirage recommends using the Arrange, Act, Assert approach to write tests. You'll sometimes hear this pattern referred to as AAA testing (\"triple-A testing\"). You can see this structure in our test from above: test('I can view the movies', async function(assert) { // ARRANGE this.server.createList('movie', 10); // ACT await visit('/'); // ASSERT assert.dom('li.movie').exists({ count: 10 }); }); There are of course times where it makes sense to break this rule (for example to add some extra assertions near the beginning or middle of a test), but in general you should strive to follow the pattern. Testing errors To test how your Ember app responds to a server error, overwrite a route handler within a test: test('the user sees an error if the save attempt fails', async function(assert) { this.server.post('/questions', () => ({ errors: [ 'The database went on vacation' ] }), 500); await visit('/'); await click('.new'); await fillIn('input', 'New question'); await click('.save'); assert.dom('h2').hasText('The database went on vacation'); }); This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to /questions in your config.js file will be used again. Using scenarios in testing Typically you should reserve the scenarios/default.js file for development, so changes to it don't affect the rest of your test suite. That's why Mirage doesn't autoload this module during tests. If there's some logic you'd like to share between your development scenario and your tests, you can always make a new module under scenarios and import it in both places. If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: Create the module // scenarios/shared.js export default function(server) { server.loadFixtures('countries'); server.createList('event', 10); }; ...load it in your default scenario import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); await visit('/contacts'); assert.dom('p').exists({ count: 3 }); }); ...and then also load it in your tests (or even a common test setup function): import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); // ... }); This same sort of pattern will work for Integration and Unit tests as well. Those are the basics of Acceptance Testing with Mirage! Next let's talk about Integration and Unit tests. ","route":"docs.testing.acceptance-tests","keywords":[]},"template:docs/testing/assertions":{"id":"template:docs/testing/assertions","type":"template","title":"Assertions","text":" Assertions Most of your tests will assert against your Ember app's UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you'll assert that your UI is in the state you expect it to be. But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server. To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend. Asserting against Mirage's database The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage's database. If the correct data makes it there, you'll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect. Here's an example: test(\"I can change the lesson's title\", async function(assert) { this.server.create('lesson', { title: 'My First Lesson' }) await visit('/'); await click('.Edit') await fillIn('input', 'Updated lesson'); await click('.Save'); // Assert against our app's UI assert.dom('h1').hasText('Updated lesson'); // Also check that the data was \"persisted\" to our backend assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); }); This is a great way to gain some extra confidence that your Ember app is sending over the data you expect. Asserting against Mirage Models It can also be useful to assert against Mirage's ORM models, to verify things like updates to your model's relationships: test('I can add a tag to a post', async function(assert) { let programming = this.server.create('tag', { name: 'Programming' }); let post = this.server.create('post'); await visit(`/posts/${post.id}/edit`); await select('.tags', 'Programming'); await click('.save'); assert.dom().includesText('Saved!'); assert.equal(post.reload().tagIds.includes(programming.id)); }); The reload method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected. Asserting against models is basically another way to verify Mirage's database data is correct. Asserting against handled requests and responses You can also assert against the actual HTTP requests and responses that are made during your test. To do this, first enable Pretender's trackedRequests feature by enabling the trackRequests environment option: // config/environment.js module.exports = function(environment) { if (environment === 'test') { ENV['ember-cli-mirage'] = { trackRequests: true }; } } This feature is disabled by default to avoid memory issues during long development sessions. Now Mirage will track every request (along with the associated response) and make them available to you via server.pretender.handledRequests. That way you can assert against requests in that array at the end of your test. test(\"I can filter the table\", async function(assert) { this.server.createList('movie', 5, { genre: 'Sci-Fi' }); this.server.createList('movie', 3, { genre: 'Drama' }); await visit('/'); await select('.genre', 'Sci-Fi'); // Assert against our app's UI assert.dom('tr').exists({ count: 5 }); // Also assert against the HTTP request count & query let requests = this.server.pretender.handledRequests; assert.equal(requests.length, 1); assert.deepEqual(requests[0].queryParams, { 'filter[genre]': 'Sci-Fi' }); }); In general we recommend asserting against Mirage's database and your UI, as the specifics of your app's HTTP requests should be considered implementation details of the behavior you're actually interested in verifying. But there's certainly valid reasons to drop down and assert against HTTP data. And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. ","route":"docs.testing.assertions","keywords":[]},"template:docs/testing/integration-and-unit-tests":{"id":"template:docs/testing/integration-and-unit-tests","type":"template","title":"Integration and unit tests","text":" Integration and unit tests While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests. Let's say you have a data-fetching component, and you want to write a rendering test to verify its behavior. You can import and use the setupMirage function directly in your rendering test, and use Mirage just like you would in an acceptance test. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can fetch records', async function(assert) { this.server.create('movie', { title: 'Interstellar' }); await render(hbs`

{{model.title}}

`); assert.equal(this.element.textContent, 'Interstellar'); }); }); If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your mirage/config.js file, you can use this.server to setup new routes. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it renders an error state', async function(assert) { this.server.get( '/movies/:id', () => ({ errors: [ 'Something went wrong' ]}), 500 ); await render(hbs` {{#if error}}

Whoops!

{{/if}}
`); assert.equal(this.element.textContent, 'Whoops!'); }); }); Creating Ember Data models on the client with Mirage Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some. For example, let's say we were writing a rendering test to verify the behavior of our component: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // get the article await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); How might we test this? It might be tempting to use Mirage's server.create, since you probably already have factories defined: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // 🔴 Don't do this let article = this.server.create('article', { title: 'Old title' }); this.set('article', article); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); But you shouldn't do this. Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don't actually know anything about your Ember app. Mirage models exist solely in your \"backend\", and are only useful in helping you create your mock server definition. The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server. So, in the same way that you wouldn't create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component. // 🔴 Don't do this // `article` is a Mirage model. It should never be consumed directly by Ember code. let article = this.server.create('article'); this.set('article', article); await render(hbs` `); So, how might we get an article materialized into Ember Data's store so we can test this component, while still leveraging our Mirage factory definitions? Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this. Using findRecord and findAll The first approach is to lookup Ember Data's store, and use it to find the record (just like your Ember application's routes do): import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 1: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); let store = this.owner.lookup('service:store'); let article = await store.findRecord('article', serverArticle.id); this.set('article', article); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Writing a helper to push Mirage's database The second approach is to make a helper that serializers Mirage's database into JSON and pushes that JSON into your Ember Data store. The actual logic might depend on the configuration of your Mirage server, but if you're following all of Mirage's conventions it should look roughly like this: // your-app/tests/helpers/push-mirage-into-store.js import { getContext } from '@ember/test-helpers'; import { run } from '@ember/runloop'; export default function() { let context = getContext(); let store = context.owner.lookup('service:store'); Object.keys(context.server.schema) .filter(key => context.server.schema[key].all !== undefined) // Get the resources .forEach(resource => { let models = context.server.schema[resource].all(); let modelName = models.modelName; let serializer = context.server.serializerOrRegistry.serializerFor(modelName); let originalAlwaysIncludeLinkageData = serializer.alwaysIncludeLinkageData; serializer.alwaysIncludeLinkageData = true; let json = serializer.serialize(models); serializer.alwaysIncludeLinkageData = originalAlwaysIncludeLinkageData; run(() => { store.pushPayload(json); }); }); } Now in your test, call your helper to seed Ember Data's store, and then use peekRecord to materialize and work with Ember Data records: import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; import pushMirageIntoStore from 'YOUR-APP/tests/helpers/push-mirage-into-store'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 2: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); pushMirageIntoStore(); let store = this.owner.lookup('service:store'); let article = store.peekRecord('article', serverArticle.id); this.set('article', article); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Something like pushMirageIntoStore will probably make its way into Mirage at some point. Now that you've seen how to use setupMirage outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server! Next, we discuss some ways you can go about asserting against your Mirage mock server. ","route":"docs.testing.integration-and-unit-tests","keywords":[]},"template:docs/testing/setup-mirage":{"id":"template:docs/testing/setup-mirage","type":"template","title":"setupMirage test helper","text":" setupMirage test helper In your tests (acceptance, integration and unit) you can import the setupMirage test helper to start the Mirage server. Passing the hooks from the test module allows the mirage server to be created and shutdown before and after each test. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); The second parameter (optional) allows defining the mirage server to be used for this set of tests. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import makeServer from 'app-name/mirage/config'; // replace app-name with your app name module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); If it is not desirable to use the default config from the mirage directory you could import any other file that implements the same function, or even define the function locally or inline import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { discoverEmberDataModels } from 'ember-cli-mirage'; import { createServer } from 'miragejs'; const makeServer = function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { this.namespace = \"api\" this.timing = 2000 this.get(\"/movies\", () => { return [\"Interstellar\", \"Inception\", \"Dunkirk\"] }) } }; return createServer(finalConfig); } module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); ","route":"docs.testing.setup-mirage","keywords":[]},"template:index":{"id":"template:index","type":"template","title":"Productive","text":" Productive Spend less time wiring up HTTP stubs, and get back to developing your app. Test-worthy Use factories to define your server's state per test. Acceptance testing just got a whole lot easier. Shareable Share a functional prototype of your app that runs entirely in the client – before writing a single line of your API. Read the docs ","route":"index","keywords":[]},"template:not-found":{"id":"template:not-found","type":"template","title":"Not found","text":" Not found This page doesn't exist. Head home? ","route":"not-found","keywords":[]},"template:templates/application":{"id":"template:templates/application","type":"template","title":null,"text":" Blog ","route":"templates.application","keywords":[]},"template:templates/blog":{"id":"template:templates/blog","type":"template","title":null,"text":" ","route":"templates.blog","keywords":[]},"template:templates/blog/detail":{"id":"template:templates/blog/detail","type":"template","title":" ","text":" ← All posts Comments commented Want to chime in? View the thread on GitHub. ","route":"templates.blog.detail","keywords":[]},"template:templates/blog/error":{"id":"template:templates/blog/error","type":"template","title":"We're sorry...","text":"We're sorry... ","route":"templates.blog.error","keywords":[]},"template:templates/blog/index":{"id":"template:templates/blog/index","type":"template","title":"Blog","text":" Blog ","route":"templates.blog.index","keywords":[]},"template:templates/docs":{"id":"template:templates/docs","type":"template","title":null,"text":" ","route":"templates.docs","keywords":[]},"template:templates/docs/advanced/customizing-the-inflector":{"id":"template:templates/docs/advanced/customizing-the-inflector","type":"template","title":"Customizing the inflector","text":" Customizing the inflector When using Ember Data, you'll sometimes find yourself needing to customize the inflection rules used by your models. For example, say you had an Advice model. By default, Ember's inflector pluralizes this as \"advices\" import { pluralize } from 'ember-inflector'; pluralize(\"advice\"); // advices Ember Data uses these inflection rules for things like building its conventional URLs. For example, this.store.findAll('advice'); would result in a GET request to /api/advices. Mirage also relies on the inflector for its conventions. For example, the resource Shorthand // mirage/config.js this.resource('advice'); might use inflection rules to try to look up the \"advices\" collection or database table. The guides document the best way to configure these inflection rules. At the time of this writing, here's how you'd configure the inflector to treat \"advice\" as an uncountable word (i.e. a word with no plural form): // app/initializers/custom-inflector-rules.js import Inflector from 'ember-inflector'; export function initialize(/* application */) { const inflector = Inflector.inflector; // Tell the inflector that the plural of \"advice\" is \"advice\" inflector.uncountable('advice'); } export default { name: 'custom-inflector-rules', before: 'ember-cli-mirage', initialize }; Make sure to use before: \"ember-cli-mirage\" so this runs before Mirage initializes itself. As long as you follow this approach, Mirage should respect your custom inflector rules. With the above rule, this.store.findAll('advice'); would now result in a GET request to /api/advice, and // mirage/config.js this.resource('advice'); would respond correctly to that request, as well as correctly handle all other operations to the Advice resource. ","route":"templates.docs.advanced.customizing-the-inflector","keywords":[]},"template:templates/docs/advanced/environment-options":{"id":"template:templates/docs/advanced/environment-options","type":"template","title":"Environment options","text":" Environment options Set these options via the ENV['ember-cli-mirage'] variable in your config/environment.js file: // config/environment.js ... if (environment === 'production') { ENV['ember-cli-mirage'] = { enabled: true }; } enabled By default, your Mirage server will run in test mode, and in development mode as long as the --proxy option isn't passed. To change this default behavior, set enabled to either true or false in your ENV config. For example, to enable in production (e.g. to share a working prototype before your server is ready): // config/environment.js ... if (environment === 'production') { ENV['ember-cli-mirage'] = { enabled: true }; } To disable in development, // config/environment.js ... if (environment === 'development') { ENV['ember-cli-mirage'] = { enabled: false }; } trackRequests A boolean that controls whether Pretender's trackRequests feature is enabled. By default it is disabled to avoid memory issues during long development sessions. This should be set in the mirage/config.js options. Defaults to false. export default function(config) { let finalConfig = { ...config, trackRequests: true, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } This feature is useful for asserting against HTTP requests and responses during tests. See the \"Asserting against handled requests and responses\" section of the to learn more. excludeFilesFromBuild Defaults to false. By default, Mirage's files are included in your Ember app's build in non-production environments. This is in case you want to use Mirage via ember serve by visiting /tests, since that's an app with a build-time environment of development but a run-time environment of test. You can explicilty exclude Mirage's files from your Ember app's build by setting excludeFilesFromBuild to true. useDefaultPassthroughs Defaults to true. If true, Mirage will add some default passthrough routes to your server. Currently we add a single route http://localhost:0/chromecheckurl which is used by iOS for URL verification. directory Configure which directory contains your Mirage server definition. The default directory is /mirage (from the root of your project). For example, to have your server definition under /app/mirage, // config/environment.js ... ENV['ember-cli-mirage'] = { directory: 'app/mirage' }; discoverEmberDataModels Tells Mirage whether to automatically infer its schema from the host application's Ember Data models and relationships. Defaults to true. If Ember Data models are present, predefines Mirage's models and relationships. If Ember Data models are not present, has no effect. You can disable by setting to false. You might want to do this if you run into an edge case/issue where the autodiscovery code causes issues in your app's environment (for example, if you have a complex engines setup). // config/environment.js ... ENV['ember-cli-mirage'] = { discoverEmberDataModels: false }; ","route":"templates.docs.advanced.environment-options","keywords":[]},"template:templates/docs/advanced/mocking-guids":{"id":"template:templates/docs/advanced/mocking-guids","type":"template","title":"Mocking GUIDs","text":" Mocking GUIDs Some applications use GUIDs (or UUIDs) instead of auto-incrementing integers as identifiers for their models. Mirage supports the ability to overwrite how its database assigns IDs to new records via the IdentityManager class. You can generate model-specific managers or an application-wide manager to customize how your database behaves. To generate a new identity manager, use the blueprint: ember generate mirage-identity-manager A custom identity manager must implement these methods: fetch, which must return an identifier not used yet. set, which is called with an id of a record being insert in mirage's database. reset, which should reset database to initial state. Here's an example implementation for an identity manager that mocks GUIDs: import { v4 as getUuid } from \"ember-uuid\"; export default class { constructor() { this.ids = new Set(); } // Returns a new unused unique identifier. fetch() { let uuid = getUuid(); while (this.ids.has(uuid)) { uuid = getUuid(); } this.ids.add(uuid); return uuid; } // Registers an identifier as used. Must throw if identifier is already used. set(id) { if (this.ids.has(id)) { throw new Error(`ID ${id} has already been used.`); } this.ids.add(id); } // Resets all used identifiers to unused. reset() { this.ids.clear(); } } ","route":"templates.docs.advanced.mocking-guids","keywords":[]},"template:templates/docs/advanced/server-configuration":{"id":"template:templates/docs/advanced/server-configuration","type":"template","title":"Server configuration","text":" Server configuration The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. Typically, the /mirage/config.js file contains a single default export which is a function defining all your Mirage route handlers. Ember CLI Mirage then uses this function, along with all the other modules you've defined in mirage/models, mirage/fixtures, mirage/factories, and mirage/serializers, to create your Mirage JS server when your app boots up in development and testing. You can now opt in to having more control over exactly how your Mirage server is instantiated using the same code as the mirageJS examples of creating a server by changing your current default export that represents the routes to a normal function, then creating a new default export function that creates the mirageJS server. This new default export function receives a single argument named config, which contains all the factory/fixture/serializer/model modules that exist in your project's /mirage directory. This saves you from having to import each module explicitly and then pass it into your Mirage server, just like you're used to with the default setup. The config argument maps exactly to everything inside of your /mirage directory - notably, it does not contain the autogenerated Mirage model definitions derived from your Ember Data models, which is an important feature of Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper has been provided named discoverEmberDataModels from the ember-cli-mirage package that you can use to augment your config with these models so that your Mirage schema is automatically inferred from your host application's Ember Data models and relationships. The snippet below shows how to do this. Note that the order here matters if you also have models defined in your /mirage/models directory, as those model definitions would \"win\" in the event of a conflict with the ones autodiscovered from Ember Data. (However, most of time if you are inferring your Mirage schema from Ember Data, you shouldn't need to define additional models.) Finally, your route handlers just need to be passed to the routes() key in your Mirage config. You can do this inline, or you can make them a separate function, and organize that function however you choose. You should also add miragejs to your project's dependencies in your package.json file, since you are now importing directly from it. Note that this gives you the added benefit of being able to upgrade miragejs independently of ember-cli-mirage. All the objects from miragejs are re-exported in ember-cli-mirage such as Model, belongsTo, hasMany as well as Fixtures, Traits for example. These should in the future also be imported directly from miragejs as eventually these re-exports will be removed. This will help align the ember-cli-mirage users with the rest of the Mirage JS community. // Example with inline routes import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { // this.namespace = '/api' // this.resource('user') }, }; return createServer(finalConfig); } // Example with routes in an external function import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } Serializers If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your server configuration to have mirage perform this for you. When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage version of the model. With serializers, you may have created a mirage serializer to override some methods, but would still like Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than the way you merge the models. applyEmberDataSerializers will apply the primaryKey and attrs from your ember data serializers to your mirage serializers. If you have not created a mirage serializer it will create one and extend it from your mirage application serializer. Ensure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand how to use primaryKey and transforms. If you have not created a mirage serializer named application, the created serializer will extend EmberDataSerializer directly. // Example of having Mirage adjust/create your serializers similiar to ember data models import { discoverEmberDataModels, applyEmberDataSerializers } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export function makeServer(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, serializers: applyEmberDataSerializers(config.serializers), routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } ","route":"templates.docs.advanced.server-configuration","keywords":[]},"template:templates/docs/advanced/simulating-cookie-responses":{"id":"template:templates/docs/advanced/simulating-cookie-responses","type":"template","title":"Simulating cookie responses","text":" Simulating cookie responses Although Mirage allows setting headers in a response, the XMLHttpRequest spec explicitly forbids access to Set-Cookie and Set-Cookie2 headers. As a result Mirage responses cannot set cookies via headers. However, you can simulate receiving cookies from an ajax call at the browser level by setting them in a route function handler: this.post('/users/login', schema => { // log in for 24 hours let now = new Date(); let cookieExpiration = new Date(now.getTime() + (24 * 3600 * 1000)); document.cookie=`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires=${cookieExpiration.toUTCString()};`; return schema.users.find(1); }); Your Ember client code will now have access to any cookies set using document.cookie. ","route":"templates.docs.advanced.simulating-cookie-responses","keywords":[]},"template:templates/docs/advanced/switching-between-scenarios":{"id":"template:templates/docs/advanced/switching-between-scenarios","type":"template","title":"Switching between scenarios","text":" Switching between scenarios Mirage adds a /scenarios directory to your project, where you'll find a default.js file. The function in this file will run in development mode and act as your \"development seeds\". In testing it's ignored, so that your Mirage server starts out with a clean database. You can then use each test to seed Mirage as needed for that test. In this way, each test acts as its own Mirage scenario. Originally Mirage was going to add first-class support for development-time scenario switching, but currently only the scenarios/default.js file is used by Mirage. However, you can use various strategies to configure the behavior of your default scenario, to support multiple development server states or to facilitate things like running user acceptance testing. For example, you might want to test whether a user can complete a set of tasks specific to unique circumstances defined in a scenario. One strategy you could take is to configure your default scenario file to honor options passed to the runtime environment. For example, say you wanted to be able to run a scenario file like this: MIRAGE_SCENARIO=some-scenario ember s To affect the behavior of scenarios/default.js, add the MIRAGE_SCENARIO ENV variable to your environment/config.js: const { MIRAGE_SCENARIO } = process.env; module.exports = function(environment) { const ENV = { // ...other stuff MIRAGE_SCENARIO, // ...other stuff }; return ENV; } Then access this new config variable in your scenarios/default.js file: // scenarios/default.js import ENV from '../../config/environment'; import visitor from './visitor'; import subscriber from './subscriber'; import administrator from './administrator'; const scenarios = { visitor, subscriber, administrator } const activeScenario = ENV.MIRAGE_SCENARIO || 'visitor'; export default function(server) { const scenario = scenarios[activeScenario]; if (scenario) { scenario(server); } // plus whatever default scenario code you want } Like other Mirage objects, all scenario files must export a function like so: export default function(server) { // server.createList('post', 15); } Note that the server parameter is not provided by default. ","route":"templates.docs.advanced.switching-between-scenarios","keywords":[]},"template:templates/docs/api/item":{"id":"template:templates/docs/api/item","type":"template","title":null,"text":" ","route":"templates.docs.api.item","keywords":[]},"template:templates/docs/data-layer/database":{"id":"template:templates/docs/data-layer/database","type":"template","title":"The Database","text":" The Database At the core of Mirage's data layer is a simple in-memory database. This database stores all of Mirage's initial state, and then your route handlers access and modify that state as you use your application. The database is what allows Mirage to mimic a production server, giving you the ability to write complete dynamic features in your Ember app. Most of your Mirage code will not access the database directly, but rather will interact with it through Mirage's ORM. We'll cover the ORM in the next section of these guides. However, it's good to know that whether or not you use the ORM, you can always interact with the database directly. For example, you could seed it with some data in scenarios/default.js // scenarios/default.js export default function(server) { server.db.loadData({ movies: [ { title: 'Interstellar' }, { title: 'Inception' }, { title: 'Dunkirk' }, ] }); } and then can access it in your route handlers using the schema argument: this.get('/movies', (schema, request) => { return schema.db.movies; }); This route handler would then respond with the data you loaded: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] Note that each record has an id field, since the database assigns all new records an auto-incrementing ID. The most common place you'll use the database directly is in your tests, where you can access it via this.server.db. It can be useful to assert against the state of Mirage's database to verify that your Ember app's network requests are sending over the correct data. // tests/movie-test.js test('I can create a movie', async function(assert) { await visit('/movies/new'); await fillIn('.title', 'The Dark Knight'); await click('.submit'); assert.dom('h2').includesText('New movie saved!'); assert.equal(this.server.db.movies[0].title, 'The Dark Knight'); }); You can view the rest of the Database APIs in the and API reference. Next, we'll learn about Mirage's ORM. ","route":"templates.docs.data-layer.database","keywords":[]},"template:templates/docs/data-layer/factories":{"id":"template:templates/docs/data-layer/factories","type":"template","title":"Factories","text":" Factories One of the main benefits of using Mirage is the ability to quickly put your server into different states. For example, you might be developing a feature and want to see how the UI renders for both a logged-in user and an anonymous user. This is the kind of thing that's a pain when using a real backend server, but with Mirage it's as simple as flipping a JavaScript variable and live-reloading your Ember app. Factories are classes that help you organize your data-creation logic, making it easier to define different server states during development or within tests. Let's see how they work. Defining factories Your first factory Say we have a Movie model defined in Mirage. (Remember, if you're using Ember Data you won't have this file on disk. The Model definition will be automatically generated for you.) // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); To seed Mirage's database with some movies so you can start developing your app, use the server.create method in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.create('movie'); } server.create takes the singular hyphenated form of your model's class name as its first argument. Because we have no Factory defined for a Movie, server.create('movie') will just create an empty record and insert it into the database: // server.db.dump(); { movies: [ { id: '1' } ] } Not a very interesting record. However, we can pass attributes of our own as the second argument to server.create: // mirage/scenarios/default.js export default function(server) { server.create('movie', { title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' }); } Now our database looks like this { movies: [ { id: '1', title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' } ] } and we'll actually be able to develop our UI against realistic data. This is a great way to start, but it can be cumbersome to manually define every attribute (and relationship) when working on data-driven applications. It would be nice if we had a way to dynamically generate some of these attributes. Fortunately, that's exactly what Factories let us do! Let's generate a Factory for our movie using ember g mirage-factory movie which creates this file: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ }); Right now the Factory is empty. Let's define a property on it: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Movie title' }); Now server.create('movie') will use the properties from this factory. The inserted record will look like this: { movies: [ { id: '1', title: 'Movie title' } ] } We can also make this property a function. // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; } }); i is an incrementing index that lets us make our factory attributes more dynamic. If we use the server.createList method, we can quickly generate five movies server.createList('movie', 5); and with the above factory definition, our database will look like this: { movies: [ { id: '1', title: 'Movie 1' }, { id: '2', title: 'Movie 2' }, { id: '3', title: 'Movie 3' }, { id: '4', title: 'Movie 4' }, { id: '5', title: 'Movie 5' } ] } Let's add some more properties to our factory: // mirage/factories/movie.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ title(i) { return `Movie ${i}`; }, releaseDate() { return faker.date.past().toLocaleDateString(); }, genre(i) { let genres = [ 'Sci-Fi', 'Drama', 'Comedy' ]; return genres[i % genres.length]; } }); Here we've installed the Faker.js library to help us generate random dates. Now server.createList('movie', 5) gives us this data: { movies: [ { id: '1', title: 'Movie 1', releaseDate: '5/14/2018', genre: 'Sci-Fi' }, { id: '2', title: 'Movie 2', releaseDate: '2/22/2019', genre: 'Drama' }, { id: '3', title: 'Movie 3', releaseDate: '6/2/2018', genre: 'Comedy' }, { id: '4', title: 'Movie 4', releaseDate: '7/29/2018', genre: 'Sci-Fi' }, { id: '5', title: 'Movie 5', releaseDate: '6/30/2018', genre: 'Drama' }, ] } As you can see, Factories let us rapidly generate different scenarios for our dynamic server data. Attribute overrides Factories are great for defining the \"base case\" of your models, but there's plenty of times where you'll want to override attributes from your factory with specific values. The last argument to create and createList accepts a POJO of attributes that will override anything from your factory. // Using only the base factory server.create('movie'); // gives us this object: { id: '1', title: 'Movie 1', releaseDate: '01/01/2000' } // Passing in specific values to override certain attributes server.create('movie', { title: 'Interstellar' }); // gives us this object: { id: '2', title: 'Interstellar', releaseDate: '01/01/2000' } Think of your factory attributes as a reasonable \"base case\" for your models, and then override them in development and testing scenarios as you have need for specific values. Dependent attributes Attributes can depend on other attributes via this from within a function. This can be useful for quickly generating things like usernames from names: // mirage/factories/user.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ name() { return faker.name.findName(); }, username() { return this.name.replace(' ', '').toLowerCase(); } }); Calling server.createList('user', 3) with this factory would generate this data: [ { id: '1', name: 'Retha Donnelly', username: 'rethadonnelly' } { id: '2', name: 'Crystal Schaefer', username: 'crystalschaefer' } { id: '3', name: 'Jerome Schoen', username: 'jeromeschoen' } ] Relationships In the same way that you use the ORM to create relational data, as this example from the Creating and editing related data section of the illustrates let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', }); you can also create relational data with your factories: let nolan = server.create('director', { name: 'Christopher Nolan' }); server.create('movie', { director: nolan, title: 'Interstellar' }); nolan is a model instance, which is why we can just pass it in as an attribute override when creating the Interstellar movie. This also works when using createList: server.create('actor', { movies: server.createList('movie', 3) }); In this way you use factories to help you quickly create graphs of relational data: server.createList('user', 5).forEach(user => { server.createList('post', 10, { user }).forEach(post => { server.createList('comment', 5, { post }); }); }); This code generates 5 users, each of which has 10 posts with each post having 5 comments. Assuming these relationships are defined in your models, all the foreign keys would be set correctly in Mirage's database. The afterCreate hook In many cases, setting up relationships manually (as shown in the previous section) is perfectly fine. However there are times where it makes more sense to have base case relationships set up for you automatically. Enter afterCreate. It's a hook that's called after a model has been created using the factory's base attributes. This hook lets you perform additional logic on your newly-created models before they're returned from create and createList. Let's see how it works. Say you have these two models in your app: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ post: belongsTo() }); Let's further suppose that in your app, it is never valid to create a post without an associated user. You can use afterCreate to enforce this behavior: // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { post.update({ user: server.create('user') }); } }); The first argument to afterCreate is the object that was just created (in this case the post), and the second is a reference to the Mirage server instance, so that you can invoke other factories or inspect any other server state needed to customize your newly-created object. In this example we're immediately creating a user for this post. That way elsewhere in your app (say a test), you could just create a post server.create('post'); and you'd be working with a valid record, since that post would have an associated user. Now, there's one problem with the way we've implemented this so far. Our afterCreate hook updates the post's user regardless if that post already had a user associated with it. That means that this code let tomster = server.create('user', 'Tomster'); server.createList('post', 10, { user: tomster }); would not work as we expect, since the attribute overrides while the object is being created, but the logic in afterCreate runs after the post has been created. Thus, this post would be associated with the newly created post from the hook, rather than Tomster. To fix this, we can update our afterCreate hook to first check if the newly created post already has a user associated with it. Only if it doesn't will we create a new one and update the relationship. // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); Now callers can pass in specific users server.createList('post', 10, { user: tomster }); or omit specifying a user if the details of that user aren't important server.create('post'); and in both cases they'll end up with a valid record. afterCreate can also be used to create hasMany associations, as well as apply any other relevant creation logic. Traits Traits are an important feature of factories that make it easy to group related attributes. Define them by importing trait and adding a new key to your factory. For example, here we define a trait named published on our post factory: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }) }); You can pass anything into trait that you can into the base factory. We can use our new trait by passing in the name of the trait as a string argument to create or createList: server.create('post', 'published'); server.createList('post', 3, 'published'); The created posts will have all the base attributes, as well as everything under the published trait. You can also compose multiple traits together: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }), official: trait({ isOfficial: true }) }); We can pass our new traits into create or createList in any order: let officialPost = server.create('post', 'official'); let officialPublishedPost = server.create('post', 'official', 'published'); If multiple traits set the same attribute, the last trait wins. As always, you can pass in an object of attribute overrides as the last argument: server.create('post', 'published', { title: 'My first post' }); When combined with the afterCreate() hook, traits simplify the process of setting up related object graphs. Here we define a withComments trait that creates 3 comments for a newly created post: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', withComments: trait({ afterCreate(post, server) { server.createList('comment', 3, { post }); } }) }); We can use this trait to quickly make 10 posts with 3 comments each: server.createList('post', 10, 'withComments'); Combining traits with the afterCreate hook is one of the most powerful features of Mirage factories. Effective use of this technique will dramatically simplify the process of creating different graphs of relational data for your app. The association helper The association() helper provides some sugar for creating belongsTo relationships. As we saw earlier, given a Post that belongsTo a User, we were able to use the afterCreate hook to pre-wire that relationship: // mirage/factories/post.js import { Factory } from 'miragejs'; export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); The association() helper effectively replaces this code: // mirage/factories/post.js import { Factory, association } from 'miragejs'; export default Factory.extend({ user: association() }); This should help reduce some of the boilerplate in your factory definitions. You can also use association() within traits // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association() }) }); and it also accepts additional traits and overrides for the related model's factory: // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association('admin', { role: 'editor' }) }) }); There is no equivalent helper for hasMany relationships, so you can continue to use the afterCreate hook to seed those relationships. Using factories In development To use your factories to seed your development database, call server.create and server.createList in your scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); } There's no explicit API for switching scenarios in development, but you can just use JavaScript modules to split things up. For example, you could create a new file for each scenario that contains some seeding logic // mirage/scenarios/admin.js export default function(server) { server.create('user', { isAdmin: true }); } ...export all scenarios as an object from an index.js file // mirage/scenarios/index.js import anonymous from './anonymous'; import subscriber from './subscriber'; import admin from './admin'; export default scenarios = { anonymous, subscriber, admin } ...and then import that object into default.js. Now you can quickly switch your development state by changing a single variable: // mirage/scenarios/default.js import scenarios from './index'; // Choose one const state = // 'anonymous' // 'subscriber' 'admin' ; export default function(server) { scenarios[state](server); } This can be handy while developing your app or sharing the different states of a new feature with your team. In testing When running your app in the test environment, your entire Mirage server is loaded, except for your scenarios/default.js file. That means each test starts out with a clean database, giving you the opportunity to set up only the state needed for that test. It also keeps your development scenarios isolated from your tests, so that you don't inadvertently break your test suite while tweaking your development scenario. To seed Mirage's database within a test, use this.server to access the create and createList methods: test('I can see the movies on the homepage', async function(assert) { this.server.createList('movie', 5); await visit('/'); assert.dom('li.movie').exists({ length: 5 }); }); In this test, we start our Mirage server out with 5 movies. Then we boot up the Ember app and visit the / route, and finally assert that those movies show up in our UI. When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. You can read more about testing with Mirage in the section of these guides. Factory best practices In general, it's best to define a model's base factory using only the attributes and relationships that comprise the minimal valid state for that model. You can then use afterCreate and traits to define other common states that contain valid, related changes on top of the base case. This advice goes a long way towards keeping your test suite maintainable. If you don't use traits and afterCreate, your tests will become bogged down in irrelevant details related to setting up the data needed for that test. test('I can see the title of a post', async function(assert) { let session = server.create('session'); let user = server.create('user', { session }); server.create('post', { user, title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); This test is only concerned with asserting the title of a post gets rendered to the screen, but it has lots of boilerplate code that's only there to get the post in a valid state. If we used afterCreate instead, the developer writing this test could simply create a post with a specified title and slug, since those are the only details relevant to the test: test('I can see the title of a post', async function(assert) { server.create('post', { title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); afterCreate could take care of setting up the session and user in valid states, and associating the user with the post, so that the test can stay concise and focused on what it's actually testing. Effective use of traits and afterCreate keeps your test suite less brittle and more robust to changes in your data layer, since tests only declare the bare minimum setup logic needed to verify their assertions. Up next, we'll take a look at how to use Fixtures as an alternative way to seed your database. ","route":"templates.docs.data-layer.factories","keywords":[]},"template:templates/docs/data-layer/fixtures":{"id":"template:templates/docs/data-layer/fixtures","type":"template","title":"Fixtures","text":" Fixtures Mirage also lets you use flat fixture files to seed your database with data. In general, we recommend using factories for most situations, since they tend to keep your mock data more maintainable. But there are certainly times where fixture data makes sense. Fixtures are nothing more than a conventional file-based way to accomplish the following: // mirage/scenarios/default.js export default function(server) { server.db.loadData({ countries: [ { id: 1, name: 'China' }, { id: 2, name: 'India' }, { id: 3, name: 'United States' } ] }); } Let's see how we can do the same thing using fixtures. Basic usage We'll start by generating a fixture file for our Country model: ember g mirage-fixture countries Fixture filenames should be the dasherized plural form of the model class. We can now add some data to our fixture file: // mirage/fixtures/countries.js export default [ { id: 1, name: 'China', largestCity: 'Shanghai' }, { id: 2, name: 'India', largestCity: 'Mumbai' }, { id: 3, name: 'United States', largestCity: 'New York City' }, { id: 4, name: 'Indonesia', largestCity: 'Jakarta' }, { id: 5, name: 'Pakistan', largestCity: 'Karachi' }, { id: 6, name: 'Brazil', largestCity: 'São Paulo' }, { id: 7, name: 'Nigeria', largestCity: 'Lagos' }, { id: 8, name: 'Bangladesh', largestCity: 'Dhaka' }, { id: 9, name: 'Russia', largestCity: 'Moscow' }, { id: 10, name: 'Mexico', largestCity: 'Mexico City' }, ]; Because this data will be read directly into Mirage's database, we want to use camelCase for all multi-word attributes. (Mirage uses the camelCasing convention to avoid configuration for things like identifying foreign keys.) Don't worry if your production API format doesn't use camelCase. We'll be able to customize Mirage's API format in the Serializer layer. To load our new fixture file into the database during development, we can call server.loadFixtures in our scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.loadFixtures(); } If we have multiple fixtures defined, server.loadFixtures() will load every file. You can load files selectively by passing in an argument list of fixture names to loadFixtures: // mirage/scenarios/default.js export default function(server) { server.loadFixtures('countries', 'cities'); // only load the countries and cities fixtures } Just like with factories, fixtures will be ignored during tests. If you want to load fixture data in a test, you can call this.server.loadFixtures: test('I can see the countries', async function(assert) { this.server.loadFixtures('countries'); await visit('/'); assert.dom('option.country').exists({ length: 100 }); }); Relationships There's no special API for creating relationships using fixtures – you just need to understand how Mirage uses foreign keys to wire up relationships. Let's say we had these models: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); Using the ORM we can create two related models: let chris = schema.users.create({ name: 'Chris Garrett' }); schema.posts.create({ author: chris, title: 'Coming Soon in Ember Octane' }); If we take a look at Mirage's database after this, we'll see this data: // server.db.dump() { users: [ { id: '1', name: 'Chris Garrett' } ], posts: [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ] } As you can see, Mirage added an authorId foreign key to the post. The convention for belongsTo foreign keys is `${relationshipName}Id` In this case, a post gets an authorId, even though that relationship points to a User model. The relationship name is always used rather than the model name, because models can have multiple relationships that point to the same type of model. Looking at the database dump above, if you wanted to recreate the same relationship graph using only fixture files, your files would look something like this: // mirage/fixtures/users.js export default [ { id: '1', name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; Once these fixtures are loaded into Mirage, all the ORM methods, Shorthands and Serializers would work as expected. If this happens to be a bi-directional relationship // mirage/models/user.js export default Model.extend({ + posts: hasMany() }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); then Mirage will add an array of foreign keys on the new hasMany association: // mirage/fixtures/users.js export default [ { id: '1', postIds: [ '1' ], name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; The convention for hasMany relationship foreign keys is `${singularize(relationshipName)}Ids` All associations have their own keys, because Mirage supports arbitrary one-way relationships. If two associations are inverses of each other, as in the above case, Mirage will keep the keys on each model in sync provided you use the ORM methods. As you can see, maintaining foreign keys and keeping them in sync across fixture files can get a little messy, which is why Mirage recommends using factories for most of your data creation. Still, fixtures can be quite useful in certain situations, so they're a good tool to have in your toolbox. ","route":"templates.docs.data-layer.fixtures","keywords":[]},"template:templates/docs/data-layer/models":{"id":"template:templates/docs/data-layer/models","type":"template","title":"Models","text":" Models To take advantage of the ORM, Mirage needs to know about your application's models and their relationships. This section will teach you how to define and work with your models, and the next will discuss relationships. Note that if your Ember application uses Ember Data, Mirage will automatically discover your models and their relationships, so you don’t need to define any files within Mirage yourself. As a clarifying point, Mirage model instances only exist within Mirage's server, and are never shared directly with your Ember app or rendered directly in components. They exist solely to help you manage the data and relationships in your fake backend, but are serialized as a JSON string before they are sent over to your Ember app. Defining models To define a model, you can use the generator: ember g mirage-model blog-post This creates a file under /mirage/models: // mirage/models/blog-post.js import { Model } from 'miragejs'; export default Model; Creating models To create models, access the model's collection via the schema object, which is available in your route handlers: this.post('/blog-posts', function(schema) { let attrs = this.normalizedRequestAttrs(); schema.blogPosts.create(attrs); }); or as server.schema directly off of your Mirage server instance: // scenarios/default.js export default function(server) { server.schema.blogPosts.create({ title: 'Lorem ipsum' }); } Note that the collection is the pluralized form of the model's model name (the models/blog-post.js definition from above creates a schema.blogPosts collection). Outside of route handlers, you'll typically create models using Factories via server.create // scenarios/default.js export default function(server) { server.create('blog-post'); } which delegates to the collection's create method under the hood. We'll talk more about creating data using Factories later in these guides. Accessing models To access your models, use the various query methods from the model's collection. For example, use all() to return all known models: this.get('/blog-posts', (schema, request) => { return schema.blogPosts.all(); }); Here are some other common query methods: schema.blogPosts.find(1); schema.blogPosts.first(); schema.blogPosts.where({ isPublished: true }); schema.blogPosts.findBy({ title: 'Introduction' }); Check out the to see all available query methods. Updating and deleting models Once you're working with an instance of a model, there are other properties and methods you'll have access to. For example, you can update a model: let post = schema.blogPosts.find(1); post.update({ author: 'Obi-Wan' }); or delete one: let post = schema.blogPosts.find(2); post.destroy(); View the to see all the available fields and methods for model instances. Once your Models have been defined, the next step is to define the relationships between them, so you can really start to leverage the power of Mirage's ORM. Let's talk about how to do that next. ","route":"templates.docs.data-layer.models","keywords":[]},"template:templates/docs/data-layer/orm":{"id":"template:templates/docs/data-layer/orm","type":"template","title":"Why an ORM?","text":" Why an ORM? Mirage originally shipped with just a database as its data layer. While helpful, users still had to write a lot of code to reproduce their modern, complex backends. In particular, dealing with relationships was a big pain point. The solution was to add an Object Relational Mapper, or ORM, to Mirage. Let's see how an ORM allows Mirage to do more of the heavy lifting for you. Motivation Consider a database that looks like this: db.dump(); // Result { movies: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] } The first problem you'll encounter when writing a route handler is how to transform this raw data into the format your Ember app expects – that is, how to match the format of your production API. Let's say your backend uses the JSON:API spec. Your response to a GET request for /api/movies/1 should look something like this: // GET /api/movies/1 { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' } } } Not a huge deal – we could just write this formatting logic directly in our route handler: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); return { data: { id: movie.id, type: 'movies', attributes: { title: movie.title } } }; }); This works. But let's say our Movie model had a few more attributes: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } Now our route handler needs to be more clever, and make sure all properties other than id end up in the attributes hash: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); let movieJSON = { data: { id: movie.id, type: 'movies', attributes: { } } }; Object.keys(movie) .filter(key => key !=== 'id') .forEach(key => { movieJSON[key] = movie[key]; }); return movieJSON; }); As you can see, things get complicated pretty fast. What if we add relationships to the mix? Let's say a Movie has a relationship to a director, and it stores that relationship using a directorId foreign key: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '23' } The expected HTTP response for this model now looks like this { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' }, relationships: { directors: { data: { type: 'people', id: '23' } } } } } meaning our route handlers need to get even more complex. In particular, they need a robust way to differentiate between a model's attributes (like title) and its relationship keys (like directorId). These sorts of problems turn out to be common enough that we can solve them generally, provided Mirage is aware of your application's models and their relationships. Problems solved by the ORM When Mirage knows about your application's domain, it can shoulder the responsibility for the low-level bookkeeping work needed to properly implement your mock server. Let's take a look at some examples of how it does this. Separation of formatting logic To start, we can tell Mirage about our application's schema by defining Mirage models. These models get registered with the ORM and tell Mirage about the shape of your data. Let's define a Movie model. // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Mirage models are schemaless in attributes, in that they don't require you to define plain attributes like title and releaseDate. So, the above model definition works regardless of what attributes your Movie model has. If you're using Ember Data, Mirage's ORM will automatically register your Ember Data models for you at run time, so you don't have to duplicate your domain information in two places. With the Movie model defined, we can update our route handler to use the ORM to respond with a Mirage model instance: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); The schema argument is how you interact with the ORM. By returning an instance of a Mirage model from a route handler instead of a plain JavaScript object, we can now take advantage of Mirage's Serializer layer. Serializers work by turning Models and Collections into formatted JSON responses. Mirage ships with a JSONAPISerializer out of the box, so assuming it's defined as your Application serializer // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); this route handler will now respond with the payload we expect: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } } } The ORM is already helping us keep our route handlers tidy by delegating the work of transforming our models into JSON to the Serializer layer. But it gets even more powerful when we add relationships to the mix. Fetching related data Let's say our Movie has a belongs-to relationship with a director: // mirage/models/movie.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ director: belongsTo('person') }); The director is an instance of a Person model: // mirage/models/person.js import { Model } from 'miragejs'; export default Model.extend({ }); Again, if you're using Ember Data, both the models and relationships will be automatically generated for you. No need to create this file. Without changing anything about our route handler or serializer, we can now fetch a graph of data by using JSON:API includes. The following request GET /api/movies/1?include=director will now generate this response: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }, relationships: { director: { data: { type: 'people', id: '1' } } } }, included: [ { id: '1', type: 'people', attributes: { name: 'Christopher Nolan' } } ] } The JSONAPISerializer is able to inspect the ORM so that it can put all models, attributes and relationships in the right place. Our route handler doesn't need to change at all. In fact, the route handler we wrote is the same as the default behavior of the Shorthand, meaning we can just switch to using that: - this.get('/movies/:id', (schema, request) => { - let id = request.params.id; - return schema.movies.find(id); - }); + this.get('/movies/:id'); This is another example of how the ORM helps various parts of Mirage, like Shorthands and Serializers, work together to simplify your server definition. Creating and editing related data The ORM also makes creating and editing related data easier than if you only worked with the raw database records. For instance, to create a Movie and Person with a relationship using only the database, you'd need to do something like this: server.db.loadData({ people: [ { id: '1', name: 'Christopher Nolan' } ], movies: [ { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '1' } ] }); Note the directorId foreign key on the Movies record must match the id on the associated People record. Managing raw database data like this quickly gets unwieldy, especially as relationships change over time. Using the ORM via server.schema, we can create this graph without managing any IDs: let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }); Passing in the model instance nolan as the director attribute when creating the movie is enough for all the keys to be properly set up. The ORM also keeps foreign keys in sync as relationships are edited. Given the database { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '2' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } we could update the movie's director like this: let episode9 = schema.movies.findBy({ title: 'Star Wars: The Rise of Skywalker' }); episode9.update({ director: schema.people.findBy({ name: 'J.J. Abrams' }); }); The new database would look like this: { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '3' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } Note how the directorId was changed in the database, even though we only ever worked with model instances. Importantly, this also holds true for more complex relationships, like one-to-many or many-to-many relationships that have an inverse. The ORM allows Mirage to abstract all this bookkeeping away from your code, and even gives Shorthands enough power to respect arbitrary updates to complex relationship graphs. These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's schema, it can take on more of the responsibility of configuring your mock server. Next, we'll take a look at how to actually define your models and their relationships in Mirage. ","route":"templates.docs.data-layer.orm","keywords":[]},"template:templates/docs/data-layer/relationships":{"id":"template:templates/docs/data-layer/relationships","type":"template","title":"Relationships","text":" Relationships Once you've defined your models, you can define relationships between them using the belongsTo and hasMany helpers. Each helper adds some dynamic methods to your model. Just as another reminder, if you use Ember Data and have models and relationships defined there, you don't need to define any relationships within your Mirage folder, as those will be automatically discovered and set up for you. belongsTo To define a to-one relationship, import the belongsTo helper and define a new property on a model that points to another model: // mirage/models/blog-post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); This defines a belongsTo relationship to an Author model. The belongsTo helper adds several new properties and methods to your models. In this case, our blog-post model would now have an authorId property, as well as some methods for working with the associated author model: blogPost.authorId; // 1 blogPost.authorId = 2; // updates the relationship blogPost.author; // Author instance blogPost.author = anotherAuthor; blogPost.newAuthor(attrs); // new unsaved author blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) Note that when a child calls child.createParent, the new parent is immediately saved to the db, but the child's foreign key is updated on this instance only, and is not immediately persisted to the database. In other words, blogPost.createAuthor will create a new author record, insert it into the db, and update the blogPost.authorId in memory, but if you were to fetch the blogPost from the db again, the relationship would not be persisted. To persist the new foreign key, you would call blogPost.save() after creating the new author. hasMany To define a to-many relationship, use the hasMany helper: // mirage/models/blog-post.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ comments: hasMany() }); This helper adds a commentIds property to the blogPost model, as well as some methods for working with the associated comments collection: blogPost.commentIds; // [1, 2, 3] blogPost.commentIds = [2, 3]; // updates the relationship blogPost.comments; // array of related comments blogPost.comments = [comment1, comment2]; // updates the relationship blogPost.newComment(attrs); // new unsaved comment blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) Association options modelName If your associations model has a different name than the association itself, you can specify the modelName on the association. For example, // mirage/models/blog-post.js import { Model, belongsTo, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo(\"user\"), comments: hasMany(\"annotation\") }); would add all the named author and comment methods as listed above, but use user and annotation models for the actual relationships. inverse Often, relationships can be inverses of each other. For example, say we had the following two models: // blog-post.js export default Model.extend({ comments: hasMany() }); // comment.js export default Model.extend({ blogPost: belongsTo() }); In this case, blogPost.comments would point to a collection of Comment models, and each one of those Comment models would have a comment.blogPost relationship that pointed back to the original post. Mirage will often be able to infer that two relationships on two different models are inverses of each other, but sometimes you'll need to be explicit. This typically happens if a model has two relationships that point to the same model type. For example, suppose we had the following schema: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\"), reviewer: belongsTo(\"user\") }); In this case, Mirage doesn't know which relationship (blogPost.author or blogPost.reviewer) should by synchronized with the parent's user.blogPosts collection. So, you can specify which one by using the inverse option: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\", { inverse: \"blogPosts\" }), reviewer: belongsTo(\"user\", { inverse: null }) }); Now, if a blog post is added to user.blogPosts, that post's author will be correctly set. polymorphic You can specify whether an association is a polymorphic association by passing { polymorphic: true } as an option. For example, say you have a Comment that can belong to a BlogPost or a Picture. Here's how the model definitions would look: // app/models/comment.js export default Model.extend({ commentable: belongsTo({ polymorphic: true }) }); // app/models/blog-post.js export default Model.extend({ comments: hasMany() }); // app/models/picture.js export default Model.extend({ comments: hasMany() }); Note that commentable doesn't need a type (there's no validation done on which types of models can exist on that association). Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. let comment = schema.comments.create({ text: \"foo\" }); comment.buildCommentable(\"post\", { title: \"Lorem Ipsum\" }); comment.createCommentable(\"post\", { title: \"Lorem Ipsum\" }); // getter comment.commentableId; // { id: 1, type: 'blog-post' } // setter comment.commentableId = { id: 2, type: \"picture\" }; Has-many asssociations can also be polymorphic: // app/models/user.js export default Model.extend({ things: hasMany({ polymorphic: true }) }); // app/models/car.js export default Model.extend({ }); // app/models/watch.js export default Model.extend({ }); let user = schema.users.create({ name: \"Sam\" }); user.buildThing('car', { attrs }); user.createThing('watch', { attrs }); // getter user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] // setter user.thingIds = [ { id: 2, type: 'watch' }, ... ]; Be sure to check out the , and API docs to learn about all the available ORM methods. We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. Next, let's take a look at Factories, which leverage your new Model and Relationship definitions to make it easy to create graphs of relational data. ","route":"templates.docs.data-layer.relationships","keywords":[]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"id":"template:templates/docs/data-layer/serializers/ember-data-serializer","type":"template","title":null,"text":"The EmberDataSerializer extends the RestSerializer with the added functionality ofprimaryKey and attrs (renamed transforms as attrs was already in use by Mirage) properties. These properties work the same as the properties provided. Primary Key This serializer provides for a property primaryKey that works the same as the primaryKey property on an ember data serializer. By default this property will be id but if you assign a different value, that value will be used in the JSON instead of id. This means that if you are using the primaryKey property on your ember data serializer, using the same property on the mirage serializer will perform the same function. If you were using the RestSerializer you would need to override the serialize and normalize functions to do the transform yourself. Using EmberDataSerializer you can let the serializer perform this transformation for you. To be clear, when data is received by Mirage, this will take the value of addressId from the JSON and use it as the id for the Mirage model. When Mirage serializers it's model into JSON, it will use the value for the id property and assign it to the property addressId. import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ primaryKey: \"addressId\" }); Transforms Transforms provides the same function as attrs for the ember data serializers however this transformation is happening on the server side for Mirage. This allows your mirage models to look more like your actual server models. Example of a Mirage serializer extending from EmberDataSerializer import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ transforms: { name: \"externalName\", address: {key: \"addressId\", serialize: \"ids\"}, age: {key: \"externalAge\"}, blogPosts: {key: \"blogPostIds\"} } }); If you would like Mirage to apply the transforms from your ember data serializers for you see . ","route":"templates.docs.data-layer.serializers.ember-data-serializer","keywords":[]},"template:templates/docs/data-layer/serializers/index":{"id":"template:templates/docs/data-layer/serializers/index","type":"template","title":"Serializers","text":" Serializers A serializer is an object responsible for transforming a Model or Collection that's returned from your route handlers this.get('movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); into a formatted JSON payload // GET /movies/1 { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' } } } suitable for consumption by your Ember app. Serializers are the last main part of Mirage's architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models. Let's see how they work. Choosing which serializer to use The first step in working with Mirage's serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app. The JSON payload above is an example of an API that follows the JSON:API spec. You'll see it used a lot in the Ember ecosystem, because it's the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined. If you are starting a new app, it's recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don't use JSON:API. If your app does use JSON:API, Mirage ships with a JSONAPISerializer that will do the heavy lifting for you. Mirage also ships with two other named serializers, ActiveModelSerializer and RestSerializer, that match two other popular backend formats. EmberDataSerializer is also provided as a variation to the RestSerializer that uses the primaryKey and attrs defined in your applications ember data serializers, similar to how models are auto discovered. See the section on for more information. If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. Defining serializers Once you've selected the appropriate serializer, define your default application-wide serializer by exporting it from /mirage/serializers/application.js: // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); This specifies the serializer to use for each Model and Collection in your system. If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer. Let's use Mirage's generator to create a Movie serializer: ember g mirage-serializer movie This creates the file import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ }); which follows the best practice of model-specific serializers extending from your Application serializer. You can now customize the behavior of how Movie models and collections are serialized into JSON. Customizing serializers When it comes to customizing your application's serializers, you'll mostly be tweaking Mirage's defaults. For example, if your Ember app expects attribute names to be PascalCase // GET /movies/1 { Id: '1', ReleaseDate: 'Interstellar' } you might override the Serializer's keyForAttribute method: import { Serializer } from 'miragejs'; import { classify } from '@ember/string'; export default Serializer.extend({ keyForAttribute(attr) { return classify(attr); } }); See the API docs for each serializer to learn more about all the customization hooks available. Relationships Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships. For example, the JSONAPISerializer respects query param includes GET /movies/1?include=cast-members out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes. There's an option on JSONAPISerializer that enables this: import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); Now, a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { data: [ { type: 'people', id: '1' }, { type: 'people', id: '2' }, { type: 'people', id: '3' }, ] } } } } The Ember app could now use these ids to subsequently fetch the related cast members. Other times, an Ember app expects to get a link to fetch related data. The JSONAPISerializer also has a hook for this: // mirage/serializers/movie.js import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ links(movie) { return { 'cast-members': { related: `/api/movies/${movie.id}/cast-members` } }; } }); Now a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { links: { related: `/api/movies/1/cast-members` } } } } } The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details. Working with serialized JSON While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler. You can use the this.serialize helper method to do this - make sure to use a function instead of a fat arrow so you have access to the correct this: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta.size = movies.length; return json; }); The serialize helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer. You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies, 'movie-with-relationship'); json.meta.size = movies.length; return json; }); This route handler would use the mirage/serializers/movie-with-relationship.js serializer to transform the collection of movies into a json payload, which is then modified and then finally returned from the route handler. In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn't adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models. The more conventional your backend API is, the less code you'll need to write – not only in Mirage, but also in other parts of your Ember application! Be sure to check out the and docs to learn about all the hooks available to customize your serializer layer. Now that we've covered the ins and outs of Mirage's data layer, we're ready to see how we can use Mirage to effectively test our Ember application. ","route":"templates.docs.data-layer.serializers.index","keywords":[]},"template:templates/docs/getting-started/installation":{"id":"template:templates/docs/getting-started/installation","type":"template","title":"Installation","text":" Installation To install Mirage, run ember install ember-cli-mirage Ember should install the addon and add a /mirage directory to the root of your project. Check out the if you're coming from a previous version of Mirage. Note for Embroider users Embroider does not recognizes changes to Ember CLI Mirage configuration in mirage/ folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in EMBROIDER_REBUILD_ADDONS environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following: EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s Note for Prettier users There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you're using Prettier and install Mirage, you can either pin eslint-plugin-prettier to 2.6.0, or add the following to .eslintignore: /mirage/mirage Note for FastBoot users You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. FastBoot support is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. You can always bypass FastBoot page generation locally by running FASTBOOT_DISABLED=true ember serve Mirage will then run in the browser as expected, and you can develop your client app as normal. ","route":"templates.docs.getting-started.installation","keywords":[]},"template:templates/docs/getting-started/overview":{"id":"template:templates/docs/getting-started/overview","type":"template","title":"Overview","text":" Overview The file mirage/config.js contains the boilerplate code to create a mirage server. You can customize the server that is created here by following the mirage documentation https://miragejs.com/docs/getting-started/overview/ Mirage lets you simulate API responses by writing route handlers. The simplest example of a route handler is a function that returns an object: // mirage/config.js function routes() { this.namespace = 'api'; this.get('/movies', () => { return { data: [ { id: 1, type: 'movies', attributes: { name: 'Interstellar' } }, { id: 2, type: 'movies', attributes: { name: 'Inception' } }, { id: 3, type: 'movies', attributes: { name: 'Dunkirk' } }, ] }; }); } Now whenever your Ember app makes a GET request to /api/movies, Mirage will respond with this data. Dynamic data This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: They're inflexible. What if you want to change the data for this route in your tests? They contain formatting logic. Logic that's concerned with the shape of your JSON payload (e.g. the data and attributes keys) is now duplicated across all your route handlers. They're too basic. Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. Mirage provides a data layer that lets you write more powerful server implementations. Let's see how it works by replacing our basic stub data above. Creating a model First, we'll need to tell Mirage that we have a dynamic Movie model. If you're using Ember Data and you already have a Movie model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won't have any files in the mirage/models directory. If you're not using Ember Data, you can use the mirage-model generator to create a model from the command line: $ ember g mirage-model movie This generates the following file: // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Writing a dynamic route handler Models let our route handlers take advantage of Mirage's in-memory database. The database makes our route handlers dynamic, so we can change the data that's returned without having to rewrite the handler. Let's update our route handler to be dynamic: this.get('/movies', (schema, request) => { return schema.movies.all(); }); The schema argument lets us access our new Movie model. This route will now respond with all the authors in Mirage's database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage's database, instead of having to write a different version of the handler for each scenario we want to simulate. Seeding the database Right now, if we sent a request to our new handler above, the response would look something like this: // GET /api/movies data: [ ] That's because Mirage's database is empty. To actually seed our database with fake data, we'll use factories. Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models. Let's create a factory for our author with $ ember g mirage-factory movie We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; // Movie 1, Movie 2, etc. }, year() { let min = 1950; let max = 2019; return Math.floor(Math.random() * (max - min + 1)) + min; }, rating: \"PG-13\" }); This factory creates objects like [ { title: 'Movie 1', year: 1992, rating: \"PG-13\" }, { title: 'Movie 2', year: 2008, rating: \"PG-13\" }, // ... ] and so on, which will automatically be inserted into the movies database table. The database will assign each record an id, and now we can interact with this data in our route handlers. To actually use our new factory definition, we can call the server.create and server.createList methods. To seed our development database, use the function in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); }; Now when our Ember app makes a GET request to /api/movies using the route handler above, we'll see something that looks like this: // GET /api/movies data: [ { id: 1, type: \"movies\", attributes: { title: \"Movie 1\", year: 1992, rating: \"PG-13\" } }, { id: 2, type: \"movies\", attributes: { title: \"Movie 2\", year: 2008, rating: \"PG-13\" } }, // ... ] As we can see, this response is now influenced by the run-time state of our database. In acceptance tests, scenarios/default.js is ignored, and instead you can use this.server to setup your database in the state needed for the test: // tests/acceptance/movies-test.js import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test(\"I can view the movies\", async function(assert) { this.server.createList(\"movie\", 3); await visit(\"/home\"); assert.dom(\"[data-test-id='movie-row']\").exists({ count: 3 }); }); }); You can also pass attribute overrides directly to create or createList: test(\"I can view the movie title\", async function(assert) { let movie = this.server.create('movie', { title: \"Interstellar\" }); await visit(`/movies/${movie.id}`); assert.dom('h1').includesText(\"Interstellar\"); }); You now have a simple way to set up your Mirage server's initial data, both during development and on a per-test basis. Associations Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean. Let's say your movie has many cast-members. You can declare this relationship in your model: // mirage/models/movie.js import { Model, hasMany } from 'miragejs'; export default Model.extend({ castMembers: hasMany() }); // mirage/models/cast-member.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ movie: belongsTo() }); Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: this.get('/movies/:id/cast-members', (schema, request) => { let movie = schema.movies.find(request.params.id); return movie.castMembers; }); and when creating graphs of related data: test(\"I can see a movie's cast members\", async function(assert) { server.create('movie', { title: 'Interstellar', castMembers: [ server.create('cast-member', { name: 'Matthew McConaughey' }), server.create('cast-member', { name: 'Anne Hathaway' }), server.create('cast-member', { name: 'Jessica Chastain' }) ] }); await visit('/'); assert.dom('li.cast-member').exists({ count: 3 }); }); Mirage uses foreign keys to keep track of these related models for you, so you don't have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage's database. Serializers Mirage is designed for you to be able to completely replicate your production server. So far, we've seen that Mirage's default payloads are formatted using the JSON:API spec. This spec produces payloads that look like this: // GET /movies/1 { data: { id: 1, type: 'movies', attributes: { title: 'Interstellar' } } } New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API. For example, your API responses might look more like this: // GET /movies/1 { movies: { id: 1, title: 'Interstellar' } } This is why Mirage serializers exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup. Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend: // mirage/serializers/application.js import { Serializer } from 'miragejs'; export default Serializer.extend({ keyForAttribute(attr) { return dasherize(attr); }, keyForRelationship(attr) { return dasherize(attr); } }); Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data: // mirage/serializers/movie.js import { Serializer } from 'miragejs'; export default Serializer.extend({ include: [ 'crewMembers' ] }); // mirage/config.js function routes() { this.get('/movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); } With the above config, a GET to /movies/1 would return automatically include related crew members: { movie: { id: 1, title: 'Interstellar' }, 'crew-members': [ { id: 1, 'movie-id': 1, name: 'Matthew McConaughey' }, { id: 1, 'movie-id': 1, name: 'Anne Hathaway' }, ... ] } Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the serializer guide to learn more. Shorthands Mirage has shorthands to reduce the code needed for conventional API routes. For example, the route handler this.get('/authors', (schema, request) => { return schema.authors.all(); }); can be written as this.get('/authors'); There are also shorthands for post, patch (or put), and del methods. Here's a full set of resourceful routes for an author resource: this.get('/authors'); this.get('/authors/:id'); this.post('/authors'); this.patch('/authors/:id'); this.del('/authors/:id'); Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control. Passthrough Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: // mirage/config.js this.passthrough(); Now you can develop as you normally would, for example against an existing API. When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need // mirage/config.js this.get('/comments'); this.passthrough(); and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. That should be enough to get you started! The rest of the docs are organized by Mirage's higher-level concepts: Route handlers contain the logic around what run-time data Mirage uses to respond to requests. The Data layer is how Mirage stores and tracks changes to your data over time. Keep reading to learn more! ","route":"templates.docs.getting-started.overview","keywords":[]},"template:templates/docs/getting-started/upgrade-guide/index":{"id":"template:templates/docs/getting-started/upgrade-guide/index","type":"template","title":"Upgrade guide","text":" Upgrade guide If you're upgrading from an existing version of Mirage, you can run the following: # Using npm npm install -D ember-cli-mirage@X.X.X # Using yarn yarn add -D ember-cli-mirage@X.X.X Full Changelog You can view all of Mirage's release notes on our Releases page. 3.0 Upgrade guide Ensure that all the imports are updated for the objects that were moved to MirageJS. This is generally the imports in the files in the mirage directory. // from import { Model } from 'ember-cli-mirage'; //to import { Model } from 'miragejs'; Previous the file mirage/config.js was a exported default function that defined only your routes. Since MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS. Change the routes function to no longer be exported as the default function and give it a name, we suggest routes. Add the below boilerplate code to the top of the mirage/config.js. The end result would look like this. import { discoverEmberDataModels, } from 'ember-cli-mirage'; export default function (config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } // This would be your old default export function renamed function routes() { } The environment variable discoverEmberDataModels is now longer used. If you wish to not have ember-cli-mirage auto discover the models, just remove the ...discoverEmberDataModels(), 2.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Update import paths for miragejs imports 1.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Remove Faker.js When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call app.import in order to use the library in your application code. Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for Faker.js, a useful library to have alongside your Mirage factory definitions. There's a few problems with this, most notably that users had to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version. Now, thanks to Ember Auto Import, this is no longer the case. Using dependencies directly from npm is painless – just yarn/npm install them and import them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you. This also means that users can easily manage their project's version of Faker (and other similar dependencies) independently of the version of Mirage they're using. For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change. Here are the steps you'll need to take to fix this: Install Ember Auto Import (if it's not already installed) ember install ember-auto-import Install Faker.js directly from npm: yarn add -D faker # or npm install --save-dev faker Change all imports of faker from the ember-cli-packge to import directly from faker: - import { Factory, faker } from 'miragejs'; + import { Factory } from 'miragejs'; + import faker from 'faker'; There is a codemod that will do this for you, thanks to the gracious work of Casey Watts. Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \"useful\" additions. I thought this was a good idea at the time... it wasn't. 🙈 You can look at the module from v0.4.15 to see that we added the faker.list.random, faker.list.cycle and faker.random.number.range methods, so if you use these methods too, you'll need to refactor them. Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS: For faker.list.random, use faker.random.arrayElement: countries() { - return faker.list.random([ 'United States of America', 'Canada', 'Mexico' ]); + return faker.random.arrayElement([ 'United States of America', 'Canada', 'Mexico' ]); } For faker.list.cycle, use the remainder (modulo) operator: countries(i) { - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; + + return countries[i % countries.length]; } For faker.random.number.range, use faker.random.number with min and max options: age() { - return faker.random.number.range(18, 65); + return faker.random.number({ min: 18, max: 65 }); } After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like Chance.js, and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control. 2. New import for setupMirage Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem. // Before import setupMirage from \"ember-cli-mirage/test-support/setup-mirage\"; // After import { setupMirage } from \"ember-cli-mirage/test-support\"; 3. Remove deprecated forms of create, createList and normalizedRequestAttrs There are several places in Mirage's APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in. This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we're moving to 1.0, we're removing this deprecated/unintentional behavior. server.create and server.createList were coded to take a singularized model name, e.g. server.create('user'). It just so happens that server.create('users') also works. That pluralized version is now removed from Mirage. If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like server.create('users') to server.create('user'). Note this also applies to server.createList – the correct form is server.createList('user', 3), and the pluralized form server.createList('users', 3) is now unsupported. this.normalizedRequestAttrs in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. In this case, you can call this.normalizedRequestAttrs('blog-post') to tell Mirage to expect the payload to be for a blog-post model. This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. It just so happened that this.normalizedRequestAttrs('blogPost') also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. The correct usage is this.normalizedRequestAttrs('blog-post'). Using the camelized version of the model name is no longer supported. If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! 4. The normalizeIds serializer property now defaults to true This applies to the ActiveModelSerializer and RestSerializer. The normalize property on serializers helps Mirage's shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly. There was a gap in the default normalize method for a long time, in that it didn't take REST payloads that included foreign keys and looked like let payload = { contact: { id: 1, name: \"Link\", address: 1 } }; and turn that address key into a proper JSON:API relationship: data: { type: 'contacts', id: 1, attributes: { name: 'Link' }, relationships: { address: { data: { type: 'address', id: 1 } } } } We added this feature a while ago, and it's controlled with the normalizeIds property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn't be a breaking change.) We're now making true the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. 0.3.x → 0.4 Upgrade guide There is one primary change in 0.4 that could break your 0.3 app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being included in the payload. This actually goes against JSON:API's design. Foreign keys in the payload are known as Resource Linkage and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a post came back like this: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { data: { type: 'users', id: '1' } } } } } and you forgot to ?include=author in your GET request, Ember Data would potentially use the user:1 foreign key and lazily fetch the author by making a request to GET /authors/1. This is problematic because This is not how foreign keys are intended to be used It'd be better to see no data and fix the problem by going back up to your data-loading code and add ?include=author to your GET request, or If you do want your interface to lazily load the author, use resource links instead of the resource linkage data: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { links: { related: '/api/users/1' } } } } } Resource links can be defined on Mirage serializers using the links method (though including is likely the far more simpler and common approach to fetching related data). So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). This behavior is configurable via the alwaysIncludeLinkageData key on your JSONAPISerializers. It is set to false by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to true: // mirage/serializers/application.js import { JSONAPISerializer } from \"ember-cli-mirage\"; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource links or resource linkage data, and to update your Mirage code accordingly to give you the most faithful representation of your server. 0.2.x → 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. In 0.2, the following model definitions // mirage/models/author.js import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); would have generated a \"schema\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from post to author. To have a two-way sync'd relationship, known as an inverse, you'd need to define both sides of the relationship: // mirage/models/author.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ posts: hasMany() }); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); Practically speaking, to upgrade you'll need to go through your code and update relationships that implicitly had inverses (from 0.2.x's hasMany and belongsTo behavior) and update them to define both sides. This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you'd also need the author to have a postIds: [] array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.) Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it's probably because of something I haven't thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help! For more information on the motivation behind change, please read the 0-3 beta series release blog post. 0.1.x → 0.2 Upgrade guide If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: The default Mirage directory has changed. The default Mirage directory has moved from /app/mirage to /mirage. When you install 0.2.0, the default blueprint will add the /mirage directory to your project. You can delete it and move your current Mirage files to the new location with something like rm -rf mirage mv app/mirage mirage from the root of your project. Mirage's directory is also customizable (Although you should move it from the /app directory or else it will not be removed from the build in production mode). All multiword filenames are dasherized. In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. blog_posts: []), just name your file fixtures/blog_posts.js. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change /mirage/factories/blog_post.js /mirage/fixtures/blog_post.js # etc. to /mirage/factories/blog-post.js /mirage/fixtures/blog-post.js You will then use the new Serializer layer to do things like format keys in your json payloads. All JavaScript properties are camelCased. Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be db.blog_posts, and your factory keys might be first_name() {..}. Looks pretty cool right? Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) You'll need to update your route handlers, which may look like this: let posts = db.blog_posts.filter(p => p.author_id === 1); to let posts = db.blogPosts.filter(p => p.authorId === 1); Note that everything is camelCased, including foreign keys. Similarly, factories that look like export default Factory.extend({ first_name() { return faker.name.firstName(); }, last_name() { return faker.name.firstName(); } }); should be changed to export default Factory.extend({ firstName() { return faker.name.firstName(); }, lastName() { return faker.name.firstName(); } }); This goes for all attrs that server.create takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. Mirage now has its own Model layer (an ORM). In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. To create a model, use ember g mirage-model blog-post This will create a file like import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); Having that file sets up the db.blogPosts collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. We needed to add models for association support (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the models guide and serializers guide to see how having models can simplify your Mirage server. We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. The ORM object schema is now injected into route handlers. In Mirage 0.1.x, the db was the first parameter injected into route handlers: this.get(\"/posts\", function(db, request) { // work with db }); Now, the schema object is, so you can take advantage of the Model layer. Fortunately, the db hangs directly off of the schema, so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to this.get(\"/posts\", function({ db }, request) { // work with db }); and then start opting-in to the ORM (and using schema) one route handler at a time. Specify a Serializer. If you're using shorthands, you'll need to pick a serializer in /mirage/serializers/application.js. See the serializers guide for details. You can always view the full changelog to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please open an issue! ","route":"templates.docs.getting-started.upgrade-guide.index","keywords":[]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"id":"template:templates/docs/getting-started/upgrade-guide/v2-deprecations","type":"template","title":"Deprecations Added in v2.x of ember-cli-mirage","text":" Deprecations Added in v2.x of ember-cli-mirage miragejs re-exports only exporting routes as the default function ","route":"templates.docs.getting-started.upgrade-guide.v2-deprecations","keywords":[]},"template:templates/docs/getting-started/what-is-mirage":{"id":"template:templates/docs/getting-started/what-is-mirage","type":"template","title":"What is Mirage?","text":" What is Mirage? Mirage is a JavaScript library that lets frontend developers mock out backend APIs. Unlike other mocking libraries, Mirage makes it easy to reproduce dynamic scenarios that are typically only possible when using a true production server. Equipped with a Mirage server, a frontend developer can build, test, and even share a complete working Ember application without having to use or configure any backend services. Why? Mirage was originally built to bring conventions to some home-grown HTTP mocking code that was getting unwieldy. It ended up proving most useful when it enabled frontend developers to work on their apps without having to rely on any local or staging backend services as part of their normal development workflow. Since then, Mirage has focused on making it as easy as possible for Ember developers to maintain a mock server alongside their codebase. How it works Mirage runs in the browser. It uses Pretender.js to intercept and respond to any network requests your Ember app makes, letting you build your app as if it were talking to a real server. In this way, you can develop and test your app against various server states without having to modify any application code. In addition to intercepting HTTP requests, Mirage provides a mock database and helper functions that make it easy to simulate dynamic backend services. Mirage borrows concepts from server-side frameworks like routes to handle HTTP requests a database and models for storing data and defining relationships factories and fixtures for stubbing data, and serializers for formatting HTTP responses to make it easy to simulate production server behavior. Alternatives These other libraries solve similar problems to Mirage and might be a better fit for your needs: Polly.js, a library for recording and replaying HTTP interactions Pretender.js, the low-level HTTP interceptor powering Mirage Ember Data Factory Guy, factories for Ember apps powered by Ember Data ","route":"templates.docs.getting-started.what-is-mirage","keywords":[]},"template:templates/docs/route-handlers/functions":{"id":"template:templates/docs/route-handlers/functions","type":"template","title":"Functions","text":" Functions Function handlers are the most flexible way to write route handlers in Mirage. To define new function handlers, use the get, post, patch (or put) and del methods. Here's an example: // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); Now when your Ember app makes a GET request to /movies, it will receive this data. Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response. this.get('/movies', () => { ... }); this.post('/movies', () => { ... }); this.patch('/movies/:id', () => { ... }); this.del('/movies/:id', () => { ... }); Timing The last argument to a route handler is an options object you can use to adjust the timing. Use this to delay the response of a particular route and see how your Ember app behaves when communicating with a slow network. // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }, { timing: 4000 }); The default delay is 50ms during development, and 0 during testing (so your tests run fast). You can also set a global timing parameter for all routes. Individual timing parameters override the global setting. // mirage/config.js export default function() { this.namespace = 'api'; this.timing = 2000; this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); this.get('/complex-query', () => { return [1, 2, 3, 4, 5]; }, { timing: 3000 }); } If you want to add delays to a test, you can override the timing for individual tests by putting the timing parameter in your test test('this route works with a delay', function() { server.timing = 10000; // ... }); Because the server is reset after each test, this option won't leak into the rest of your suite. Accessing the data layer Route handlers receive schema as their first parameter, which lets them access Mirage's data layer: this.get('/movies', (schema) => { return schema.movies.all(); }); Most of your route handlers will interact with the data layer in some way. The second parameter is the request object, which contains information about the request your Ember app made. For example, you can access dynamic URL segments from it: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); You can also access the request body, for example to handle a POST or PATCH request that contains data sent over by the Ember app: this.post('/movies', (schema, request) => { let title = JSON.parse(request.requestBody).title; return schema.movies.create({ title }); }); The normalizedRequestAttrs helper (documented below) provides some sugar for working with the request data. Dynamic paths and query params The request object that's injected into your route handlers contains any dynamic route segments and query params. To define a route that has a dynamic segment, use colon syntax (:segment) in your path. The dynamic piece will be available via request.params.[segment]: this.get('/authors/:id', (schema, request) => { let id = request.params.id; return schema.authors.find(id); }) Query params from the request can also be accessed via request.queryParams.[param]. Helpers There are several helpers available when writing function route handlers. serialize This helper returns the JSON for the given Model or Collection after passing it through the Serializer layer. It's useful if you want to do some final munging on the serialized JSON before returning it. this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta = { page: 1 }; return json; }); By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer name as the second argument: this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies, 'sparse-movie'); json.meta = { page: 1 }; return json; }); normalizedRequestAttrs This helper returns the body of a request in a normalized form, suitable for working with and creating records. For example, if your Ember app makes a POST request with this data // POST /users { data: { type: 'users', attributes: { 'first-name': 'Conan', 'middle-name': 'the', 'last-name': 'Barbarian' }, relationships: { team: { data: { type: 'teams', id: 1 } } } } } then normalizedRequestAttrs() could be used like this this.post('/users', function(schema, request) { let attrs = this.normalizedRequestAttrs(); /* attrs = { firstName: 'Conan', middleName: 'the', lastName: 'Barbarian', teamId: '1' } */ return schema.users.create(attrs); }); Note that attribute keys were camelCased, and the team foreign key was extracted. This is because a user owns the team foreign key; if another relationship were included in the request but the user did not own its foreign key, it would not have been extracted. This helper method leverages your serializer's normalize method. In the example above, it's assumed that the app was using the JSONAPISerializer, which comes with the #normalize method already written. If you're not using one of the bundled serializers, you'll need to implement #normalize and have it return a JSON:API document to take advantage of this method. Additionally, you'll need to use a full function here, as opposed to an ES6 arrow function (e.g () => { ... }). This is because normalizedRequestAttrs requires the this context from the function handler, and an arrow function would bind this from the outer scope. normalizedRequestAttrs() relies on a modelName to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the modelName to the helper as the first argument: this.patch('/users/edit/:id', function(schema, request) { let attrs = this.normalizedRequestAttrs('user'); // ... }); Status codes and headers By default, Mirage sets the HTTP status code of a response based on the verb being used for the route: GET is 200 PATCH/PUT is 204 POST is 201 DEL is 204 PATCH/PUT and POST change to 200 if there is a response body. Additionally, a header for Content-Type is set to application/json. You can customize both the response code and headers by returning an instance of the Response class in your route handler: // mirage/config.js import { Response } from 'miragejs'; export default function() { this.post('/authors', function(schema, request) { let attrs = JSON.parse(request.requestBody).author; if (attrs.name) { return schema.authors.create(attrs); } else { return new Response(400, { some: 'header' }, { errors: ['name cannot be blank'] }); } }); } External origins You can use Mirage to simulate other-origin requests. By default, a route like this.get('/contacts', ...) will hit the same origin that's serving your Ember app. To handle a different origin, use a fully qualified domain name: this.get('http://api.twitter.com/v1', ...) If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via urlPrefix: // mirage/config.js this.urlPrefix = 'https://my.api.com'; // This route will handle requests to https://my.api.com/contacts this.get('/contacts', ...) That's it on writing low-level function route handlers! Function route handlers are flexible, but also cumbersome to write out for every endpoint. If you're working with an API that's conventional enough, hopefully you'll be writing fewer function route handlers and more Shorthands, which we'll discuss in the next section. ","route":"templates.docs.route-handlers.functions","keywords":[]},"template:templates/docs/route-handlers/shorthands":{"id":"template:templates/docs/route-handlers/shorthands","type":"template","title":"Shorthands","text":" Shorthands APIs have become more standardized, so Mirage has the concept of Shorthands to deal with common scenarios. Shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. For example, this function route handler this.get('/movies', (schema, request) => { return schema.movies.all(); }); is pretty standard: it responds to a URL path with a collection of the same name. The Shorthand form of this is this.get('/movies'); This is a complete route handler. It infers the model name from the last part of the URL, and returns the corresponding collection. Returning a single movie by ID is just as easy: this.get('/movies/:id'); There are also Shorthands for creating and editing data. For example, this function route handler creates a new movie: this.post('/movies', (schema, request) => { let attrs = JSON.parse(request.requestBody).movie; return schema.movies.create(attrs); }); It's also pretty standard: it creates a new model using the attributes from the request payload. The equivalent Shorthand is this.post('/movies'); See the full list of available Shorthands below. Shorthands use default status codes based on the HTTP verb: GET, PATCH/PUT and DEL are 200 POST is 201 GET Shorthands Fetching a collection: // Shorthand this.get('/contacts'); // finds type by singularizing url this.get('/contacts', 'users'); // optionally specify the collection as second param // equivalent this.get('/contacts', (schema) => { return schema.contacts.all(); // users in the second case }); Fetching a model: // Shorthand this.get('/contacts/:id'); // finds type by singularizing url this.get('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.get('/contacts/:id', (schema, request) => { let id = request.params.id; return schema.contacts.find(id); // users in the second case }); Fetching multiple models by ID (for example, GET /contacts?ids=1,3): // Shorthand this.get('/contacts', { coalesce: true }); this.get('/contacts', 'users', { coalesce: true }); // equivalent this.get('/contacts', ({ contacts }, request) => { let ids = request.queryParams.ids; return contacts.find(ids); // users in the second case }); POST Shorthands Creating a resource: // Shorthand this.post('/contacts'); // finds type by singularizing url this.post('/contacts', 'user'); // optionally specify the type as second param // equivalent this.post('/contacts', function(schema, request) { let attrs = this.normalizedRequestAttrs(); return schema.contacts.create(attrs); }); For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. PATCH/PUT Shorthands Updating a resource: // Shorthand (these also work with this.put) this.patch('/contacts/:id'); // finds type by singularizing url this.patch('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.patch('/contacts/:id', function(schema, request) { let id = request.params.id; let attrs = this.normalizedRequestAttrs(); return schema.contacts.find(id).update(attrs); }); For this PATCH shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. DELETE Shorthands Destroying a resource: // Shorthand this.del('/contacts/:id'); // finds type by singularizing url this.del('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.del('/contacts/:id', (schema, request) => { let id = request.params.id; schema.contacts.find(id).destroy(); }); Destroying a resource and related models: // Shorthand this.del('/contacts/:id', ['contact', 'addresses']); // equivalent this.del('/contacts/:id', ({ contacts }, request) => { let id = request.params.id; let contact = contacts.find(id); contact.addresses.destroy(); contact.destroy(); }); To use this Shorthand, you must have the appropriate hasMany/belongsTo relationships defined in your data layer. Resource helper The resource helper lets you define multiple Shorthands for a given resource: // Resource helper usage this.resource('contacts'); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.patch('/contacts/:id'); // and this.put('/contacts/:id') this.del('/contacts/:id'); You can also whitelist which Shorthands will be defined using the only option: this.resource('contacts', { only: [ 'index', 'show' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); or which route handlers shouldn't be defined using except option: this.resource('contacts', { except: [ 'update' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.del('/contacts/:id'); If your route path and collection names do not match, you can define a relative or absolute path using the path option: this.resource('blog-posts', { path: '/posts' }); // Shorthands defined this.get('/posts', 'blog-posts'); this.get('/posts/:id', 'blog-posts'); this.post('/posts', 'blog-posts'); this.put('/posts/:id', 'blog-posts'); this.patch('/posts/:id', 'blog-posts'); this.del('/posts/:id', 'blog-posts'); Here is the full reference of the actions' names you can pass to the only / except options and the Shorthands they stand for: Action | Shorthand ------------------------------ index | this.get('/contacts') show | this.get('/contacts/:id') create | this.post('/contacts') update | this.patch('contacts/:id') (or this.put) delete | this.del('/contacts/:id') Shorthands are a key part of staying productive in your frontend codebase, but they only work so well because Mirage has a Data Layer that's aware of your application's domain model. We'll cover how it works in the next few sections of the docs. ","route":"templates.docs.route-handlers.shorthands","keywords":[]},"template:templates/docs/testing/acceptance-tests":{"id":"template:templates/docs/testing/acceptance-tests","type":"template","title":"Acceptance tests","text":" Acceptance tests Acceptance testing your Ember app involves verifying some user behavior. For example, you may want to test that the user can view a list of movies on your app's homepage. Many of these tests rely on a given server state. In other words, you want to test that, given ten movie resources exist on the server at the time the user boots up the app, when the user visits the homepage they see a list of 10 movies. Mirage was originally built specifically for these sorts of high-level tests. Let's see how it works. Assuming you're using Application Tests (introduced in Ember 3.0), add the setupMirage hook to the top of your test file: import { setupApplicationTest } from 'ember-qunit'; + import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); (If you are using pre-3.0 style tests, Mirage should boot automatically via an initializer. The only other difference is that Mirage is accessed via server, a global, whereas in 3.0-style tests Mirage is accessed via this.server. The rest of this guide will assume 3.0-style tests, but you can just use server in place of this.server and the rest of the documentation applies the same.) Now we can run your Ember app's test suite with ember t -s. In the test environment, Mirage will load all your route handlers from mirage/config.js, but it will ignore your seed data from mirage/scenarios/default.js. That means each test starts off with a clean database state. Within each test, you can use your factories to define your initial server state: test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); After each test, Mirage's server will be reset, so none of this state will leak across tests. Keeping your tests focused Factories are important in keeping code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten movies, given those movies existed on the server. So, the server.createList('movie', 10) call was directly in the test. Say we wanted to test that when the user visits a details route for a movie titled \"Interstellar,\" they would see that title in an

tag. One way to accomplish this would be to update the movie factory itself: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Interstellar' }); The problem with this approach is that this change is very specific to this test. Suppose another test needed to verify something different about movies with different titles. Changing the factory to suit that case would break this test. For this reason, you should use create and createList to override specific attributes of your model. This will keep code relevant to your test near your test, without making the rest of your test suite brittle. test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); test(\"I see the movies's title on the detail route\", await function(assert) { let movie = this.server.create('movie', { title: 'Interstellar' }); await visit(`/movies/${movie.id}`); assert.dom('h1').hasText('Interstellar'); }); Arrange, Act, Assert Mirage recommends using the Arrange, Act, Assert approach to write tests. You'll sometimes hear this pattern referred to as AAA testing (\"triple-A testing\"). You can see this structure in our test from above: test('I can view the movies', async function(assert) { // ARRANGE this.server.createList('movie', 10); // ACT await visit('/'); // ASSERT assert.dom('li.movie').exists({ count: 10 }); }); There are of course times where it makes sense to break this rule (for example to add some extra assertions near the beginning or middle of a test), but in general you should strive to follow the pattern. Testing errors To test how your Ember app responds to a server error, overwrite a route handler within a test: test('the user sees an error if the save attempt fails', async function(assert) { this.server.post('/questions', () => ({ errors: [ 'The database went on vacation' ] }), 500); await visit('/'); await click('.new'); await fillIn('input', 'New question'); await click('.save'); assert.dom('h2').hasText('The database went on vacation'); }); This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to /questions in your config.js file will be used again. Using scenarios in testing Typically you should reserve the scenarios/default.js file for development, so changes to it don't affect the rest of your test suite. That's why Mirage doesn't autoload this module during tests. If there's some logic you'd like to share between your development scenario and your tests, you can always make a new module under scenarios and import it in both places. If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: Create the module // scenarios/shared.js export default function(server) { server.loadFixtures('countries'); server.createList('event', 10); }; ...load it in your default scenario import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); await visit('/contacts'); assert.dom('p').exists({ count: 3 }); }); ...and then also load it in your tests (or even a common test setup function): import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); // ... }); This same sort of pattern will work for Integration and Unit tests as well. Those are the basics of Acceptance Testing with Mirage! Next let's talk about Integration and Unit tests. ","route":"templates.docs.testing.acceptance-tests","keywords":[]},"template:templates/docs/testing/assertions":{"id":"template:templates/docs/testing/assertions","type":"template","title":"Assertions","text":" Assertions Most of your tests will assert against your Ember app's UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you'll assert that your UI is in the state you expect it to be. But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server. To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend. Asserting against Mirage's database The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage's database. If the correct data makes it there, you'll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect. Here's an example: test(\"I can change the lesson's title\", async function(assert) { this.server.create('lesson', { title: 'My First Lesson' }) await visit('/'); await click('.Edit') await fillIn('input', 'Updated lesson'); await click('.Save'); // Assert against our app's UI assert.dom('h1').hasText('Updated lesson'); // Also check that the data was \"persisted\" to our backend assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); }); This is a great way to gain some extra confidence that your Ember app is sending over the data you expect. Asserting against Mirage Models It can also be useful to assert against Mirage's ORM models, to verify things like updates to your model's relationships: test('I can add a tag to a post', async function(assert) { let programming = this.server.create('tag', { name: 'Programming' }); let post = this.server.create('post'); await visit(`/posts/${post.id}/edit`); await select('.tags', 'Programming'); await click('.save'); assert.dom().includesText('Saved!'); assert.equal(post.reload().tagIds.includes(programming.id)); }); The reload method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected. Asserting against models is basically another way to verify Mirage's database data is correct. Asserting against handled requests and responses You can also assert against the actual HTTP requests and responses that are made during your test. To do this, first enable Pretender's trackedRequests feature by enabling the trackRequests environment option: // config/environment.js module.exports = function(environment) { if (environment === 'test') { ENV['ember-cli-mirage'] = { trackRequests: true }; } } This feature is disabled by default to avoid memory issues during long development sessions. Now Mirage will track every request (along with the associated response) and make them available to you via server.pretender.handledRequests. That way you can assert against requests in that array at the end of your test. test(\"I can filter the table\", async function(assert) { this.server.createList('movie', 5, { genre: 'Sci-Fi' }); this.server.createList('movie', 3, { genre: 'Drama' }); await visit('/'); await select('.genre', 'Sci-Fi'); // Assert against our app's UI assert.dom('tr').exists({ count: 5 }); // Also assert against the HTTP request count & query let requests = this.server.pretender.handledRequests; assert.equal(requests.length, 1); assert.deepEqual(requests[0].queryParams, { 'filter[genre]': 'Sci-Fi' }); }); In general we recommend asserting against Mirage's database and your UI, as the specifics of your app's HTTP requests should be considered implementation details of the behavior you're actually interested in verifying. But there's certainly valid reasons to drop down and assert against HTTP data. And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. ","route":"templates.docs.testing.assertions","keywords":[]},"template:templates/docs/testing/integration-and-unit-tests":{"id":"template:templates/docs/testing/integration-and-unit-tests","type":"template","title":"Integration and unit tests","text":" Integration and unit tests While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests. Let's say you have a data-fetching component, and you want to write a rendering test to verify its behavior. You can import and use the setupMirage function directly in your rendering test, and use Mirage just like you would in an acceptance test. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can fetch records', async function(assert) { this.server.create('movie', { title: 'Interstellar' }); await render(hbs`

{{model.title}}

`); assert.equal(this.element.textContent, 'Interstellar'); }); }); If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your mirage/config.js file, you can use this.server to setup new routes. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it renders an error state', async function(assert) { this.server.get( '/movies/:id', () => ({ errors: [ 'Something went wrong' ]}), 500 ); await render(hbs` {{#if error}}

Whoops!

{{/if}}
`); assert.equal(this.element.textContent, 'Whoops!'); }); }); Creating Ember Data models on the client with Mirage Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some. For example, let's say we were writing a rendering test to verify the behavior of our component: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // get the article await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); How might we test this? It might be tempting to use Mirage's server.create, since you probably already have factories defined: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // 🔴 Don't do this let article = this.server.create('article', { title: 'Old title' }); this.set('article', article); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); But you shouldn't do this. Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don't actually know anything about your Ember app. Mirage models exist solely in your \"backend\", and are only useful in helping you create your mock server definition. The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server. So, in the same way that you wouldn't create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component. // 🔴 Don't do this // `article` is a Mirage model. It should never be consumed directly by Ember code. let article = this.server.create('article'); this.set('article', article); await render(hbs` `); So, how might we get an article materialized into Ember Data's store so we can test this component, while still leveraging our Mirage factory definitions? Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this. Using findRecord and findAll The first approach is to lookup Ember Data's store, and use it to find the record (just like your Ember application's routes do): import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 1: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); let store = this.owner.lookup('service:store'); let article = await store.findRecord('article', serverArticle.id); this.set('article', article); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Writing a helper to push Mirage's database The second approach is to make a helper that serializers Mirage's database into JSON and pushes that JSON into your Ember Data store. The actual logic might depend on the configuration of your Mirage server, but if you're following all of Mirage's conventions it should look roughly like this: // your-app/tests/helpers/push-mirage-into-store.js import { getContext } from '@ember/test-helpers'; import { run } from '@ember/runloop'; export default function() { let context = getContext(); let store = context.owner.lookup('service:store'); Object.keys(context.server.schema) .filter(key => context.server.schema[key].all !== undefined) // Get the resources .forEach(resource => { let models = context.server.schema[resource].all(); let modelName = models.modelName; let serializer = context.server.serializerOrRegistry.serializerFor(modelName); let originalAlwaysIncludeLinkageData = serializer.alwaysIncludeLinkageData; serializer.alwaysIncludeLinkageData = true; let json = serializer.serialize(models); serializer.alwaysIncludeLinkageData = originalAlwaysIncludeLinkageData; run(() => { store.pushPayload(json); }); }); } Now in your test, call your helper to seed Ember Data's store, and then use peekRecord to materialize and work with Ember Data records: import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; import pushMirageIntoStore from 'YOUR-APP/tests/helpers/push-mirage-into-store'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 2: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); pushMirageIntoStore(); let store = this.owner.lookup('service:store'); let article = store.peekRecord('article', serverArticle.id); this.set('article', article); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Something like pushMirageIntoStore will probably make its way into Mirage at some point. Now that you've seen how to use setupMirage outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server! Next, we discuss some ways you can go about asserting against your Mirage mock server. ","route":"templates.docs.testing.integration-and-unit-tests","keywords":[]},"template:templates/docs/testing/setup-mirage":{"id":"template:templates/docs/testing/setup-mirage","type":"template","title":"setupMirage test helper","text":" setupMirage test helper In your tests (acceptance, integration and unit) you can import the setupMirage test helper to start the Mirage server. Passing the hooks from the test module allows the mirage server to be created and shutdown before and after each test. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); The second parameter (optional) allows defining the mirage server to be used for this set of tests. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import makeServer from 'app-name/mirage/config'; // replace app-name with your app name module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); If it is not desirable to use the default config from the mirage directory you could import any other file that implements the same function, or even define the function locally or inline import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { discoverEmberDataModels } from 'ember-cli-mirage'; import { createServer } from 'miragejs'; const makeServer = function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { this.namespace = \"api\" this.timing = 2000 this.get(\"/movies\", () => { return [\"Interstellar\", \"Inception\", \"Dunkirk\"] }) } }; return createServer(finalConfig); } module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); ","route":"templates.docs.testing.setup-mirage","keywords":[]},"template:templates/index":{"id":"template:templates/index","type":"template","title":"Productive","text":" Productive Spend less time wiring up HTTP stubs, and get back to developing your app. Test-worthy Use factories to define your server's state per test. Acceptance testing just got a whole lot easier. Shareable Share a functional prototype of your app that runs entirely in the client – before writing a single line of your API. Read the docs ","route":"templates.index","keywords":[]},"template:templates/not-found":{"id":"template:templates/not-found","type":"template","title":"Not found","text":" Not found This page doesn't exist. Head home? ","route":"templates.not-found","keywords":[]}}} +{"index":{"version":"2.3.9","fields":["title","text","keywords"],"fieldVectors":[["title/template:application",[]],["text/template:application",[0,3.205]],["keywords/template:application",[]],["title/template:blog",[]],["text/template:blog",[]],["keywords/template:blog",[]],["title/template:blog/detail",[]],["text/template:blog/detail",[1,0.544,2,1.89,3,4.505,4,2.045,5,5.549,6,2.869,7,5.549,8,5.549]],["keywords/template:blog/detail",[]],["title/template:blog/error",[9,1.592,10,2.303]],["text/template:blog/error",[9,3.199,10,4.628]],["keywords/template:blog/error",[]],["title/template:blog/index",[0,2.129]],["text/template:blog/index",[0,3.205]],["keywords/template:blog/index",[]],["title/template:docs",[]],["text/template:docs",[]],["keywords/template:docs",[]],["title/template:docs/advanced/customizing-the-inflector",[11,0.953,12,2.303]],["text/template:docs/advanced/customizing-the-inflector",[1,0.683,11,2.045,12,5.575,13,0.634,14,0.676,15,0.988,16,1.285,17,2.509,18,2.509,19,2.509,20,0.861,21,6.288,22,5.437,23,0.824,24,1.077,25,5.575,26,0.676,27,4.407,28,3.979,29,1.268,30,5.505,31,4.407,32,1.76,33,2.509,34,2.387,35,2.509,36,5.505,37,3.483,38,1.619,39,5.505,40,0.588,41,2.789,42,2.601,43,1.911,44,2.198,45,5.505,46,3.63,47,1.624,48,1.389,49,1.911,50,1.015,51,2.789,52,1.285,53,2.509,54,3.144,55,1.189,56,1.605,57,1.501,58,1.501,59,2.082,60,2.509,61,4.407,62,4.407,63,3.926,64,3.63,65,1.911,66,4.407,67,0.988,68,0.861,69,3.104,70,1.389,71,2.789,72,4.407,73,2.509,74,4.407,75,1.099,76,4.407,77,2.604,78,2.198,79,1.189,80,2.789,81,1.389,82,2.789,83,2.509,84,1.624,85,2.789,86,2.789,87,1.501,88,1.099,89,1.911,90,3.926,91,2.082,92,2.509,93,3.63]],["keywords/template:docs/advanced/customizing-the-inflector",[]],["title/template:docs/advanced/environment-options",[94,1.213,95,0.953]],["text/template:docs/advanced/environment-options",[1,0.702,4,1.822,13,0.543,14,0.775,15,0.995,23,0.92,24,0.995,26,0.827,33,2.815,35,2.123,38,1.333,40,0.619,44,1.489,56,1.087,67,0.669,73,2.123,77,1.617,81,1.558,83,2.815,92,2.123,94,2.837,95,2.011,96,2.093,97,1.558,98,5.201,99,2.123,100,5.201,101,1.617,102,1.617,103,3.668,104,2.228,105,1.102,106,1.059,107,3.526,108,1.791,109,3.729,110,3.729,111,1.006,112,1.374,113,1.27,114,5.201,115,3.071,116,2.556,117,2.36,118,1.928,119,0.792,120,3.071,121,3.071,122,3.955,123,4.567,124,3.071,125,2.123,126,2.815,127,3.071,128,2.144,129,2.123,130,2.66,131,3.526,132,2.144,133,2.66,134,2.66,135,2.36,136,3.324,137,2.36,138,1.084,139,0.93,140,2.36,141,2.336,142,1.974,143,1.374,144,1.974,145,1.087,146,1.762,147,2.123,148,1.087,149,4.944,150,1.495,151,1.928,152,3.509,153,3.729,154,1.489,155,2.123,156,1.928,157,1.617,158,0.729,159,3.729,160,3.071,161,3.729,162,3.729,163,3.729,164,1.558,165,3.071,166,2.123,167,1.928,168,3.729,169,3.729,170,3.729,171,2.79,172,2.123,173,1.684,174,2.66,175,2.36,176,2.36,177,4.072,178,1.374,179,2.36,180,1.087,181,3.071,182,1.762,183,1.233,184,4.944,185,3.071,186,2.36,187,3.729,188,3.729,189,3.729,190,0.859,191,3.071,192,2.66,193,3.729,194,1.762]],["keywords/template:docs/advanced/environment-options",[]],["title/template:docs/advanced/mocking-guids",[52,0.815,195,1.321]],["text/template:docs/advanced/mocking-guids",[1,0.698,11,1.902,13,0.659,14,0.553,23,0.675,24,0.809,26,0.553,29,1.038,40,0.442,50,1.46,52,1.768,59,2.13,67,0.809,69,2.331,70,1.421,96,1.902,97,1.421,139,1.512,150,1.216,195,2.638,196,6.339,197,1.955,198,3.714,199,4.509,200,5.467,201,2.567,202,3.216,203,3.714,204,2.853,205,1.911,206,1.383,207,2.23,208,4.509,209,2.638,210,2.066,211,3.714,212,4.123,213,3.714,214,2.853,215,6.066,216,3.216,217,4.509,218,4.509,219,2.422,220,1.536,221,2.638,222,1.801,223,2.331,224,2.567,225,4.521,226,1.421,227,4.509,228,6.066,229,4.509,230,4.509,231,4.509,232,5.584,233,3.714,234,4.509,235,4.509,236,3.714,237,4.599,238,2.422,239,4.509,240,4.509,241,4.509,242,4.509,243,4.509]],["keywords/template:docs/advanced/mocking-guids",[]],["title/template:docs/advanced/server-configuration",[56,0.815,105,0.502]],["text/template:docs/advanced/server-configuration",[1,0.7,11,1.041,13,0.582,14,0.789,15,1.119,20,0.977,23,1.009,24,1.028,26,0.789,29,1.481,40,0.68,44,1.22,48,0.963,55,0.824,56,1.457,57,1.041,67,1.096,68,1.271,70,1.575,75,1.246,78,2.492,79,0.824,88,1.075,91,1.444,101,1.257,103,1.739,105,1.138,106,0.548,108,0.891,111,1.163,112,1.126,113,1.041,116,3.159,125,1.739,128,1.325,134,3.566,135,3.163,136,3.662,137,3.163,138,1.271,139,1.246,140,3.163,148,0.891,158,0.597,164,0.963,166,1.739,167,2.23,171,2.362,172,2.846,173,1.469,178,1.126,179,2.729,180,1.257,181,2.516,182,1.444,183,0.762,190,0.703,194,1.444,206,0.916,220,1.469,223,1.58,244,2.026,245,1.621,246,2.516,247,2.516,248,1.58,249,1.216,250,1.257,251,3.076,252,1.933,253,2.585,254,1.739,255,3.076,256,3.055,257,3.055,258,3.055,259,3.552,260,2.179,261,3.055,262,2.846,263,1.22,264,3.076,265,2.516,266,1.359,267,2.516,268,1.325,269,1.933,270,1.722,271,3.055,272,1.22,273,3.552,274,1.444,275,0.963,276,2.179,277,1.041,278,3.055,279,2.179,280,3.055,281,2.516,282,3.055,283,3.055,284,2.516,285,1.041,286,1.126,287,2.516,288,3.055,289,3.055,290,1.933,291,2.179,292,1.59,293,2.179,294,1.444,295,3.055,296,1.739,297,2.516,298,3.055,299,3.055,300,1.59,301,3.055,302,2.179,303,1.933,304,1.933,305,1.126,306,3.552,307,2.179,308,2.179,309,2.179,310,1.58,311,2.516,312,1.842,313,1.444,314,1.22,315,2.516,316,2.179,317,2.516,318,1.22,319,3.552,320,3.055,321,1.444,322,1.58,323,1.58,324,2.516,325,2.516,326,2.516,327,2.516,328,1.444,329,2.516,330,1.041,331,1.444,332,2.179,333,3.566,334,3.163,335,1.151,336,4.999,337,2.516,338,1.797,339,3.552,340,1.933,341,2.179,342,1.739,343,1.933,344,1.444,345,1.739,346,2.846,347,3.566,348,2.456,349,1.739,350,1.325,351,1.22,352,3.055,353,3.878,354,1.325,355,3.163,356,2.516,357,2.891,358,1.58,359,2.516,360,3.055,361,3.055,362,3.055]],["keywords/template:docs/advanced/server-configuration",[]],["title/template:docs/advanced/simulating-cookie-responses",[144,0.892,363,1.272,364,1.84]],["text/template:docs/advanced/simulating-cookie-responses",[1,0.683,13,0.488,14,0.612,37,3.153,40,0.581,68,0.974,88,1.479,96,2.234,97,1.57,138,0.974,139,1.242,144,2.53,180,1.453,190,1.147,206,1.26,222,1.99,250,1.453,269,3.153,276,3.554,363,3.378,364,5.402,365,4.104,366,2.354,367,5.218,368,4.983,369,3.153,370,4.983,371,2.369,372,4.983,373,4.983,374,4.983,375,3.554,376,4.983,377,4.983,378,4.983,379,5.933,380,4.983,381,4.104,382,4.983,383,4.983,384,4.983,385,4.983,386,4.983,387,4.983,388,3.153,389,4.983,390,4.983,391,2.837,392,4.983]],["keywords/template:docs/advanced/simulating-cookie-responses",[]],["title/template:docs/advanced/switching-between-scenarios",[393,1.413,394,0.969,395,1.055]],["text/template:docs/advanced/switching-between-scenarios",[1,0.697,4,2.136,13,0.568,14,0.501,16,1.191,18,2.326,20,0.798,24,0.941,26,0.795,29,1.408,32,1.631,40,0.645,50,0.941,55,1.102,56,1.529,67,1.04,68,1.025,71,4.002,81,1.826,94,1.772,95,1.391,96,1.391,99,2.987,101,1.919,105,1.04,106,1.161,107,2.914,108,1.689,111,1.102,113,1.787,115,5.037,116,2.112,126,2.326,139,1.018,164,1.826,166,2.326,171,1.93,175,2.585,190,0.941,201,2.987,206,0.867,226,1.287,233,3.364,249,0.867,275,1.653,286,1.505,292,1.505,300,1.505,318,1.631,330,1.787,371,1.631,393,3.32,394,1.772,395,3.264,396,3.364,397,4.321,398,2.275,399,1.505,400,2.585,401,1.391,402,1.505,403,2.585,404,1.772,405,2.914,406,3.364,407,4.085,408,2.89,409,2.326,410,5.246,411,2.585,412,4.085,413,1.772,414,2.112,415,4.085,416,2.112,417,4.085,418,1.391,419,4.085,420,4.085,421,4.085,422,2.914,423,2.914,424,5.796,425,4.085,426,4.085,427,3.364,428,3.364,429,5.246,430,4.085,431,6.116,432,4.773,433,5.796,434,4.085,435,4.085,436,2.479,437,4.085,438,4.085,439,3.364,440,4.085,441,3.364,442,4.085,443,2.585]],["keywords/template:docs/advanced/switching-between-scenarios",[]],["title/template:docs/data-layer/database",[50,0.861]],["text/template:docs/data-layer/database",[1,0.698,6,2.154,13,0.624,14,0.652,15,1.105,16,1.215,24,0.748,26,0.511,38,1.433,40,0.521,50,1.569,52,1.215,58,1.419,67,0.748,69,2.154,70,1.313,89,1.807,97,1.313,102,1.215,105,0.748,106,0.748,126,2.372,128,1.807,138,1.143,139,1.039,141,1.969,142,1.664,146,1.969,147,2.372,150,1.716,152,2.636,158,0.814,180,1.549,190,0.959,198,3.432,202,2.972,204,2.636,205,2.005,206,0.885,207,2.122,226,1.843,245,1.039,250,1.705,263,1.664,270,1.664,274,1.969,275,1.313,292,1.536,312,2.156,313,1.969,331,1.969,335,1.223,366,1.969,371,2.46,398,1.807,399,1.536,408,2.51,414,2.154,436,1.969,444,4.167,445,1.664,446,2.636,447,3.432,448,2.372,449,2.972,450,4.167,451,2.154,452,2.51,453,2.372,454,2.271,455,1.958,456,2.636,457,2.122,458,2.972,459,1.807,460,1.969,461,2.972,462,2.537,463,2.05,464,2.122,465,3.025,466,3.025,467,2.372,468,4.167,469,1.969,470,1.419,471,1.536,472,1.419,473,3.432,474,1.664,475,2.636,476,4.167,477,2.372,478,2.636,479,2.972,480,2.636,481,4.167,482,2.372,483,1.807,484,1.807,485,2.764,486,4.167,487,4.167,488,5.313,489,5.313,490,4.167,491,4.167,492,4.167,493,2.636]],["keywords/template:docs/data-layer/database",[]],["title/template:docs/data-layer/factories",[494,1.274]],["text/template:docs/data-layer/factories",[1,0.705,2,2.181,3,2.094,4,0.832,9,0.76,11,0.455,13,0.627,14,0.424,15,0.957,16,0.389,20,0.755,23,0.78,24,0.693,25,1.1,26,0.753,29,1.412,32,1.172,40,0.46,47,1.273,48,1.64,50,1.165,52,0.389,54,1.611,55,1.266,57,0.769,58,0.769,60,0.76,65,0.579,67,1.108,68,0.441,70,0.421,71,0.845,75,1.261,77,0.579,79,1.131,81,0.712,83,0.76,87,0.455,88,1.113,90,0.952,91,1.067,94,0.579,96,1.599,97,0.421,99,1.286,101,1.302,104,1.176,105,0.957,106,1.108,108,1.588,111,1.266,112,1.082,113,0.455,118,0.69,119,0.89,128,1.498,132,0.579,133,2.094,138,0.261,139,1.113,141,1.387,142,0.533,145,1.302,146,1.387,148,1.126,150,0.931,154,1.783,156,1.168,157,1.498,158,0.956,164,0.421,167,0.69,172,1.286,173,1,176,0.845,178,0.832,183,1.298,186,1.858,190,0.795,194,0.631,197,0.579,202,0.952,205,1.848,206,0.89,207,1.542,209,1.067,210,1.723,219,0.579,220,1,222,1.172,223,0.69,224,1.286,226,1.681,238,0.98,244,1.717,245,1.59,249,1.157,253,0.69,260,0.952,262,0.76,264,0.952,266,0.712,270,1.674,275,1.217,277,0.455,279,0.952,285,1.176,286,0.492,291,0.952,293,0.952,294,1.387,296,1.671,297,1.1,300,1.423,303,1.429,304,0.845,305,0.832,308,0.952,309,0.952,310,1.168,313,1.632,314,0.533,315,1.1,318,1.953,321,1.387,322,1.168,323,0.69,324,5.295,328,1.632,330,2.129,335,0.307,340,0.845,344,2.311,346,0.76,349,0.76,350,1.498,351,1.542,371,0.533,381,1.1,393,1.429,395,2.311,396,1.1,398,1.818,399,1.273,401,1.315,402,1.082,403,0.845,408,1.387,411,1.429,413,0.98,416,1.785,418,1,432,2.844,436,1.825,441,3.181,445,0.533,446,0.845,451,1.518,454,0.492,455,0.832,457,0.533,460,0.631,462,2.777,463,2.017,464,1.783,469,0.631,470,1.723,471,1.545,472,1.773,474,0.533,477,0.76,482,1.671,483,1.273,484,1.273,485,1.387,493,0.845,494,2.27,495,0.76,496,3.453,497,0.845,498,2.418,499,1.611,500,1.168,501,1.335,502,3.862,503,1.1,504,0.952,505,0.952,506,0.533,507,1.335,508,1.429,509,1.335,510,1.335,511,1.981,512,0.845,513,1.785,514,1.674,515,1.802,516,1.335,517,0.845,518,1.335,519,0.952,520,1.518,521,1.966,522,2.185,523,3.678,524,0.952,525,1.335,526,1.858,527,2.418,528,1.1,529,1.1,530,1.1,531,2.391,532,1.168,533,3.608,534,2.259,535,3.349,536,2.754,537,0.902,538,1.335,539,1.429,540,1.1,541,2.259,542,1.335,543,1.335,544,0.952,545,0.69,546,1.1,547,2.463,548,3.512,549,0.69,550,1.86,551,1.335,552,1.86,553,1.067,554,1.611,555,1.335,556,2.463,557,3.375,558,2.185,559,1.86,560,2.259,561,1.335,562,1.335,563,2.418,564,2.259,565,1.335,566,1.335,567,1.429,568,0.845,569,1.1,570,0.952,571,1.335,572,1.335,573,1.335,574,1.335,575,1.335,576,1.335,577,1.335,578,3.094,579,1.273,580,1.1,581,2.418,582,1.858,583,2.653,584,1.335,585,1.611,586,2.259,587,1.1,588,0.952,589,3.862,590,1.335,591,1.335,592,1.335,593,1.335,594,1.86,595,1.335,596,1.335,597,1.335,598,1.335,599,1.335,600,1.335,601,1.335,602,1.335,603,1.335,604,2.194,605,0.845,606,1.335,607,3.678,608,1.1,609,1.86,610,0.952,611,1.86,612,1.335,613,1.168,614,1.335,615,1.518,616,1.335,617,2.826,618,1.335,619,2.259,620,0.76,621,0.631,622,5.799,623,2.615,624,0.69,625,1.335,626,0.952,627,1.335,628,1.335,629,0.845,630,1.335,631,1.335,632,2.259,633,0.845,634,0.579,635,1.1,636,0.952,637,1.335,638,0.952,639,0.952,640,3.185,641,0.69,642,2.704,643,1.335,644,4.89,645,3.453,646,2.418,647,3.453,648,1.335,649,1.1,650,1.1,651,1.335,652,4.695,653,0.631,654,0.952,655,1.172,656,1.1,657,0.952,658,1.286,659,3.862,660,0.631,661,1.335,662,2.936,663,0.952,664,0.69,665,0.579,666,2.259,667,1.335,668,1.335,669,1.286,670,1.518,671,1.335,672,1.335,673,0.76,674,1.86,675,1.1,676,0.69,677,1.335,678,4.695,679,2.094,680,2.094,681,1.86,682,2.259,683,2.259,684,2.259,685,0.845,686,1.335,687,0.952,688,2.936,689,1.335,690,1.335,691,1.335,692,2.259,693,1.429,694,2.259,695,2.936,696,0.76,697,1.335,698,1.1,699,1.1,700,1.335,701,1.335,702,0.76,703,1.335,704,0.76,705,1.1,706,1.611,707,2.259,708,1.335,709,1.335,710,1.335,711,1.1,712,1.335,713,0.952,714,1.335,715,1.335,716,1.335,717,1.335,718,1.335,719,3.453,720,1.335,721,1.335,722,1.1,723,0.845,724,0.845,725,1.335,726,1.671,727,1.335,728,0.98,729,1.335,730,0.845,731,2.094,732,1.1,733,0.845,734,0.845,735,0.952,736,1.1,737,1.1,738,0.631,739,1.1,740,0.952,741,0.69,742,0.952,743,1.335,744,1.335,745,0.952,746,1.1,747,1.335,748,0.845,749,1.1,750,1.335,751,0.952,752,1.335,753,1.335,754,2.936,755,2.259,756,2.259,757,2.259,758,1.1,759,0.76,760,1.335,761,0.845,762,1.335,763,1.1,764,1.1,765,1.1,766,0.952,767,0.845,768,1.1,769,0.952,770,1.1,771,1.335,772,1.335,773,1.1]],["keywords/template:docs/data-layer/factories",[]],["title/template:docs/data-layer/fixtures",[323,1.933]],["text/template:docs/data-layer/fixtures",[1,0.705,2,1.754,4,1.726,11,0.927,13,0.641,14,0.672,15,1.085,20,0.532,23,0.924,26,0.789,28,1.721,32,1.585,34,2.233,40,0.605,43,1.18,47,1.726,48,0.857,50,1.261,55,0.734,56,0.793,57,0.927,65,1.18,67,1.152,75,1.685,79,0.734,84,1.003,87,1.352,88,0.678,101,1.827,102,0.793,106,0.712,108,0.793,111,0.734,119,0.578,129,1.549,132,1.721,145,1.596,148,1.157,150,1.263,154,1.585,156,1.406,164,1.25,183,1.563,195,1.285,200,2.241,201,1.549,205,2.12,206,0.995,209,1.285,210,1.352,220,1.352,222,1.585,226,1.25,245,0.989,249,0.578,266,1.476,270,1.086,275,1.25,286,1.003,305,2.274,312,1.003,314,1.086,321,1.285,322,2.422,323,3.48,330,1.352,335,1.079,338,1.07,345,1.549,359,2.241,398,1.18,400,1.721,401,0.927,408,1.285,411,2.511,418,0.927,436,2.213,445,1.086,454,1.726,455,1.726,458,1.94,460,1.285,461,1.94,463,1.622,469,2.701,470,2.188,471,1.462,472,1.352,482,1.549,483,1.18,484,1.18,485,1.285,494,1.596,514,1.585,520,2.662,522,2.964,528,2.241,531,1.086,545,1.406,553,1.285,557,1.721,558,1.721,579,1.18,587,2.241,604,1.18,615,1.406,617,1.721,621,2.788,629,1.721,633,1.721,634,1.721,635,3.268,636,2.83,642,2.213,660,1.285,665,1.18,675,2.241,726,2.667,728,1.18,737,2.241,741,1.406,748,2.511,759,1.549,774,2.72,775,2.259,776,3.968,777,2.72,778,2.241,779,2.72,780,2.72,781,1.94,782,4.509,783,3.968,784,3.968,785,2.052,786,1.721,787,1.94,788,2.72,789,2.241,790,2.241,791,2.72,792,6.269,793,2.72,794,2.72,795,2.72,796,5.149,797,2.72,798,2.72,799,2.72,800,2.72,801,2.72,802,2.72,803,2.72,804,2.72,805,2.72,806,2.72,807,2.72,808,2.72,809,2.72,810,2.72,811,2.72,812,2.72,813,2.72,814,3.268,815,3.341,816,2.72,817,2.241,818,1.875,819,4.685,820,2.241,821,1.549,822,2.72,823,2.241,824,2.72,825,2.72,826,2.72,827,2.72,828,2.241,829,2.241,830,2.422,831,3.968,832,5.716,833,2.241,834,5.149,835,2.72,836,2.662,837,4.241,838,5.149,839,3.905,840,2.72,841,1.003,842,1.721,843,2.259,844,1.18,845,2.72,846,2.72,847,1.285,848,3.968,849,3.968,850,1.721,851,1.721,852,2.72,853,1.721,854,2.241,855,2.72,856,2.241,857,2.241,858,1.721,859,3.268,860,2.72,861,2.241,862,2.72,863,2.241,864,2.72]],["keywords/template:docs/data-layer/fixtures",[]],["title/template:docs/data-layer/models",[23,0.56]],["text/template:docs/data-layer/models",[1,0.688,2,1.699,6,1.954,13,0.621,14,0.757,15,1.001,16,1.454,19,2.151,20,0.975,23,1.051,24,0.895,26,0.685,28,2.391,29,0.87,38,1.019,40,0.605,49,2.574,52,1.102,65,1.639,67,1.001,70,1.191,75,0.942,77,1.639,87,1.287,97,1.571,101,1.454,104,1.287,105,0.895,118,1.954,119,1.059,138,0.975,139,1.243,145,1.454,146,1.785,148,1.102,150,1.345,158,0.975,173,1.287,176,3.156,178,1.393,180,1.454,182,1.785,183,1.538,210,1.287,212,2.391,220,2.159,244,1.191,245,1.611,248,1.954,249,1.346,250,1.454,255,2.695,263,1.509,272,1.992,277,1.287,292,1.838,294,1.785,300,1.393,312,2.057,318,1.509,328,1.785,338,1.019,342,2.151,350,1.639,354,1.639,371,2.371,394,1.639,401,1.287,402,1.393,408,2.356,409,2.151,418,1.287,436,2.356,454,1.838,455,1.393,457,2.229,459,1.639,463,1.571,473,3.112,474,1.509,494,1.699,499,2.695,506,1.509,513,2.578,514,1.509,521,2.151,526,3.532,545,1.954,613,3.069,639,2.695,646,3.112,655,1.992,664,1.954,679,2.695,680,2.695,681,3.112,685,2.391,696,2.151,830,1.954,843,2.151,850,3.156,865,2.151,866,3.779,867,2.695,868,3.779,869,3.779,870,3.112,871,3.112,872,2.695,873,1.393,874,2.695,875,2.695,876,2.391,877,3.112,878,2.886,879,3.779,880,2.391,881,2.391,882,3.779,883,3.112,884,3.779,885,3.779,886,3.779,887,3.112,888,3.779,889,3.112,890,3.779,891,3.779,892,3.156,893,3.112,894,3.532,895,3.112,896,3.779,897,3.779,898,4.987,899,3.779,900,3.779,901,3.779,902,3.779,903,3.557,904,3.779,905,3.779,906,3.779,907,2.391,908,3.779,909,2.391]],["keywords/template:docs/data-layer/models",[]],["title/template:docs/data-layer/orm",[454,1.378]],["text/template:docs/data-layer/orm",[1,0.707,13,0.558,14,0.546,15,1.157,16,0.595,20,1.046,23,0.991,24,0.573,26,0.593,29,1.025,32,0.815,37,1.292,38,1.381,40,0.618,43,1.706,47,1.887,48,1.006,49,0.886,50,1.275,55,0.551,56,0.595,57,1.088,58,1.34,60,1.163,67,0.798,70,0.643,73,1.819,75,1.381,79,0.861,80,1.292,81,0.643,84,0.753,86,1.292,87,0.695,88,1.277,89,1.385,96,0.695,97,0.643,101,0.595,102,0.595,104,0.695,105,0.706,111,0.551,112,1.64,113,0.695,119,1.176,138,1.16,139,1.204,143,0.753,144,2.045,145,0.931,148,1.56,150,1.061,151,1.651,158,0.399,164,1.239,173,1.088,178,1.177,180,1.56,182,2.102,183,1.608,190,0.735,192,3.174,195,1.509,197,0.886,205,2.114,206,0.434,207,1.571,210,1.516,212,2.021,219,0.886,221,1.509,236,2.631,238,0.886,244,1.402,245,1.277,249,1.087,250,1.73,263,0.815,266,0.643,270,0.815,277,1.088,286,0.753,292,1.177,305,1.887,307,1.456,312,0.753,313,0.965,318,1.276,321,0.965,328,1.859,330,0.695,335,0.47,338,1.381,345,1.163,348,1.819,350,0.886,358,2.034,366,1.509,369,1.292,393,1.292,394,0.886,399,0.753,401,0.695,402,1.177,404,0.886,409,1.163,418,1.516,445,1.571,448,1.163,452,0.965,454,2.325,455,0.753,457,0.815,459,1.385,461,1.456,462,2.83,463,2.004,464,2.273,465,1.163,466,1.163,470,2.107,471,1.64,472,1.516,474,0.815,475,2.021,495,1.163,496,1.682,497,1.292,500,1.056,504,1.456,506,1.276,508,1.292,511,1.509,512,1.292,514,2.137,515,0.753,519,2.278,520,2.034,526,1.292,531,2.497,533,3.817,535,3.652,536,3.652,537,0.815,549,1.056,585,1.456,604,1.93,605,2.489,607,4.217,608,1.682,609,3.24,610,1.456,611,4.796,613,2.647,615,2.034,620,1.163,621,1.859,634,0.886,641,1.651,642,0.965,649,1.682,653,2.102,655,1.571,657,1.456,658,1.819,660,1.859,665,0.886,673,1.163,687,1.456,693,1.292,696,1.819,702,1.163,726,1.819,728,1.385,738,0.965,759,1.819,761,1.292,769,1.456,818,2.282,841,1.64,842,1.292,843,1.163,844,2.469,847,1.509,856,1.682,858,1.292,859,1.682,865,1.163,873,1.177,883,1.682,889,1.682,910,2.278,911,1.682,912,2.042,913,2.021,914,2.021,915,2.042,916,2.042,917,2.042,918,1.682,919,1.682,920,1.682,921,1.682,922,2.042,923,2.042,924,3.934,925,1.651,926,1.819,927,3.194,928,2.042,929,3.056,930,3.194,931,3.194,932,2.042,933,1.292,934,5.12,935,5.12,936,5.12,937,2.042,938,2.042,939,3.194,940,2.042,941,1.682,942,2.042,943,2.042,944,2.042,945,2.042,946,1.456,947,1.682,948,3.194,949,5.538,950,3.194,951,3.817,952,2.042,953,1.682,954,2.278,955,2.806,956,2.278,957,1.456,958,2.278,959,2.042,960,1.456,961,2.631,962,3.194,963,1.682,964,2.042,965,1.456,966,3.194,967,1.682,968,1.163,969,2.278,970,2.631,971,1.682,972,1.292,973,1.456,974,1.056,975,2.042,976,2.042,977,2.042,978,3.194,979,2.042,980,1.456,981,2.042,982,1.682,983,2.042,984,1.056,985,1.682,986,2.042,987,3.934,988,3.934,989,3.934,990,3.934,991,3.194,992,3.194,993,3.934,994,3.934,995,1.682,996,2.042,997,2.042,998,2.042,999,2.042,1000,2.042,1001,2.042,1002,1.682,1003,2.042,1004,2.042,1005,2.042,1006,1.163]],["keywords/template:docs/data-layer/orm",[]],["title/template:docs/data-layer/relationships",[183,0.932]],["text/template:docs/data-layer/relationships",[0,1.502,1,0.705,2,1.321,3,4.705,11,0.898,13,0.53,14,0.324,15,0.696,16,1.131,17,1.502,20,0.899,23,1.025,24,0.91,26,0.804,29,1.168,32,1.053,40,0.451,47,1.43,48,0.831,49,2.201,50,0.607,52,0.769,59,1.246,63,1.881,65,1.144,67,1.176,75,1.147,78,1.838,79,0.711,80,1.669,82,1.669,84,1.43,87,0.898,88,0.967,90,1.881,91,1.833,95,1.567,96,1.567,102,0.769,104,1.567,111,0.711,119,0.824,126,1.502,130,2.767,147,2.209,154,1.838,164,1.599,173,1.321,178,0.972,179,1.669,180,0.769,183,1.663,205,1.703,206,1.34,207,1.053,220,2.043,221,1.246,222,1.549,224,1.502,245,1.147,248,1.364,249,1.273,254,1.502,266,0.831,272,1.053,274,2.174,275,1.599,285,1.926,292,1.43,296,2.209,300,1.43,305,1.696,314,1.053,321,2.94,322,3.301,330,1.321,335,0.893,338,1.046,342,1.502,350,2.201,351,1.838,354,1.683,394,1.144,402,0.972,404,1.144,418,0.898,451,1.364,454,0.972,455,0.972,456,1.669,457,1.053,459,1.144,463,1.222,470,1.728,471,1.993,472,1.567,494,0.898,513,1.364,514,1.053,520,3.388,537,1.053,579,1.144,604,1.683,613,2.006,615,1.364,621,2.174,634,2.201,638,1.881,640,1.881,642,2.94,650,3.195,655,2.258,656,2.173,664,1.364,665,1.683,669,2.62,676,1.364,679,2.767,680,2.767,713,1.881,728,1.144,738,1.833,821,1.502,830,3.334,833,2.173,839,1.881,843,2.889,844,2.601,850,1.669,851,1.669,853,1.669,858,3.578,876,2.455,877,3.79,878,1.364,909,1.669,925,1.364,980,1.881,1007,2.638,1008,2.173,1009,2.638,1010,1.881,1011,5.074,1012,4.602,1013,2.638,1014,2.638,1015,3.88,1016,2.638,1017,2.638,1018,2.638,1019,2.638,1020,3.79,1021,2.638,1022,3.79,1023,2.638,1024,4.814,1025,2.638,1026,2.638,1027,2.638,1028,3.88,1029,4.602,1030,2.638,1031,2.638,1032,2.638,1033,2.638,1034,2.638,1035,2.455,1036,5.407,1037,2.638,1038,2.638,1039,4.602,1040,2.638,1041,2.638,1042,1.669,1043,3.88,1044,3.88,1045,2.638,1046,2.638,1047,2.638,1048,3.88,1049,2.638,1050,5.845,1051,2.173,1052,3.88,1053,2.638,1054,2.638,1055,2.638,1056,2.638,1057,2.638,1058,1.881,1059,2.638,1060,2.638,1061,2.638,1062,2.638,1063,2.638,1064,2.638,1065,3.88,1066,3.88,1067,3.88,1068,2.638,1069,2.638,1070,2.638,1071,2.638,1072,2.638,1073,2.638,1074,2.638,1075,2.638,1076,3.88,1077,2.638,1078,3.88,1079,1.364]],["keywords/template:docs/data-layer/relationships",[]],["title/template:docs/data-layer/serializers/ember-data-serializer",[]],["text/template:docs/data-layer/serializers/ember-data-serializer",[1,0.667,13,0.661,14,0.767,15,1.155,19,2.467,20,0.847,23,0.936,24,0.778,26,0.731,29,1.254,40,0.667,47,1.597,67,0.977,68,1.221,75,1.081,78,2.175,105,0.977,119,1.157,145,1.263,148,1.263,197,1.88,204,3.447,205,2.029,238,1.88,266,2.029,268,1.88,269,2.742,286,2.196,305,2.304,314,1.731,338,1.86,340,3.447,344,2.048,346,2.467,347,4.458,348,3.842,350,2.974,351,1.731,354,2.584,355,3.447,357,4.317,366,2.048,399,1.597,418,1.476,537,1.731,581,5.148,658,2.467,851,2.742,873,2.196,1006,2.467,1024,3.57,1080,3.885,1081,4.334,1082,3.57,1083,3.57,1084,4.334,1085,6.25,1086,5.447,1087,3.57,1088,4.334,1089,3.57,1090,4.334,1091,4.334]],["keywords/template:docs/data-layer/serializers/ember-data-serializer",[]],["title/template:docs/data-layer/serializers/index",[338,1.008]],["text/template:docs/data-layer/serializers/index",[1,0.702,9,1.431,11,1.96,13,0.649,14,0.791,15,1.12,16,1.445,17,2.131,20,0.968,23,0.886,24,0.802,26,0.742,29,1.325,34,1.09,38,1.498,40,0.519,42,1.187,44,1.495,48,0.792,49,2.298,52,0.732,54,1.792,55,0.678,57,0.856,58,1.275,67,0.997,68,0.491,70,1.863,75,1.115,79,0.678,80,2.83,84,1.379,86,1.59,87,0.856,88,1.321,89,1.623,95,0.856,101,0.732,102,0.732,103,1.431,104,0.856,106,0.451,111,0.678,113,0.856,119,1.052,121,2.07,125,1.431,138,1.036,139,1.474,144,1.495,145,1.545,146,1.187,147,2.131,148,1.304,150,1.429,151,2.312,154,1.003,155,1.431,157,1.09,158,1.181,180,0.732,182,1.187,183,1.435,185,2.07,186,1.59,190,0.862,197,1.09,205,1.904,206,0.534,210,1.275,211,3.683,213,2.07,219,1.623,220,1.275,221,1.768,244,1.409,245,0.933,248,1.299,249,1.125,250,1.545,254,1.431,263,1.003,270,1.003,272,1.003,275,1.179,285,1.275,286,1.379,300,1.379,304,2.368,309,3.534,310,1.299,312,0.926,313,1.187,318,1.003,331,1.187,335,1.22,338,1.88,340,1.59,341,1.792,342,1.431,344,1.187,347,1.792,348,2.131,351,1.495,354,1.09,355,1.59,357,1.684,358,2.872,369,1.59,371,1.003,399,1.379,401,1.275,402,1.826,416,1.299,418,0.856,445,1.786,449,1.792,452,1.187,455,0.926,456,1.59,462,2.621,463,1.409,464,1.979,467,2.131,469,1.187,470,1.805,471,0.926,472,0.856,480,1.59,495,1.431,506,2.298,511,2.113,514,1.495,515,1.379,531,1.979,532,1.299,533,1.792,545,1.299,567,1.59,579,1.09,580,2.07,582,1.59,604,2.298,613,1.299,615,1.299,623,2.562,624,1.299,634,1.623,653,1.187,657,1.792,660,2.341,664,2.312,665,1.09,669,1.431,670,1.299,728,1.09,732,2.07,738,1.187,742,1.792,761,2.368,767,2.368,775,1.431,818,2.855,820,2.07,828,2.07,836,1.299,841,0.926,844,2.496,850,1.59,873,2.301,878,1.935,880,2.368,892,1.59,893,2.07,894,2.368,907,1.59,910,2.669,913,1.59,914,2.368,918,2.07,919,2.07,925,1.935,926,2.821,951,3.19,954,1.792,956,1.792,968,1.431,971,2.07,972,2.368,973,2.669,974,2.872,984,1.935,1042,1.59,1079,2.312,1080,2.669,1092,2.513,1093,2.07,1094,4.081,1095,2.07,1096,2.513,1097,2.513,1098,2.07,1099,2.513,1100,2.07,1101,2.513,1102,3.082,1103,2.513,1104,2.513,1105,2.513,1106,1.792,1107,1.792,1108,2.07,1109,2.513,1110,1.792,1111,2.513,1112,2.07,1113,2.513,1114,2.513,1115,2.513,1116,4.472,1117,3.743,1118,2.513,1119,2.513,1120,2.07,1121,2.513,1122,2.513,1123,2.513,1124,2.07,1125,2.07,1126,2.513,1127,2.513,1128,2.669,1129,2.513,1130,2.07,1131,3.683,1132,2.513,1133,2.07,1134,2.07,1135,3.082,1136,2.07,1137,2.513,1138,2.513,1139,2.513,1140,2.07,1141,2.07,1142,2.513,1143,2.513,1144,2.513,1145,2.07,1146,2.368,1147,3.082,1148,3.743,1149,3.743,1150,2.07,1151,2.513,1152,2.513,1153,2.513,1154,2.513,1155,2.513,1156,2.513,1157,2.513]],["keywords/template:docs/data-layer/serializers/index",[]],["title/module:ember-cli-mirage/ember-data",[1158,4.312]],["text/module:ember-cli-mirage/ember-data",[]],["keywords/module:ember-cli-mirage/ember-data",[136,0.103,353,0.154]],["title/module:ember-cli-mirage/serializers/ember-data-serializer",[1159,4.312]],["text/module:ember-cli-mirage/serializers/ember-data-serializer",[]],["keywords/module:ember-cli-mirage/serializers/ember-data-serializer",[357,0.223]],["title/template:docs/getting-started/installation",[568,2.366]],["text/template:docs/getting-started/installation",[1,0.436,13,0.542,14,0.832,16,1.296,20,0.869,26,0.546,38,1.492,40,0.681,56,1.757,70,1.4,78,2.21,81,1.987,82,3.502,84,2.04,88,1.108,94,1.928,99,2.531,105,0.993,108,1.757,112,1.638,119,1.28,122,3.17,128,1.928,142,1.775,155,3.431,158,1.178,164,1.899,166,2.531,171,2.1,174,3.17,175,2.812,201,3.151,210,1.514,223,2.298,244,1.4,251,4.298,268,1.928,276,3.17,277,1.885,292,2.221,310,2.861,311,3.661,330,2.053,343,2.812,375,3.947,391,2.531,401,1.514,402,1.638,422,3.17,460,2.1,478,2.812,568,4.105,579,1.928,626,3.17,660,2.615,663,3.17,664,2.298,821,2.531,836,2.298,1008,3.661,1160,4.558,1161,4.445,1162,5.534,1163,4.445,1164,4.445,1165,4.445,1166,4.445,1167,6.027,1168,3.661,1169,4.445,1170,4.445,1171,4.445,1172,4.445,1173,4.445,1174,4.445,1175,4.445,1176,6.615,1177,2.812,1178,4.445,1179,3.661,1180,3.502,1181,3.947,1182,4.445,1183,4.445]],["keywords/template:docs/getting-started/installation",[]],["title/template:docs/getting-started/overview",[1184,3.079]],["text/template:docs/getting-started/overview",[1,0.706,2,0.623,4,1.349,6,1.513,11,1.246,13,0.61,14,0.707,15,1.179,19,1.041,20,0.954,23,0.914,24,0.751,26,0.674,29,1.227,32,0.73,33,1.666,34,0.793,38,1.552,40,0.638,42,1.383,43,1.985,44,1.828,47,1.542,48,0.922,50,1.371,51,1.157,52,0.533,53,1.041,55,1.128,57,1.246,58,1.814,59,0.864,67,0.92,68,0.954,69,0.945,73,1.666,75,1.405,79,1.317,84,1.079,87,1.425,88,1.405,89,1.814,91,0.864,96,0.997,101,1.219,102,0.533,105,0.956,106,0.876,108,1.219,111,0.789,112,1.799,116,0.945,117,1.157,119,0.888,124,1.506,125,1.041,128,1.269,129,1.041,132,0.793,138,1.279,139,1.484,142,0.73,143,0.674,144,2.127,145,1.334,147,1.666,148,1.423,150,1.436,151,1.513,156,0.945,157,1.587,158,0.954,160,2.41,165,1.506,171,0.864,172,2.083,173,1.246,178,1.349,180,1.334,183,1.217,190,0.843,192,1.304,194,1.383,195,0.864,197,1.269,204,1.157,205,1.813,206,1.131,207,1.169,209,0.864,210,1.425,216,1.304,219,0.793,220,0.997,222,0.73,224,1.041,226,0.922,237,1.506,238,0.793,244,1.538,245,1.328,249,0.888,250,1.845,252,1.157,255,1.304,262,2.083,263,0.73,268,0.793,270,0.73,272,1.461,274,0.864,275,0.922,277,1.246,284,1.506,286,0.674,294,0.864,305,1.079,308,1.304,312,0.674,314,1.169,318,1.461,321,1.383,322,1.513,328,1.383,331,0.864,334,1.157,335,1.18,338,1.481,343,1.157,344,0.864,350,0.793,351,0.73,355,1.157,358,0.945,363,2.083,369,1.852,371,0.73,394,0.793,395,0.864,398,1.587,400,1.157,401,1.246,403,1.157,408,1.383,413,1.269,414,0.945,418,0.623,436,0.864,445,1.461,446,2.315,447,1.506,448,1.041,451,2.524,452,0.864,453,1.041,454,0.674,455,1.349,459,0.793,460,1.383,462,2.86,463,1.775,464,1.95,465,1.041,466,1.041,467,1.666,470,2.028,471,1.687,472,1.425,474,0.73,483,1.587,484,1.587,485,1.729,494,1.746,497,1.157,500,0.945,506,1.461,511,1.976,514,1.671,515,0.674,517,1.157,519,2.087,520,1.892,521,1.041,522,1.157,523,1.506,527,1.506,531,2.127,537,1.169,539,1.157,544,1.304,545,1.513,546,1.506,547,1.304,548,1.157,549,0.945,550,1.506,553,1.729,554,1.304,556,1.304,567,1.157,578,1.157,583,1.157,588,1.304,604,1.814,615,0.945,617,1.157,621,0.864,623,0.945,624,0.945,633,1.852,634,1.269,641,1.513,642,1.729,653,0.864,654,1.304,655,1.169,665,0.793,670,0.945,676,0.945,685,1.157,696,1.041,704,1.041,705,1.506,706,1.304,723,1.157,724,1.157,726,2.083,728,1.587,730,1.157,733,1.157,734,1.157,741,1.513,751,2.087,758,1.506,765,1.506,770,1.506,786,1.852,817,1.506,818,2.307,830,1.892,836,0.945,841,0.674,844,2.223,847,1.383,861,1.506,863,1.506,865,1.041,872,3.264,873,0.674,874,1.304,875,2.087,907,1.157,910,2.61,914,2.315,925,1.513,926,2.083,929,1.157,933,1.852,955,1.304,957,1.304,961,1.506,963,1.506,967,1.506,972,1.157,974,1.892,984,0.945,995,1.506,1079,0.945,1093,2.41,1094,3.014,1098,1.506,1107,1.304,1108,1.506,1124,2.41,1125,1.506,1131,1.506,1133,1.506,1134,2.41,1136,1.506,1146,1.157,1184,1.506,1185,1.828,1186,1.506,1187,2.41,1188,4.183,1189,1.828,1190,1.828,1191,1.828,1192,1.828,1193,1.304,1194,1.828,1195,1.828,1196,1.506,1197,1.828,1198,1.828,1199,1.828,1200,1.828,1201,1.506,1202,4.576,1203,3.014,1204,1.828,1205,2.41,1206,1.828,1207,1.828,1208,4.576,1209,4.576,1210,2.927,1211,2.927,1212,1.828,1213,1.828,1214,1.304,1215,1.157,1216,0.945,1217,1.041,1218,1.304,1219,1.157,1220,1.304,1221,1.157,1222,2.61,1223,1.828,1224,1.828,1225,1.828,1226,2.087,1227,1.304,1228,1.506,1229,1.828,1230,1.506,1231,1.828,1232,1.828,1233,1.828,1234,2.41,1235,2.927,1236,1.828,1237,1.828,1238,1.828,1239,3.659,1240,2.927,1241,2.927,1242,2.927,1243,2.927,1244,1.828,1245,1.828,1246,1.828,1247,2.41,1248,1.304,1249,1.506,1250,1.506,1251,2.927,1252,1.828,1253,1.828,1254,1.828,1255,1.828,1256,1.828,1257,1.828,1258,2.927,1259,1.506,1260,3.659,1261,1.828,1262,1.506,1263,1.304,1264,1.304,1265,1.157,1266,1.506,1267,1.506,1268,1.828,1269,1.828,1270,1.304,1271,1.506,1272,1.157,1273,1.304,1274,1.828,1275,2.927,1276,1.828,1277,1.828,1278,1.506,1279,2.41,1280,1.828,1281,1.828,1282,1.304,1283,1.828]],["keywords/template:docs/getting-started/overview",[]],["title/template:docs/getting-started/upgrade-guide/index",[52,0.815,316,1.995]],["text/template:docs/getting-started/upgrade-guide/index",[0,0.751,1,0.698,2,1.809,4,1.072,6,1.156,9,1.95,13,0.636,14,0.636,15,1.049,16,1.214,18,1.656,19,0.751,20,1.061,23,0.953,24,0.401,26,0.733,28,1.414,29,1.459,32,1.162,33,0.751,34,0.969,35,1.273,37,0.834,38,1.034,40,0.641,42,2.449,43,1.262,44,0.893,46,1.841,47,1.636,48,1.079,49,2.025,50,1.12,51,0.834,52,1.511,53,2.183,55,0.603,56,0.384,57,1.167,58,0.449,59,0.623,60,1.273,64,1.086,65,1.262,67,0.974,68,0.913,70,0.415,73,0.751,75,1.353,77,0.572,78,1.943,79,1.197,81,0.704,83,0.751,84,1.413,85,1.414,86,0.834,87,0.449,88,1.422,93,1.086,94,0.572,95,0.761,96,1.167,97,0.415,99,0.751,101,1.511,102,0.384,104,1.167,105,0.747,106,0.237,107,0.941,108,0.652,111,0.356,112,2.255,113,1.591,114,1.086,116,1.156,117,1.414,119,1.128,125,1.273,126,0.751,128,1.486,129,0.751,131,1.594,132,0.572,135,0.834,136,2.053,137,0.834,138,1.038,139,1.379,140,0.834,142,0.527,143,0.486,145,1.214,148,0.999,150,1.034,151,2.747,154,1.162,155,1.273,157,1.262,158,0.814,164,1.312,166,2.183,167,0.682,171,1.968,173,1.167,174,0.941,175,1.414,177,1.841,178,0.824,180,1.118,183,1.441,190,1.075,191,1.086,194,0.623,197,0.969,201,1.273,205,1.471,206,0.884,209,0.623,210,1.419,212,1.414,214,1.414,216,0.941,220,1.306,221,1.375,222,0.893,223,1.982,226,1.079,238,0.572,244,1.471,245,0.854,249,0.943,250,1.294,251,0.941,253,0.682,259,1.086,262,2.183,264,0.941,266,0.415,267,1.086,268,0.969,270,0.527,272,1.162,273,1.086,274,0.623,275,0.415,277,1.167,279,1.594,281,1.086,285,0.449,287,1.086,290,0.834,292,1.072,293,1.594,294,1.056,296,1.273,300,1.413,303,1.414,305,2.072,307,0.941,310,1.156,312,1.413,313,1.056,314,1.368,316,4.01,317,1.086,318,1.162,321,1.812,322,1.504,323,1.982,325,1.086,326,1.086,327,3.656,328,1.375,329,1.086,330,0.991,331,1.375,332,0.941,333,0.941,335,0.959,338,1.464,341,2.735,342,1.273,343,3.434,345,1.656,346,1.273,348,0.751,349,0.751,350,1.663,351,0.893,354,0.572,356,1.086,358,1.771,365,1.086,366,0.623,388,2.168,391,0.751,394,0.572,398,0.969,399,1.413,401,0.991,402,1.072,404,0.572,405,2.075,418,1.591,423,1.594,439,1.086,443,0.834,445,1.368,446,0.834,453,1.656,454,1.535,458,0.941,459,1.486,460,1.375,469,0.623,470,1.765,471,0.486,472,0.991,474,1.162,475,0.834,480,1.414,494,1.809,495,0.751,500,1.771,504,1.594,505,0.941,506,0.527,508,1.414,512,0.834,513,0.682,515,1.072,517,0.834,520,1.982,521,1.273,524,1.594,531,1.162,537,0.527,544,1.594,545,0.682,548,1.414,549,0.682,553,0.623,554,1.594,558,0.834,559,4.47,567,0.834,568,2.955,569,2.822,570,2.735,579,0.572,583,0.834,588,0.941,594,1.841,604,1.925,620,0.751,621,2.206,623,0.682,624,1.156,626,1.594,633,1.414,634,0.572,636,1.594,641,1.156,642,0.623,647,2.822,653,1.056,654,0.941,655,1.773,658,0.751,660,0.623,663,1.594,669,1.273,670,0.682,673,0.751,676,1.156,685,0.834,687,1.594,693,0.834,704,0.751,706,0.941,713,0.941,724,0.834,730,2.809,741,1.156,742,0.941,745,0.941,746,1.841,748,0.834,763,1.086,767,0.834,769,0.941,775,0.751,782,1.841,785,1.771,787,0.941,789,2.396,790,2.396,814,2.822,815,2.444,818,1.812,830,2.679,836,0.682,839,0.941,841,0.824,842,1.414,844,1.663,847,1.056,851,1.841,853,0.834,854,1.086,857,1.841,858,1.414,865,1.656,872,0.941,873,0.486,875,0.941,876,1.414,881,0.834,895,1.841,903,0.941,907,0.834,913,0.834,920,1.086,925,0.682,926,2.527,933,1.841,946,1.594,951,1.594,954,1.594,965,0.941,968,0.751,972,1.414,973,0.941,974,2.414,982,1.086,984,1.156,1002,1.086,1006,1.95,1010,0.941,1020,3.656,1035,1.414,1042,1.414,1051,1.086,1058,0.941,1080,1.594,1082,1.086,1083,1.086,1087,1.841,1089,1.086,1102,1.086,1107,2.075,1110,1.594,1130,1.841,1135,3.846,1140,1.086,1141,1.086,1160,1.841,1177,1.841,1180,0.834,1187,1.086,1201,1.841,1203,1.841,1205,1.841,1216,1.771,1217,0.751,1248,0.941,1259,1.086,1265,1.414,1273,0.941,1284,4.166,1285,2.909,1286,2.235,1287,2.909,1288,2.235,1289,4.439,1290,1.086,1291,3.834,1292,1.086,1293,1.319,1294,3.834,1295,1.319,1296,2.396,1297,1.319,1298,1.319,1299,3.834,1300,1.319,1301,1.319,1302,1.319,1303,1.319,1304,2.235,1305,3.158,1306,0.941,1307,1.319,1308,2.235,1309,3.426,1310,1.319,1311,1.319,1312,1.086,1313,2.235,1314,1.319,1315,1.319,1316,1.319,1317,1.319,1318,2.235,1319,1.319,1320,1.319,1321,1.319,1322,1.086,1323,1.319,1324,2.909,1325,3.426,1326,1.319,1327,1.319,1328,2.909,1329,2.909,1330,2.235,1331,3.834,1332,1.319,1333,2.235,1334,3.426,1335,3.426,1336,1.319,1337,1.319,1338,1.319,1339,1.319,1340,1.319,1341,2.235,1342,1.319,1343,2.235,1344,1.319,1345,1.319,1346,1.086,1347,1.319,1348,1.319,1349,4.166,1350,1.319,1351,2.235,1352,1.319,1353,1.594,1354,1.086,1355,3.426,1356,2.235,1357,1.319,1358,1.319,1359,1.319,1360,1.319,1361,1.319,1362,1.319,1363,1.319,1364,1.319,1365,2.235,1366,2.909,1367,2.235,1368,1.319,1369,1.319,1370,1.319,1371,1.319,1372,1.319,1373,1.319,1374,2.235,1375,2.235,1376,2.235,1377,1.319,1378,1.319,1379,1.841,1380,1.319,1381,1.319,1382,1.086,1383,1.319,1384,1.086,1385,1.319,1386,1.086,1387,2.909,1388,2.909,1389,3.426,1390,1.319,1391,4.866,1392,0.941,1393,1.086,1394,1.319,1395,1.319,1396,2.235,1397,1.319,1398,2.235,1399,1.319,1400,1.319,1401,2.235,1402,1.319,1403,1.319,1404,1.319,1405,2.396,1406,1.319,1407,1.319,1408,1.319,1409,1.319,1410,2.235,1411,1.086,1412,1.319,1413,1.319,1414,2.909,1415,1.319,1416,1.319,1417,1.319,1418,3.426,1419,2.235,1420,1.319,1421,1.319,1422,1.319,1423,1.319,1424,1.319,1425,1.319,1426,1.319,1427,1.319,1428,1.086,1429,1.319,1430,1.086,1431,1.319,1432,1.319,1433,1.319,1434,1.319,1435,1.319,1436,1.319,1437,1.319,1438,1.319,1439,3.834,1440,1.319,1441,1.319,1442,1.319,1443,1.319,1444,1.319,1445,1.319,1446,1.319,1447,2.235,1448,2.235,1449,1.319,1450,1.319,1451,1.319,1452,1.319,1453,1.319,1454,2.235,1455,1.319,1456,1.319,1457,1.319,1458,1.319,1459,1.319,1460,1.319,1461,1.319,1462,2.235,1463,1.319,1464,0.941,1465,1.319,1466,1.319,1467,1.319,1468,1.319,1469,1.319,1470,1.319,1471,1.319,1472,1.319,1473,3.426,1474,1.319,1475,1.086,1476,1.086,1477,1.319,1478,1.319,1479,1.086,1480,1.319,1481,2.235,1482,2.235,1483,1.319,1484,1.086,1485,1.319,1486,1.319,1487,1.319,1488,1.319,1489,1.319,1490,1.319,1491,1.841,1492,2.235,1493,1.319,1494,1.319,1495,1.319,1496,1.319,1497,1.319,1498,1.319,1499,1.319,1500,1.319]],["keywords/template:docs/getting-started/upgrade-guide/index",[]],["title/template:docs/getting-started/upgrade-guide/v2-deprecations",[78,0.743,314,0.743,1353,1.326,1501,1.531]],["text/template:docs/getting-started/upgrade-guide/v2-deprecations",[26,0.68,67,0.994,68,1.082,78,2.212,138,1.082,244,1.745,314,2.212,319,4.562,1353,3.951,1501,4.562]],["keywords/template:docs/getting-started/upgrade-guide/v2-deprecations",[]],["title/template:docs/getting-started/what-is-mirage",[40,0.366]],["text/template:docs/getting-started/what-is-mirage",[13,0.604,14,0.799,15,1.105,20,0.814,23,0.624,33,3.025,34,1.807,38,1.578,40,0.672,41,2.636,48,1.313,50,1.223,55,1.124,56,1.215,68,0.814,70,1.674,79,1.716,81,1.313,89,1.807,92,2.372,102,1.549,103,2.372,104,1.419,105,1.167,106,0.953,108,1.897,113,1.419,118,2.154,119,1.242,138,0.814,142,1.664,143,2.398,144,1.664,158,1.244,183,1.039,190,1.223,195,3.007,207,1.664,226,1.313,248,2.154,249,0.885,262,3.331,268,1.807,285,1.419,286,1.536,303,2.636,323,2.154,335,0.959,338,1.124,363,3.025,375,2.972,395,1.969,402,1.536,404,1.807,409,2.372,414,2.154,448,2.372,449,2.972,451,2.747,452,1.969,478,2.636,494,1.993,505,2.972,506,2.46,508,2.636,553,2.51,570,4.394,641,3.024,653,1.969,673,2.372,676,3.185,696,3.025,748,2.636,759,2.372,766,2.972,773,3.432,818,1.969,841,1.536,892,2.636,911,3.432,956,2.972,960,2.972,984,2.154,985,3.432,1106,2.972,1110,2.972,1181,2.972,1193,2.972,1270,3.79,1282,2.972,1306,2.972,1386,3.432,1392,2.972,1405,3.432,1502,4.818,1503,4.167,1504,5.85,1505,4.167,1506,4.167,1507,4.167,1508,4.167,1509,4.167,1510,3.432,1511,5.313,1512,5.313,1513,4.167,1514,3.432,1515,4.167,1516,4.167,1517,4.167,1518,4.167,1519,4.167]],["keywords/template:docs/getting-started/what-is-mirage",[]],["title/template:docs/route-handlers/functions",[68,0.731]],["text/template:docs/route-handlers/functions",[1,0.708,2,1.834,4,1.296,11,1.197,13,0.633,14,0.687,15,1.06,16,1.24,20,0.831,23,0.526,24,1.004,26,0.661,29,0.532,34,1.525,35,2.706,38,1.783,40,0.417,41,1.463,43,1.003,44,2.041,49,1.525,53,2.001,55,0.948,56,0.674,57,1.964,58,1.741,59,1.092,65,1.003,67,0.631,68,1.27,75,1.185,77,1.003,79,0.948,81,0.728,87,0.788,88,0.576,92,2.422,95,1.197,96,1.619,97,1.34,105,0.415,106,0.966,108,0.674,111,0.948,112,0.852,117,1.463,119,1.143,132,1.525,138,1.278,139,1.64,143,0.852,144,2.235,145,0.674,146,1.092,148,0.674,150,0.624,151,1.195,155,1.316,157,2.061,158,1.127,164,0.728,172,2.422,178,0.852,180,1.631,183,0.876,190,0.979,205,1.34,206,0.746,207,0.923,209,1.092,214,1.463,219,1.003,220,1.906,223,1.195,225,1.649,238,1.003,244,0.728,245,0.576,249,0.746,250,1.85,263,0.923,266,1.108,268,2.061,269,2.224,270,1.898,275,1.108,277,1.197,285,1.964,286,1.296,290,1.463,292,0.852,294,1.092,300,0.852,304,1.463,305,1.751,318,1.699,330,1.619,331,1.092,332,1.649,334,1.463,335,0.979,337,2.895,338,1.452,339,1.904,344,1.661,351,0.923,354,2.061,358,1.195,363,1.316,367,3.914,371,2.041,388,2.691,399,1.296,402,0.852,404,1.845,416,1.195,418,0.788,443,3.234,445,1.898,451,2.643,452,1.092,453,1.316,455,0.852,457,0.923,462,1.845,463,1.108,464,1.699,465,2.422,466,2.422,467,3.186,470,1.741,471,0.852,472,0.788,478,1.463,497,2.224,500,1.195,515,1.568,517,1.463,531,1.404,532,2.199,537,0.923,540,1.904,553,1.092,557,1.463,558,1.463,578,2.224,582,1.463,610,1.649,613,1.195,620,1.316,621,2.01,699,1.904,702,2.001,722,3.914,723,1.463,731,1.649,738,1.092,740,1.649,815,1.649,836,1.195,844,1.525,847,1.092,865,1.316,867,1.649,873,1.984,874,1.649,878,1.818,880,2.691,881,1.463,894,2.691,909,1.463,913,1.463,926,1.316,929,1.463,947,1.904,955,1.649,958,2.507,960,1.649,965,1.649,968,1.316,969,2.507,970,1.904,1010,1.649,1035,2.224,1058,1.649,1095,1.904,1120,1.904,1128,3.034,1145,2.895,1146,2.691,1147,2.895,1177,1.463,1180,2.224,1234,1.904,1262,1.904,1263,3.389,1264,2.507,1265,1.463,1266,1.904,1267,1.904,1272,1.463,1278,1.904,1279,1.904,1292,2.895,1305,1.904,1312,1.904,1322,2.895,1354,4.21,1475,1.904,1476,1.904,1484,1.904,1491,1.904,1520,3.515,1521,2.895,1522,2.895,1523,2.312,1524,2.312,1525,4.752,1526,2.312,1527,2.312,1528,2.312,1529,2.312,1530,3.034,1531,3.515,1532,1.904,1533,1.904,1534,2.312,1535,2.312,1536,2.312,1537,2.312,1538,2.312,1539,4.752,1540,4.253,1541,2.312,1542,2.312,1543,2.312,1544,2.312,1545,2.312,1546,2.312,1547,2.312,1548,3.515,1549,2.312,1550,2.312,1551,3.515,1552,2.312,1553,2.312,1554,3.515,1555,2.312,1556,2.312,1557,2.312,1558,2.312,1559,2.312,1560,2.312,1561,1.904,1562,2.312,1563,2.312,1564,2.312,1565,1.904,1566,2.312,1567,2.312,1568,2.312,1569,2.312,1570,2.312,1571,2.312,1572,2.895,1573,2.895,1574,2.895,1575,3.515,1576,1.904,1577,2.312,1578,2.312,1579,2.312,1580,2.312,1581,2.312,1582,2.312,1583,3.515,1584,2.895,1585,2.312,1586,2.312,1587,2.312,1588,2.312,1589,2.312,1590,2.312,1591,2.312,1592,2.312,1593,2.312]],["keywords/template:docs/route-handlers/functions",[]],["title/template:docs/route-handlers/shorthands",[43,1.622]],["text/template:docs/route-handlers/shorthands",[1,0.706,2,1.782,11,0.958,13,0.567,14,0.499,15,0.996,18,3.159,20,0.795,23,0.866,24,0.857,26,0.345,35,3.395,38,1.725,40,0.513,42,2.885,43,3.023,49,2.406,50,0.936,65,1.22,68,0.795,75,1.304,89,1.22,91,1.329,95,2.119,102,0.82,104,1.385,105,0.505,111,0.759,119,1.178,138,1.13,139,1.551,143,1.037,145,1.392,146,1.329,148,1.392,154,1.907,157,1.22,158,0.795,167,1.455,173,0.958,179,1.78,180,1.618,182,1.329,183,0.701,190,0.648,205,1.879,206,0.863,221,2.256,224,2.315,245,1.383,249,1.321,250,1.618,252,2.573,266,0.886,268,1.764,285,1.626,290,1.78,291,2.9,292,1.499,294,1.329,302,2.007,305,1.037,330,2.119,335,0.648,338,1.097,354,2.071,388,3.511,395,1.329,399,1.037,411,2.573,414,1.455,445,1.624,455,1.037,456,1.78,457,1.124,459,1.764,462,1.764,467,2.315,474,1.124,479,2.9,493,1.78,524,3.958,531,1.124,532,3.157,552,3.349,553,1.329,578,1.78,582,1.78,604,1.22,605,1.78,624,1.455,655,1.907,669,3.159,676,1.455,693,1.78,698,2.317,702,1.602,704,1.602,711,5.028,724,3.021,749,2.317,764,2.317,787,2.007,818,1.921,821,1.602,844,2.698,873,1.499,876,3.659,878,1.455,880,2.573,881,2.573,903,2.9,914,1.78,925,1.455,929,1.78,933,1.78,946,2.9,957,2.007,958,2.007,968,2.315,969,3.731,974,2.469,984,2.102,1006,1.602,1079,2.469,1112,3.933,1128,3.958,1146,1.78,1263,2.007,1264,2.007,1265,2.573,1273,2.007,1282,2.007,1379,4.308,1393,3.933,1502,2.317,1510,2.317,1521,2.317,1522,3.349,1572,2.317,1573,2.317,1574,3.349,1576,2.317,1584,5.202,1594,2.813,1595,2.813,1596,2.813,1597,5.963,1598,2.813,1599,2.813,1600,4.066,1601,2.813,1602,4.066,1603,5.783,1604,2.813,1605,4.066,1606,5.231,1607,2.813,1608,4.066,1609,6.105,1610,2.813,1611,2.813,1612,2.813,1613,2.813,1614,4.775,1615,2.813,1616,2.813,1617,2.813,1618,2.813,1619,2.813,1620,2.813,1621,2.813,1622,2.813,1623,2.813,1624,2.813,1625,2.813,1626,4.066,1627,2.813,1628,2.813]],["keywords/template:docs/route-handlers/shorthands",[]],["title/template:docs/testing/acceptance-tests",[106,0.502,413,1.213]],["text/template:docs/testing/acceptance-tests",[1,0.695,2,0.931,4,1.902,6,2.96,13,0.593,14,0.673,15,0.49,16,0.796,17,1.556,20,0.534,22,2.25,23,0.409,24,0.843,26,0.576,29,1.395,40,0.593,41,1.729,42,1.291,44,1.091,48,0.861,50,1.081,52,0.796,53,1.556,55,0.737,57,1.356,58,0.931,60,2.266,63,1.949,67,0.714,68,0.534,69,2.058,70,0.861,79,1.266,81,1.254,82,1.729,84,1.007,85,2.519,87,1.356,88,0.681,89,1.185,91,1.291,94,1.185,97,1.48,101,1.369,105,1.108,106,1.273,108,1.369,112,1.731,113,0.931,118,1.413,119,0.845,132,1.185,138,1.072,141,2.438,145,1.723,150,0.737,152,2.519,154,1.091,156,2.96,157,1.726,158,0.918,164,1.254,173,0.931,176,1.729,178,1.007,186,1.729,190,1.081,194,1.291,203,2.25,206,0.845,210,0.931,222,1.091,225,1.949,226,1.626,244,0.861,245,0.992,247,2.25,248,1.413,249,0.845,250,1.504,253,2.668,260,2.839,263,1.091,266,1.254,272,1.59,274,1.291,275,1.48,277,0.931,296,2.266,300,1.007,312,1.467,330,2.013,331,2.438,344,1.291,346,1.556,349,1.556,351,1.875,371,1.59,394,1.185,395,2.591,397,3.868,398,1.185,399,1.007,400,1.729,401,0.931,403,1.729,404,1.185,408,1.291,413,2.037,416,2.428,422,1.949,423,1.949,436,1.291,453,1.556,457,1.091,460,1.881,462,2.788,463,1.804,464,1.875,469,2.438,472,0.931,474,1.091,475,2.519,477,2.674,482,3.123,483,2.563,484,2.627,485,2.965,493,1.729,494,1.868,500,1.413,511,1.291,513,2.058,514,1.59,515,1.007,522,1.729,529,2.25,531,1.091,547,1.949,548,1.729,556,1.949,579,1.185,583,1.729,617,3.908,620,2.266,623,1.413,624,1.413,629,1.729,638,1.949,641,1.413,653,1.291,655,1.091,658,1.556,665,1.185,670,2.058,674,3.279,702,2.674,726,2.674,728,1.185,730,2.519,731,3.68,733,2.519,734,2.972,735,3.35,736,3.868,738,1.291,739,2.25,740,1.949,745,1.949,766,1.949,768,2.25,775,1.556,781,1.949,785,2.058,786,1.729,821,2.266,823,2.25,830,2.058,837,2.25,841,1.007,847,1.291,892,1.729,953,3.279,980,1.949,1100,2.25,1106,1.949,1214,1.949,1215,1.729,1216,2.058,1217,1.556,1218,1.949,1219,1.729,1220,1.949,1221,1.729,1222,1.949,1226,3.68,1227,1.949,1228,2.25,1250,2.25,1270,1.949,1272,3.265,1290,2.25,1411,2.25,1479,2.25,1530,1.949,1565,2.25,1629,3.981,1630,2.732,1631,2.25,1632,2.732,1633,2.732,1634,2.732,1635,3.981,1636,2.732,1637,2.732,1638,2.25,1639,3.981,1640,2.732,1641,2.732,1642,4.696,1643,2.732,1644,4.696,1645,2.732,1646,2.732,1647,2.732,1648,2.25,1649,2.732,1650,2.732,1651,2.732,1652,2.732,1653,2.732,1654,2.732,1655,3.279,1656,3.981,1657,2.25,1658,2.732,1659,1.949,1660,3.981,1661,1.949,1662,2.732,1663,2.732,1664,2.732,1665,2.732,1666,2.732,1667,2.732,1668,3.981,1669,3.981,1670,3.981,1671,2.732,1672,2.732,1673,2.519]],["keywords/template:docs/testing/acceptance-tests",[]],["title/template:docs/testing/assertions",[141,1.767]],["text/template:docs/testing/assertions",[1,0.695,2,1.566,13,0.515,14,0.727,15,1.162,16,1.34,17,1.907,23,0.846,24,0.601,26,0.411,32,1.338,38,1.721,40,0.6,47,1.235,50,1.364,51,2.12,52,0.976,55,1.524,56,0.976,59,1.583,75,0.835,79,1.24,83,1.907,88,0.835,92,2.618,94,1.994,95,1.566,97,1.055,98,2.759,100,2.759,103,2.618,104,1.141,105,0.825,106,1.063,108,0.976,112,1.235,113,1.141,119,0.711,122,2.389,123,3.787,127,2.759,128,1.994,129,1.907,130,2.389,131,3.28,132,1.994,133,2.389,138,1.026,141,3.26,142,2.713,143,2.083,144,2.097,145,1.34,148,0.976,150,1.65,152,3.576,154,1.338,156,2.715,158,1.196,164,1.055,183,0.835,206,0.711,209,2.173,210,1.141,214,2.12,219,1.453,220,1.141,226,1.449,250,1.34,252,2.12,254,1.907,263,2.257,265,2.759,277,1.141,313,1.583,335,0.771,349,1.907,366,1.583,409,1.907,414,1.732,416,1.732,427,2.759,428,2.759,452,1.583,454,1.235,463,1.449,470,1.141,472,1.141,477,3.218,479,4.031,480,3.748,482,1.907,483,2.277,484,2.277,485,3.06,495,1.907,498,5.161,506,2.097,511,1.583,513,1.732,515,1.695,526,2.12,530,2.759,535,3.28,536,3.745,537,1.836,539,2.12,549,1.732,557,2.91,563,2.759,579,1.453,640,2.389,642,1.583,655,2.097,660,2.67,664,1.732,670,1.732,673,1.907,735,3.28,738,1.583,741,1.732,751,2.389,775,1.907,778,2.759,786,2.12,841,1.235,853,2.12,873,1.235,878,1.732,894,2.12,921,2.759,974,1.732,1006,1.907,1022,2.759,1079,1.732,1168,2.759,1177,2.12,1186,2.759,1222,3.28,1226,3.28,1247,2.759,1271,2.759,1306,2.389,1464,2.389,1638,2.759,1648,2.759,1659,2.389,1661,3.28,1674,3.35,1675,3.35,1676,5.251,1677,3.35,1678,3.35,1679,5.652,1680,3.35,1681,3.35,1682,3.35,1683,3.35,1684,5.251,1685,3.35,1686,3.35,1687,3.35,1688,3.35,1689,3.35,1690,3.35,1691,3.35,1692,3.35,1693,3.35,1694,3.35,1695,3.35,1696,3.35,1697,3.35,1698,3.35,1699,3.35,1700,3.35,1701,3.35,1702,3.35,1703,3.35,1704,2.759]],["keywords/template:docs/testing/assertions",[]],["title/template:docs/testing/integration-and-unit-tests",[106,0.401,785,1.155,1673,1.413]],["text/template:docs/testing/integration-and-unit-tests",[1,0.708,4,1.381,13,0.626,14,0.792,15,0.997,18,2.549,20,0.492,23,0.974,24,0.452,26,0.309,29,1.526,34,1.092,38,0.679,40,0.642,42,1.189,44,1.005,47,0.928,50,0.863,55,1.43,56,0.734,58,1.806,67,0.452,68,0.732,69,1.301,79,1.207,81,1.41,84,0.928,85,2.371,88,1.116,95,1.276,97,0.793,101,0.734,102,0.734,104,1.276,105,0.951,106,1.147,111,1.01,113,1.276,119,0.951,138,0.875,141,2.505,142,1.496,143,0.928,150,1.337,158,0.732,173,1.276,180,0.734,182,1.189,190,0.58,194,1.189,195,1.77,197,1.092,206,1.18,207,2.118,221,1.189,222,1.005,226,0.793,238,1.092,245,1.236,249,0.951,250,0.734,253,2.564,254,1.433,266,0.793,272,1.005,274,2.343,277,0.857,285,1.525,300,1.381,302,1.795,310,1.301,312,1.828,328,1.77,335,0.58,338,1.01,345,1.433,391,1.433,398,1.092,404,1.092,405,1.795,406,2.073,413,1.941,448,3.442,457,1.005,459,1.092,463,1.967,464,1.496,469,1.189,470,0.857,471,0.928,474,1.005,477,2.133,483,2.411,484,2.411,485,3.094,494,1.276,499,3.537,503,2.073,506,1.005,511,1.77,514,1.496,515,0.928,521,1.433,532,1.301,537,1.496,539,1.592,549,1.301,585,1.795,605,3.138,629,1.592,634,1.092,639,1.795,728,1.941,733,1.592,759,1.433,781,1.795,785,1.937,841,0.928,842,1.592,843,1.433,847,2.115,867,1.795,870,5.143,871,2.073,873,1.65,887,2.073,909,1.592,941,2.073,1035,1.592,1150,2.073,1179,2.073,1215,3.138,1216,2.874,1217,2.824,1219,3.517,1221,3.517,1227,1.795,1248,1.795,1249,2.073,1272,3.138,1296,3.687,1346,2.073,1382,2.073,1392,1.795,1428,3.086,1430,2.073,1464,1.795,1514,2.073,1530,1.795,1561,2.073,1655,2.073,1657,2.073,1659,3.537,1661,3.537,1673,2.371,1705,2.517,1706,4.959,1707,4.959,1708,5.559,1709,5.758,1710,5.559,1711,5.559,1712,5.758,1713,3.747,1714,3.747,1715,2.517,1716,3.747,1717,2.517,1718,2.517,1719,2.517,1720,2.517,1721,2.517,1722,6.154,1723,5.758,1724,2.517,1725,2.517,1726,4.959,1727,4.959,1728,4.959,1729,2.517,1730,2.517,1731,3.747,1732,4.477,1733,2.517,1734,3.747,1735,3.747,1736,4.477,1737,3.747,1738,3.747,1739,2.517,1740,3.747,1741,3.747,1742,2.517,1743,2.517,1744,3.747,1745,2.517,1746,2.517,1747,2.517,1748,2.517,1749,2.517,1750,2.517,1751,2.517,1752,2.517,1753,2.517,1754,3.747,1755,4.477,1756,2.517,1757,2.517,1758,2.517,1759,4.477,1760,2.517,1761,2.517]],["keywords/template:docs/testing/integration-and-unit-tests",[]],["title/template:docs/testing/setup-mirage",[106,0.401,285,0.761,1216,1.155]],["text/template:docs/testing/setup-mirage",[1,0.708,13,0.519,23,0.621,26,0.509,29,1.578,40,0.603,68,1.036,71,2.626,75,1.035,77,1.8,78,1.657,95,1.414,96,1.414,101,1.21,105,1.048,106,1.251,111,1.119,116,2.74,134,2.96,135,2.626,136,3.176,137,2.626,138,0.811,139,1.321,140,2.626,158,0.811,171,1.961,190,1.344,219,1.8,244,1.307,245,1.035,246,5.067,249,1.125,253,2.146,266,1.307,275,1.307,285,1.805,306,3.418,333,2.96,334,2.626,335,0.956,366,2.504,401,1.414,413,1.8,443,2.626,464,1.657,465,2.363,466,2.363,483,2.532,484,2.532,515,2.152,532,2.146,623,2.146,704,2.363,734,3.695,785,2.146,841,1.529,1181,2.96,1214,4.165,1215,3.695,1216,3.286,1217,3.324,1218,4.165,1219,3.695,1220,4.165,1221,3.695,1384,3.418,1532,3.418,1533,3.418,1631,4.809,1673,2.626,1762,4.15,1763,4.15,1764,4.15,1765,4.15]],["keywords/template:docs/testing/setup-mirage",[]],["title/template:index",[102,1.09]],["text/template:index",[1,0.515,13,0.515,48,1.657,57,1.792,58,1.792,68,1.028,77,2.281,81,1.657,102,1.533,106,1.099,108,1.533,118,2.719,120,4.332,143,1.938,158,1.197,167,2.719,226,1.657,249,1.117,335,1.211,391,2.995,413,2.281,494,1.792,512,3.328,723,3.328,741,2.719,761,3.328,767,3.328,829,4.332,1042,3.328,1079,2.719,1193,3.752,1196,4.332,1230,4.332,1766,5.26,1767,5.26,1768,5.26,1769,5.26,1770,5.26]],["keywords/template:index",[]],["title/template:not-found",[1771,3.079]],["text/template:not-found",[272,2.228,665,2.419,1180,3.53,1704,4.595,1771,4.595,1772,5.579]],["keywords/template:not-found",[]],["title/template:templates/application",[]],["text/template:templates/application",[0,3.205]],["keywords/template:templates/application",[]],["title/template:templates/blog",[]],["text/template:templates/blog",[]],["keywords/template:templates/blog",[]],["title/template:templates/blog/detail",[]],["text/template:templates/blog/detail",[1,0.544,2,1.89,3,4.505,4,2.045,5,5.549,6,2.869,7,5.549,8,5.549]],["keywords/template:templates/blog/detail",[]],["title/template:templates/blog/error",[9,1.592,10,2.303]],["text/template:templates/blog/error",[9,3.199,10,4.628]],["keywords/template:templates/blog/error",[]],["title/template:templates/blog/index",[0,2.129]],["text/template:templates/blog/index",[0,3.205]],["keywords/template:templates/blog/index",[]],["title/template:templates/docs",[]],["text/template:templates/docs",[]],["keywords/template:templates/docs",[]],["title/template:templates/docs/advanced/customizing-the-inflector",[11,0.953,12,2.303]],["text/template:templates/docs/advanced/customizing-the-inflector",[1,0.683,11,2.045,12,5.575,13,0.634,14,0.676,15,0.988,16,1.285,17,2.509,18,2.509,19,2.509,20,0.861,21,6.288,22,5.437,23,0.824,24,1.077,25,5.575,26,0.676,27,4.407,28,3.979,29,1.268,30,5.505,31,4.407,32,1.76,33,2.509,34,2.387,35,2.509,36,5.505,37,3.483,38,1.619,39,5.505,40,0.588,41,2.789,42,2.601,43,1.911,44,2.198,45,5.505,46,3.63,47,1.624,48,1.389,49,1.911,50,1.015,51,2.789,52,1.285,53,2.509,54,3.144,55,1.189,56,1.605,57,1.501,58,1.501,59,2.082,60,2.509,61,4.407,62,4.407,63,3.926,64,3.63,65,1.911,66,4.407,67,0.988,68,0.861,69,3.104,70,1.389,71,2.789,72,4.407,73,2.509,74,4.407,75,1.099,76,4.407,77,2.604,78,2.198,79,1.189,80,2.789,81,1.389,82,2.789,83,2.509,84,1.624,85,2.789,86,2.789,87,1.501,88,1.099,89,1.911,90,3.926,91,2.082,92,2.509,93,3.63]],["keywords/template:templates/docs/advanced/customizing-the-inflector",[]],["title/template:templates/docs/advanced/environment-options",[94,1.213,95,0.953]],["text/template:templates/docs/advanced/environment-options",[1,0.702,4,1.822,13,0.543,14,0.775,15,0.995,23,0.92,24,0.995,26,0.827,33,2.815,35,2.123,38,1.333,40,0.619,44,1.489,56,1.087,67,0.669,73,2.123,77,1.617,81,1.558,83,2.815,92,2.123,94,2.837,95,2.011,96,2.093,97,1.558,98,5.201,99,2.123,100,5.201,101,1.617,102,1.617,103,3.668,104,2.228,105,1.102,106,1.059,107,3.526,108,1.791,109,3.729,110,3.729,111,1.006,112,1.374,113,1.27,114,5.201,115,3.071,116,2.556,117,2.36,118,1.928,119,0.792,120,3.071,121,3.071,122,3.955,123,4.567,124,3.071,125,2.123,126,2.815,127,3.071,128,2.144,129,2.123,130,2.66,131,3.526,132,2.144,133,2.66,134,2.66,135,2.36,136,3.324,137,2.36,138,1.084,139,0.93,140,2.36,141,2.336,142,1.974,143,1.374,144,1.974,145,1.087,146,1.762,147,2.123,148,1.087,149,4.944,150,1.495,151,1.928,152,3.509,153,3.729,154,1.489,155,2.123,156,1.928,157,1.617,158,0.729,159,3.729,160,3.071,161,3.729,162,3.729,163,3.729,164,1.558,165,3.071,166,2.123,167,1.928,168,3.729,169,3.729,170,3.729,171,2.79,172,2.123,173,1.684,174,2.66,175,2.36,176,2.36,177,4.072,178,1.374,179,2.36,180,1.087,181,3.071,182,1.762,183,1.233,184,4.944,185,3.071,186,2.36,187,3.729,188,3.729,189,3.729,190,0.859,191,3.071,192,2.66,193,3.729,194,1.762]],["keywords/template:templates/docs/advanced/environment-options",[]],["title/template:templates/docs/advanced/mocking-guids",[52,0.815,195,1.321]],["text/template:templates/docs/advanced/mocking-guids",[1,0.698,11,1.902,13,0.659,14,0.553,23,0.675,24,0.809,26,0.553,29,1.038,40,0.442,50,1.46,52,1.768,59,2.13,67,0.809,69,2.331,70,1.421,96,1.902,97,1.421,139,1.512,150,1.216,195,2.638,196,6.339,197,1.955,198,3.714,199,4.509,200,5.467,201,2.567,202,3.216,203,3.714,204,2.853,205,1.911,206,1.383,207,2.23,208,4.509,209,2.638,210,2.066,211,3.714,212,4.123,213,3.714,214,2.853,215,6.066,216,3.216,217,4.509,218,4.509,219,2.422,220,1.536,221,2.638,222,1.801,223,2.331,224,2.567,225,4.521,226,1.421,227,4.509,228,6.066,229,4.509,230,4.509,231,4.509,232,5.584,233,3.714,234,4.509,235,4.509,236,3.714,237,4.599,238,2.422,239,4.509,240,4.509,241,4.509,242,4.509,243,4.509]],["keywords/template:templates/docs/advanced/mocking-guids",[]],["title/template:templates/docs/advanced/server-configuration",[56,0.815,105,0.502]],["text/template:templates/docs/advanced/server-configuration",[1,0.7,11,1.041,13,0.582,14,0.789,15,1.119,20,0.977,23,1.009,24,1.028,26,0.789,29,1.481,40,0.68,44,1.22,48,0.963,55,0.824,56,1.457,57,1.041,67,1.096,68,1.271,70,1.575,75,1.246,78,2.492,79,0.824,88,1.075,91,1.444,101,1.257,103,1.739,105,1.138,106,0.548,108,0.891,111,1.163,112,1.126,113,1.041,116,3.159,125,1.739,128,1.325,134,3.566,135,3.163,136,3.662,137,3.163,138,1.271,139,1.246,140,3.163,148,0.891,158,0.597,164,0.963,166,1.739,167,2.23,171,2.362,172,2.846,173,1.469,178,1.126,179,2.729,180,1.257,181,2.516,182,1.444,183,0.762,190,0.703,194,1.444,206,0.916,220,1.469,223,1.58,244,2.026,245,1.621,246,2.516,247,2.516,248,1.58,249,1.216,250,1.257,251,3.076,252,1.933,253,2.585,254,1.739,255,3.076,256,3.055,257,3.055,258,3.055,259,3.552,260,2.179,261,3.055,262,2.846,263,1.22,264,3.076,265,2.516,266,1.359,267,2.516,268,1.325,269,1.933,270,1.722,271,3.055,272,1.22,273,3.552,274,1.444,275,0.963,276,2.179,277,1.041,278,3.055,279,2.179,280,3.055,281,2.516,282,3.055,283,3.055,284,2.516,285,1.041,286,1.126,287,2.516,288,3.055,289,3.055,290,1.933,291,2.179,292,1.59,293,2.179,294,1.444,295,3.055,296,1.739,297,2.516,298,3.055,299,3.055,300,1.59,301,3.055,302,2.179,303,1.933,304,1.933,305,1.126,306,3.552,307,2.179,308,2.179,309,2.179,310,1.58,311,2.516,312,1.842,313,1.444,314,1.22,315,2.516,316,2.179,317,2.516,318,1.22,319,3.552,320,3.055,321,1.444,322,1.58,323,1.58,324,2.516,325,2.516,326,2.516,327,2.516,328,1.444,329,2.516,330,1.041,331,1.444,332,2.179,333,3.566,334,3.163,335,1.151,336,4.999,337,2.516,338,1.797,339,3.552,340,1.933,341,2.179,342,1.739,343,1.933,344,1.444,345,1.739,346,2.846,347,3.566,348,2.456,349,1.739,350,1.325,351,1.22,352,3.055,353,3.878,354,1.325,355,3.163,356,2.516,357,2.891,358,1.58,359,2.516,360,3.055,361,3.055,362,3.055]],["keywords/template:templates/docs/advanced/server-configuration",[]],["title/template:templates/docs/advanced/simulating-cookie-responses",[144,0.892,363,1.272,364,1.84]],["text/template:templates/docs/advanced/simulating-cookie-responses",[1,0.683,13,0.488,14,0.612,37,3.153,40,0.581,68,0.974,88,1.479,96,2.234,97,1.57,138,0.974,139,1.242,144,2.53,180,1.453,190,1.147,206,1.26,222,1.99,250,1.453,269,3.153,276,3.554,363,3.378,364,5.402,365,4.104,366,2.354,367,5.218,368,4.983,369,3.153,370,4.983,371,2.369,372,4.983,373,4.983,374,4.983,375,3.554,376,4.983,377,4.983,378,4.983,379,5.933,380,4.983,381,4.104,382,4.983,383,4.983,384,4.983,385,4.983,386,4.983,387,4.983,388,3.153,389,4.983,390,4.983,391,2.837,392,4.983]],["keywords/template:templates/docs/advanced/simulating-cookie-responses",[]],["title/template:templates/docs/advanced/switching-between-scenarios",[393,1.413,394,0.969,395,1.055]],["text/template:templates/docs/advanced/switching-between-scenarios",[1,0.697,4,2.136,13,0.568,14,0.501,16,1.191,18,2.326,20,0.798,24,0.941,26,0.795,29,1.408,32,1.631,40,0.645,50,0.941,55,1.102,56,1.529,67,1.04,68,1.025,71,4.002,81,1.826,94,1.772,95,1.391,96,1.391,99,2.987,101,1.919,105,1.04,106,1.161,107,2.914,108,1.689,111,1.102,113,1.787,115,5.037,116,2.112,126,2.326,139,1.018,164,1.826,166,2.326,171,1.93,175,2.585,190,0.941,201,2.987,206,0.867,226,1.287,233,3.364,249,0.867,275,1.653,286,1.505,292,1.505,300,1.505,318,1.631,330,1.787,371,1.631,393,3.32,394,1.772,395,3.264,396,3.364,397,4.321,398,2.275,399,1.505,400,2.585,401,1.391,402,1.505,403,2.585,404,1.772,405,2.914,406,3.364,407,4.085,408,2.89,409,2.326,410,5.246,411,2.585,412,4.085,413,1.772,414,2.112,415,4.085,416,2.112,417,4.085,418,1.391,419,4.085,420,4.085,421,4.085,422,2.914,423,2.914,424,5.796,425,4.085,426,4.085,427,3.364,428,3.364,429,5.246,430,4.085,431,6.116,432,4.773,433,5.796,434,4.085,435,4.085,436,2.479,437,4.085,438,4.085,439,3.364,440,4.085,441,3.364,442,4.085,443,2.585]],["keywords/template:templates/docs/advanced/switching-between-scenarios",[]],["title/template:templates/docs/api/item",[]],["text/template:templates/docs/api/item",[]],["keywords/template:templates/docs/api/item",[]],["title/template:templates/docs/data-layer/database",[50,0.861]],["text/template:templates/docs/data-layer/database",[1,0.698,6,2.154,13,0.624,14,0.652,15,1.105,16,1.215,24,0.748,26,0.511,38,1.433,40,0.521,50,1.569,52,1.215,58,1.419,67,0.748,69,2.154,70,1.313,89,1.807,97,1.313,102,1.215,105,0.748,106,0.748,126,2.372,128,1.807,138,1.143,139,1.039,141,1.969,142,1.664,146,1.969,147,2.372,150,1.716,152,2.636,158,0.814,180,1.549,190,0.959,198,3.432,202,2.972,204,2.636,205,2.005,206,0.885,207,2.122,226,1.843,245,1.039,250,1.705,263,1.664,270,1.664,274,1.969,275,1.313,292,1.536,312,2.156,313,1.969,331,1.969,335,1.223,366,1.969,371,2.46,398,1.807,399,1.536,408,2.51,414,2.154,436,1.969,444,4.167,445,1.664,446,2.636,447,3.432,448,2.372,449,2.972,450,4.167,451,2.154,452,2.51,453,2.372,454,2.271,455,1.958,456,2.636,457,2.122,458,2.972,459,1.807,460,1.969,461,2.972,462,2.537,463,2.05,464,2.122,465,3.025,466,3.025,467,2.372,468,4.167,469,1.969,470,1.419,471,1.536,472,1.419,473,3.432,474,1.664,475,2.636,476,4.167,477,2.372,478,2.636,479,2.972,480,2.636,481,4.167,482,2.372,483,1.807,484,1.807,485,2.764,486,4.167,487,4.167,488,5.313,489,5.313,490,4.167,491,4.167,492,4.167,493,2.636]],["keywords/template:templates/docs/data-layer/database",[]],["title/template:templates/docs/data-layer/factories",[494,1.274]],["text/template:templates/docs/data-layer/factories",[1,0.705,2,2.181,3,2.094,4,0.832,9,0.76,11,0.455,13,0.627,14,0.424,15,0.957,16,0.389,20,0.755,23,0.78,24,0.693,25,1.1,26,0.753,29,1.412,32,1.172,40,0.46,47,1.273,48,1.64,50,1.165,52,0.389,54,1.611,55,1.266,57,0.769,58,0.769,60,0.76,65,0.579,67,1.108,68,0.441,70,0.421,71,0.845,75,1.261,77,0.579,79,1.131,81,0.712,83,0.76,87,0.455,88,1.113,90,0.952,91,1.067,94,0.579,96,1.599,97,0.421,99,1.286,101,1.302,104,1.176,105,0.957,106,1.108,108,1.588,111,1.266,112,1.082,113,0.455,118,0.69,119,0.89,128,1.498,132,0.579,133,2.094,138,0.261,139,1.113,141,1.387,142,0.533,145,1.302,146,1.387,148,1.126,150,0.931,154,1.783,156,1.168,157,1.498,158,0.956,164,0.421,167,0.69,172,1.286,173,1,176,0.845,178,0.832,183,1.298,186,1.858,190,0.795,194,0.631,197,0.579,202,0.952,205,1.848,206,0.89,207,1.542,209,1.067,210,1.723,219,0.579,220,1,222,1.172,223,0.69,224,1.286,226,1.681,238,0.98,244,1.717,245,1.59,249,1.157,253,0.69,260,0.952,262,0.76,264,0.952,266,0.712,270,1.674,275,1.217,277,0.455,279,0.952,285,1.176,286,0.492,291,0.952,293,0.952,294,1.387,296,1.671,297,1.1,300,1.423,303,1.429,304,0.845,305,0.832,308,0.952,309,0.952,310,1.168,313,1.632,314,0.533,315,1.1,318,1.953,321,1.387,322,1.168,323,0.69,324,5.295,328,1.632,330,2.129,335,0.307,340,0.845,344,2.311,346,0.76,349,0.76,350,1.498,351,1.542,371,0.533,381,1.1,393,1.429,395,2.311,396,1.1,398,1.818,399,1.273,401,1.315,402,1.082,403,0.845,408,1.387,411,1.429,413,0.98,416,1.785,418,1,432,2.844,436,1.825,441,3.181,445,0.533,446,0.845,451,1.518,454,0.492,455,0.832,457,0.533,460,0.631,462,2.777,463,2.017,464,1.783,469,0.631,470,1.723,471,1.545,472,1.773,474,0.533,477,0.76,482,1.671,483,1.273,484,1.273,485,1.387,493,0.845,494,2.27,495,0.76,496,3.453,497,0.845,498,2.418,499,1.611,500,1.168,501,1.335,502,3.862,503,1.1,504,0.952,505,0.952,506,0.533,507,1.335,508,1.429,509,1.335,510,1.335,511,1.981,512,0.845,513,1.785,514,1.674,515,1.802,516,1.335,517,0.845,518,1.335,519,0.952,520,1.518,521,1.966,522,2.185,523,3.678,524,0.952,525,1.335,526,1.858,527,2.418,528,1.1,529,1.1,530,1.1,531,2.391,532,1.168,533,3.608,534,2.259,535,3.349,536,2.754,537,0.902,538,1.335,539,1.429,540,1.1,541,2.259,542,1.335,543,1.335,544,0.952,545,0.69,546,1.1,547,2.463,548,3.512,549,0.69,550,1.86,551,1.335,552,1.86,553,1.067,554,1.611,555,1.335,556,2.463,557,3.375,558,2.185,559,1.86,560,2.259,561,1.335,562,1.335,563,2.418,564,2.259,565,1.335,566,1.335,567,1.429,568,0.845,569,1.1,570,0.952,571,1.335,572,1.335,573,1.335,574,1.335,575,1.335,576,1.335,577,1.335,578,3.094,579,1.273,580,1.1,581,2.418,582,1.858,583,2.653,584,1.335,585,1.611,586,2.259,587,1.1,588,0.952,589,3.862,590,1.335,591,1.335,592,1.335,593,1.335,594,1.86,595,1.335,596,1.335,597,1.335,598,1.335,599,1.335,600,1.335,601,1.335,602,1.335,603,1.335,604,2.194,605,0.845,606,1.335,607,3.678,608,1.1,609,1.86,610,0.952,611,1.86,612,1.335,613,1.168,614,1.335,615,1.518,616,1.335,617,2.826,618,1.335,619,2.259,620,0.76,621,0.631,622,5.799,623,2.615,624,0.69,625,1.335,626,0.952,627,1.335,628,1.335,629,0.845,630,1.335,631,1.335,632,2.259,633,0.845,634,0.579,635,1.1,636,0.952,637,1.335,638,0.952,639,0.952,640,3.185,641,0.69,642,2.704,643,1.335,644,4.89,645,3.453,646,2.418,647,3.453,648,1.335,649,1.1,650,1.1,651,1.335,652,4.695,653,0.631,654,0.952,655,1.172,656,1.1,657,0.952,658,1.286,659,3.862,660,0.631,661,1.335,662,2.936,663,0.952,664,0.69,665,0.579,666,2.259,667,1.335,668,1.335,669,1.286,670,1.518,671,1.335,672,1.335,673,0.76,674,1.86,675,1.1,676,0.69,677,1.335,678,4.695,679,2.094,680,2.094,681,1.86,682,2.259,683,2.259,684,2.259,685,0.845,686,1.335,687,0.952,688,2.936,689,1.335,690,1.335,691,1.335,692,2.259,693,1.429,694,2.259,695,2.936,696,0.76,697,1.335,698,1.1,699,1.1,700,1.335,701,1.335,702,0.76,703,1.335,704,0.76,705,1.1,706,1.611,707,2.259,708,1.335,709,1.335,710,1.335,711,1.1,712,1.335,713,0.952,714,1.335,715,1.335,716,1.335,717,1.335,718,1.335,719,3.453,720,1.335,721,1.335,722,1.1,723,0.845,724,0.845,725,1.335,726,1.671,727,1.335,728,0.98,729,1.335,730,0.845,731,2.094,732,1.1,733,0.845,734,0.845,735,0.952,736,1.1,737,1.1,738,0.631,739,1.1,740,0.952,741,0.69,742,0.952,743,1.335,744,1.335,745,0.952,746,1.1,747,1.335,748,0.845,749,1.1,750,1.335,751,0.952,752,1.335,753,1.335,754,2.936,755,2.259,756,2.259,757,2.259,758,1.1,759,0.76,760,1.335,761,0.845,762,1.335,763,1.1,764,1.1,765,1.1,766,0.952,767,0.845,768,1.1,769,0.952,770,1.1,771,1.335,772,1.335,773,1.1]],["keywords/template:templates/docs/data-layer/factories",[]],["title/template:templates/docs/data-layer/fixtures",[323,1.933]],["text/template:templates/docs/data-layer/fixtures",[1,0.705,2,1.754,4,1.726,11,0.927,13,0.641,14,0.672,15,1.085,20,0.532,23,0.924,26,0.789,28,1.721,32,1.585,34,2.233,40,0.605,43,1.18,47,1.726,48,0.857,50,1.261,55,0.734,56,0.793,57,0.927,65,1.18,67,1.152,75,1.685,79,0.734,84,1.003,87,1.352,88,0.678,101,1.827,102,0.793,106,0.712,108,0.793,111,0.734,119,0.578,129,1.549,132,1.721,145,1.596,148,1.157,150,1.263,154,1.585,156,1.406,164,1.25,183,1.563,195,1.285,200,2.241,201,1.549,205,2.12,206,0.995,209,1.285,210,1.352,220,1.352,222,1.585,226,1.25,245,0.989,249,0.578,266,1.476,270,1.086,275,1.25,286,1.003,305,2.274,312,1.003,314,1.086,321,1.285,322,2.422,323,3.48,330,1.352,335,1.079,338,1.07,345,1.549,359,2.241,398,1.18,400,1.721,401,0.927,408,1.285,411,2.511,418,0.927,436,2.213,445,1.086,454,1.726,455,1.726,458,1.94,460,1.285,461,1.94,463,1.622,469,2.701,470,2.188,471,1.462,472,1.352,482,1.549,483,1.18,484,1.18,485,1.285,494,1.596,514,1.585,520,2.662,522,2.964,528,2.241,531,1.086,545,1.406,553,1.285,557,1.721,558,1.721,579,1.18,587,2.241,604,1.18,615,1.406,617,1.721,621,2.788,629,1.721,633,1.721,634,1.721,635,3.268,636,2.83,642,2.213,660,1.285,665,1.18,675,2.241,726,2.667,728,1.18,737,2.241,741,1.406,748,2.511,759,1.549,774,2.72,775,2.259,776,3.968,777,2.72,778,2.241,779,2.72,780,2.72,781,1.94,782,4.509,783,3.968,784,3.968,785,2.052,786,1.721,787,1.94,788,2.72,789,2.241,790,2.241,791,2.72,792,6.269,793,2.72,794,2.72,795,2.72,796,5.149,797,2.72,798,2.72,799,2.72,800,2.72,801,2.72,802,2.72,803,2.72,804,2.72,805,2.72,806,2.72,807,2.72,808,2.72,809,2.72,810,2.72,811,2.72,812,2.72,813,2.72,814,3.268,815,3.341,816,2.72,817,2.241,818,1.875,819,4.685,820,2.241,821,1.549,822,2.72,823,2.241,824,2.72,825,2.72,826,2.72,827,2.72,828,2.241,829,2.241,830,2.422,831,3.968,832,5.716,833,2.241,834,5.149,835,2.72,836,2.662,837,4.241,838,5.149,839,3.905,840,2.72,841,1.003,842,1.721,843,2.259,844,1.18,845,2.72,846,2.72,847,1.285,848,3.968,849,3.968,850,1.721,851,1.721,852,2.72,853,1.721,854,2.241,855,2.72,856,2.241,857,2.241,858,1.721,859,3.268,860,2.72,861,2.241,862,2.72,863,2.241,864,2.72]],["keywords/template:templates/docs/data-layer/fixtures",[]],["title/template:templates/docs/data-layer/models",[23,0.56]],["text/template:templates/docs/data-layer/models",[1,0.688,2,1.699,6,1.954,13,0.621,14,0.757,15,1.001,16,1.454,19,2.151,20,0.975,23,1.051,24,0.895,26,0.685,28,2.391,29,0.87,38,1.019,40,0.605,49,2.574,52,1.102,65,1.639,67,1.001,70,1.191,75,0.942,77,1.639,87,1.287,97,1.571,101,1.454,104,1.287,105,0.895,118,1.954,119,1.059,138,0.975,139,1.243,145,1.454,146,1.785,148,1.102,150,1.345,158,0.975,173,1.287,176,3.156,178,1.393,180,1.454,182,1.785,183,1.538,210,1.287,212,2.391,220,2.159,244,1.191,245,1.611,248,1.954,249,1.346,250,1.454,255,2.695,263,1.509,272,1.992,277,1.287,292,1.838,294,1.785,300,1.393,312,2.057,318,1.509,328,1.785,338,1.019,342,2.151,350,1.639,354,1.639,371,2.371,394,1.639,401,1.287,402,1.393,408,2.356,409,2.151,418,1.287,436,2.356,454,1.838,455,1.393,457,2.229,459,1.639,463,1.571,473,3.112,474,1.509,494,1.699,499,2.695,506,1.509,513,2.578,514,1.509,521,2.151,526,3.532,545,1.954,613,3.069,639,2.695,646,3.112,655,1.992,664,1.954,679,2.695,680,2.695,681,3.112,685,2.391,696,2.151,830,1.954,843,2.151,850,3.156,865,2.151,866,3.779,867,2.695,868,3.779,869,3.779,870,3.112,871,3.112,872,2.695,873,1.393,874,2.695,875,2.695,876,2.391,877,3.112,878,2.886,879,3.779,880,2.391,881,2.391,882,3.779,883,3.112,884,3.779,885,3.779,886,3.779,887,3.112,888,3.779,889,3.112,890,3.779,891,3.779,892,3.156,893,3.112,894,3.532,895,3.112,896,3.779,897,3.779,898,4.987,899,3.779,900,3.779,901,3.779,902,3.779,903,3.557,904,3.779,905,3.779,906,3.779,907,2.391,908,3.779,909,2.391]],["keywords/template:templates/docs/data-layer/models",[]],["title/template:templates/docs/data-layer/orm",[454,1.378]],["text/template:templates/docs/data-layer/orm",[1,0.707,13,0.558,14,0.546,15,1.157,16,0.595,20,1.046,23,0.991,24,0.573,26,0.593,29,1.025,32,0.815,37,1.292,38,1.381,40,0.618,43,1.706,47,1.887,48,1.006,49,0.886,50,1.275,55,0.551,56,0.595,57,1.088,58,1.34,60,1.163,67,0.798,70,0.643,73,1.819,75,1.381,79,0.861,80,1.292,81,0.643,84,0.753,86,1.292,87,0.695,88,1.277,89,1.385,96,0.695,97,0.643,101,0.595,102,0.595,104,0.695,105,0.706,111,0.551,112,1.64,113,0.695,119,1.176,138,1.16,139,1.204,143,0.753,144,2.045,145,0.931,148,1.56,150,1.061,151,1.651,158,0.399,164,1.239,173,1.088,178,1.177,180,1.56,182,2.102,183,1.608,190,0.735,192,3.174,195,1.509,197,0.886,205,2.114,206,0.434,207,1.571,210,1.516,212,2.021,219,0.886,221,1.509,236,2.631,238,0.886,244,1.402,245,1.277,249,1.087,250,1.73,263,0.815,266,0.643,270,0.815,277,1.088,286,0.753,292,1.177,305,1.887,307,1.456,312,0.753,313,0.965,318,1.276,321,0.965,328,1.859,330,0.695,335,0.47,338,1.381,345,1.163,348,1.819,350,0.886,358,2.034,366,1.509,369,1.292,393,1.292,394,0.886,399,0.753,401,0.695,402,1.177,404,0.886,409,1.163,418,1.516,445,1.571,448,1.163,452,0.965,454,2.325,455,0.753,457,0.815,459,1.385,461,1.456,462,2.83,463,2.004,464,2.273,465,1.163,466,1.163,470,2.107,471,1.64,472,1.516,474,0.815,475,2.021,495,1.163,496,1.682,497,1.292,500,1.056,504,1.456,506,1.276,508,1.292,511,1.509,512,1.292,514,2.137,515,0.753,519,2.278,520,2.034,526,1.292,531,2.497,533,3.817,535,3.652,536,3.652,537,0.815,549,1.056,585,1.456,604,1.93,605,2.489,607,4.217,608,1.682,609,3.24,610,1.456,611,4.796,613,2.647,615,2.034,620,1.163,621,1.859,634,0.886,641,1.651,642,0.965,649,1.682,653,2.102,655,1.571,657,1.456,658,1.819,660,1.859,665,0.886,673,1.163,687,1.456,693,1.292,696,1.819,702,1.163,726,1.819,728,1.385,738,0.965,759,1.819,761,1.292,769,1.456,818,2.282,841,1.64,842,1.292,843,1.163,844,2.469,847,1.509,856,1.682,858,1.292,859,1.682,865,1.163,873,1.177,883,1.682,889,1.682,910,2.278,911,1.682,912,2.042,913,2.021,914,2.021,915,2.042,916,2.042,917,2.042,918,1.682,919,1.682,920,1.682,921,1.682,922,2.042,923,2.042,924,3.934,925,1.651,926,1.819,927,3.194,928,2.042,929,3.056,930,3.194,931,3.194,932,2.042,933,1.292,934,5.12,935,5.12,936,5.12,937,2.042,938,2.042,939,3.194,940,2.042,941,1.682,942,2.042,943,2.042,944,2.042,945,2.042,946,1.456,947,1.682,948,3.194,949,5.538,950,3.194,951,3.817,952,2.042,953,1.682,954,2.278,955,2.806,956,2.278,957,1.456,958,2.278,959,2.042,960,1.456,961,2.631,962,3.194,963,1.682,964,2.042,965,1.456,966,3.194,967,1.682,968,1.163,969,2.278,970,2.631,971,1.682,972,1.292,973,1.456,974,1.056,975,2.042,976,2.042,977,2.042,978,3.194,979,2.042,980,1.456,981,2.042,982,1.682,983,2.042,984,1.056,985,1.682,986,2.042,987,3.934,988,3.934,989,3.934,990,3.934,991,3.194,992,3.194,993,3.934,994,3.934,995,1.682,996,2.042,997,2.042,998,2.042,999,2.042,1000,2.042,1001,2.042,1002,1.682,1003,2.042,1004,2.042,1005,2.042,1006,1.163]],["keywords/template:templates/docs/data-layer/orm",[]],["title/template:templates/docs/data-layer/relationships",[183,0.932]],["text/template:templates/docs/data-layer/relationships",[0,1.502,1,0.705,2,1.321,3,4.705,11,0.898,13,0.53,14,0.324,15,0.696,16,1.131,17,1.502,20,0.899,23,1.025,24,0.91,26,0.804,29,1.168,32,1.053,40,0.451,47,1.43,48,0.831,49,2.201,50,0.607,52,0.769,59,1.246,63,1.881,65,1.144,67,1.176,75,1.147,78,1.838,79,0.711,80,1.669,82,1.669,84,1.43,87,0.898,88,0.967,90,1.881,91,1.833,95,1.567,96,1.567,102,0.769,104,1.567,111,0.711,119,0.824,126,1.502,130,2.767,147,2.209,154,1.838,164,1.599,173,1.321,178,0.972,179,1.669,180,0.769,183,1.663,205,1.703,206,1.34,207,1.053,220,2.043,221,1.246,222,1.549,224,1.502,245,1.147,248,1.364,249,1.273,254,1.502,266,0.831,272,1.053,274,2.174,275,1.599,285,1.926,292,1.43,296,2.209,300,1.43,305,1.696,314,1.053,321,2.94,322,3.301,330,1.321,335,0.893,338,1.046,342,1.502,350,2.201,351,1.838,354,1.683,394,1.144,402,0.972,404,1.144,418,0.898,451,1.364,454,0.972,455,0.972,456,1.669,457,1.053,459,1.144,463,1.222,470,1.728,471,1.993,472,1.567,494,0.898,513,1.364,514,1.053,520,3.388,537,1.053,579,1.144,604,1.683,613,2.006,615,1.364,621,2.174,634,2.201,638,1.881,640,1.881,642,2.94,650,3.195,655,2.258,656,2.173,664,1.364,665,1.683,669,2.62,676,1.364,679,2.767,680,2.767,713,1.881,728,1.144,738,1.833,821,1.502,830,3.334,833,2.173,839,1.881,843,2.889,844,2.601,850,1.669,851,1.669,853,1.669,858,3.578,876,2.455,877,3.79,878,1.364,909,1.669,925,1.364,980,1.881,1007,2.638,1008,2.173,1009,2.638,1010,1.881,1011,5.074,1012,4.602,1013,2.638,1014,2.638,1015,3.88,1016,2.638,1017,2.638,1018,2.638,1019,2.638,1020,3.79,1021,2.638,1022,3.79,1023,2.638,1024,4.814,1025,2.638,1026,2.638,1027,2.638,1028,3.88,1029,4.602,1030,2.638,1031,2.638,1032,2.638,1033,2.638,1034,2.638,1035,2.455,1036,5.407,1037,2.638,1038,2.638,1039,4.602,1040,2.638,1041,2.638,1042,1.669,1043,3.88,1044,3.88,1045,2.638,1046,2.638,1047,2.638,1048,3.88,1049,2.638,1050,5.845,1051,2.173,1052,3.88,1053,2.638,1054,2.638,1055,2.638,1056,2.638,1057,2.638,1058,1.881,1059,2.638,1060,2.638,1061,2.638,1062,2.638,1063,2.638,1064,2.638,1065,3.88,1066,3.88,1067,3.88,1068,2.638,1069,2.638,1070,2.638,1071,2.638,1072,2.638,1073,2.638,1074,2.638,1075,2.638,1076,3.88,1077,2.638,1078,3.88,1079,1.364]],["keywords/template:templates/docs/data-layer/relationships",[]],["title/template:templates/docs/data-layer/serializers/ember-data-serializer",[]],["text/template:templates/docs/data-layer/serializers/ember-data-serializer",[1,0.667,13,0.661,14,0.767,15,1.155,19,2.467,20,0.847,23,0.936,24,0.778,26,0.731,29,1.254,40,0.667,47,1.597,67,0.977,68,1.221,75,1.081,78,2.175,105,0.977,119,1.157,145,1.263,148,1.263,197,1.88,204,3.447,205,2.029,238,1.88,266,2.029,268,1.88,269,2.742,286,2.196,305,2.304,314,1.731,338,1.86,340,3.447,344,2.048,346,2.467,347,4.458,348,3.842,350,2.974,351,1.731,354,2.584,355,3.447,357,4.317,366,2.048,399,1.597,418,1.476,537,1.731,581,5.148,658,2.467,851,2.742,873,2.196,1006,2.467,1024,3.57,1080,3.885,1081,4.334,1082,3.57,1083,3.57,1084,4.334,1085,6.25,1086,5.447,1087,3.57,1088,4.334,1089,3.57,1090,4.334,1091,4.334]],["keywords/template:templates/docs/data-layer/serializers/ember-data-serializer",[]],["title/template:templates/docs/data-layer/serializers/index",[338,1.008]],["text/template:templates/docs/data-layer/serializers/index",[1,0.702,9,1.431,11,1.96,13,0.649,14,0.791,15,1.12,16,1.445,17,2.131,20,0.968,23,0.886,24,0.802,26,0.742,29,1.325,34,1.09,38,1.498,40,0.519,42,1.187,44,1.495,48,0.792,49,2.298,52,0.732,54,1.792,55,0.678,57,0.856,58,1.275,67,0.997,68,0.491,70,1.863,75,1.115,79,0.678,80,2.83,84,1.379,86,1.59,87,0.856,88,1.321,89,1.623,95,0.856,101,0.732,102,0.732,103,1.431,104,0.856,106,0.451,111,0.678,113,0.856,119,1.052,121,2.07,125,1.431,138,1.036,139,1.474,144,1.495,145,1.545,146,1.187,147,2.131,148,1.304,150,1.429,151,2.312,154,1.003,155,1.431,157,1.09,158,1.181,180,0.732,182,1.187,183,1.435,185,2.07,186,1.59,190,0.862,197,1.09,205,1.904,206,0.534,210,1.275,211,3.683,213,2.07,219,1.623,220,1.275,221,1.768,244,1.409,245,0.933,248,1.299,249,1.125,250,1.545,254,1.431,263,1.003,270,1.003,272,1.003,275,1.179,285,1.275,286,1.379,300,1.379,304,2.368,309,3.534,310,1.299,312,0.926,313,1.187,318,1.003,331,1.187,335,1.22,338,1.88,340,1.59,341,1.792,342,1.431,344,1.187,347,1.792,348,2.131,351,1.495,354,1.09,355,1.59,357,1.684,358,2.872,369,1.59,371,1.003,399,1.379,401,1.275,402,1.826,416,1.299,418,0.856,445,1.786,449,1.792,452,1.187,455,0.926,456,1.59,462,2.621,463,1.409,464,1.979,467,2.131,469,1.187,470,1.805,471,0.926,472,0.856,480,1.59,495,1.431,506,2.298,511,2.113,514,1.495,515,1.379,531,1.979,532,1.299,533,1.792,545,1.299,567,1.59,579,1.09,580,2.07,582,1.59,604,2.298,613,1.299,615,1.299,623,2.562,624,1.299,634,1.623,653,1.187,657,1.792,660,2.341,664,2.312,665,1.09,669,1.431,670,1.299,728,1.09,732,2.07,738,1.187,742,1.792,761,2.368,767,2.368,775,1.431,818,2.855,820,2.07,828,2.07,836,1.299,841,0.926,844,2.496,850,1.59,873,2.301,878,1.935,880,2.368,892,1.59,893,2.07,894,2.368,907,1.59,910,2.669,913,1.59,914,2.368,918,2.07,919,2.07,925,1.935,926,2.821,951,3.19,954,1.792,956,1.792,968,1.431,971,2.07,972,2.368,973,2.669,974,2.872,984,1.935,1042,1.59,1079,2.312,1080,2.669,1092,2.513,1093,2.07,1094,4.081,1095,2.07,1096,2.513,1097,2.513,1098,2.07,1099,2.513,1100,2.07,1101,2.513,1102,3.082,1103,2.513,1104,2.513,1105,2.513,1106,1.792,1107,1.792,1108,2.07,1109,2.513,1110,1.792,1111,2.513,1112,2.07,1113,2.513,1114,2.513,1115,2.513,1116,4.472,1117,3.743,1118,2.513,1119,2.513,1120,2.07,1121,2.513,1122,2.513,1123,2.513,1124,2.07,1125,2.07,1126,2.513,1127,2.513,1128,2.669,1129,2.513,1130,2.07,1131,3.683,1132,2.513,1133,2.07,1134,2.07,1135,3.082,1136,2.07,1137,2.513,1138,2.513,1139,2.513,1140,2.07,1141,2.07,1142,2.513,1143,2.513,1144,2.513,1145,2.07,1146,2.368,1147,3.082,1148,3.743,1149,3.743,1150,2.07,1151,2.513,1152,2.513,1153,2.513,1154,2.513,1155,2.513,1156,2.513,1157,2.513]],["keywords/template:templates/docs/data-layer/serializers/index",[]],["title/template:templates/docs/getting-started/installation",[568,2.366]],["text/template:templates/docs/getting-started/installation",[1,0.436,13,0.542,14,0.832,16,1.296,20,0.869,26,0.546,38,1.492,40,0.681,56,1.757,70,1.4,78,2.21,81,1.987,82,3.502,84,2.04,88,1.108,94,1.928,99,2.531,105,0.993,108,1.757,112,1.638,119,1.28,122,3.17,128,1.928,142,1.775,155,3.431,158,1.178,164,1.899,166,2.531,171,2.1,174,3.17,175,2.812,201,3.151,210,1.514,223,2.298,244,1.4,251,4.298,268,1.928,276,3.17,277,1.885,292,2.221,310,2.861,311,3.661,330,2.053,343,2.812,375,3.947,391,2.531,401,1.514,402,1.638,422,3.17,460,2.1,478,2.812,568,4.105,579,1.928,626,3.17,660,2.615,663,3.17,664,2.298,821,2.531,836,2.298,1008,3.661,1160,4.558,1161,4.445,1162,5.534,1163,4.445,1164,4.445,1165,4.445,1166,4.445,1167,6.027,1168,3.661,1169,4.445,1170,4.445,1171,4.445,1172,4.445,1173,4.445,1174,4.445,1175,4.445,1176,6.615,1177,2.812,1178,4.445,1179,3.661,1180,3.502,1181,3.947,1182,4.445,1183,4.445]],["keywords/template:templates/docs/getting-started/installation",[]],["title/template:templates/docs/getting-started/overview",[1184,3.079]],["text/template:templates/docs/getting-started/overview",[1,0.706,2,0.623,4,1.349,6,1.513,11,1.246,13,0.61,14,0.707,15,1.179,19,1.041,20,0.954,23,0.914,24,0.751,26,0.674,29,1.227,32,0.73,33,1.666,34,0.793,38,1.552,40,0.638,42,1.383,43,1.985,44,1.828,47,1.542,48,0.922,50,1.371,51,1.157,52,0.533,53,1.041,55,1.128,57,1.246,58,1.814,59,0.864,67,0.92,68,0.954,69,0.945,73,1.666,75,1.405,79,1.317,84,1.079,87,1.425,88,1.405,89,1.814,91,0.864,96,0.997,101,1.219,102,0.533,105,0.956,106,0.876,108,1.219,111,0.789,112,1.799,116,0.945,117,1.157,119,0.888,124,1.506,125,1.041,128,1.269,129,1.041,132,0.793,138,1.279,139,1.484,142,0.73,143,0.674,144,2.127,145,1.334,147,1.666,148,1.423,150,1.436,151,1.513,156,0.945,157,1.587,158,0.954,160,2.41,165,1.506,171,0.864,172,2.083,173,1.246,178,1.349,180,1.334,183,1.217,190,0.843,192,1.304,194,1.383,195,0.864,197,1.269,204,1.157,205,1.813,206,1.131,207,1.169,209,0.864,210,1.425,216,1.304,219,0.793,220,0.997,222,0.73,224,1.041,226,0.922,237,1.506,238,0.793,244,1.538,245,1.328,249,0.888,250,1.845,252,1.157,255,1.304,262,2.083,263,0.73,268,0.793,270,0.73,272,1.461,274,0.864,275,0.922,277,1.246,284,1.506,286,0.674,294,0.864,305,1.079,308,1.304,312,0.674,314,1.169,318,1.461,321,1.383,322,1.513,328,1.383,331,0.864,334,1.157,335,1.18,338,1.481,343,1.157,344,0.864,350,0.793,351,0.73,355,1.157,358,0.945,363,2.083,369,1.852,371,0.73,394,0.793,395,0.864,398,1.587,400,1.157,401,1.246,403,1.157,408,1.383,413,1.269,414,0.945,418,0.623,436,0.864,445,1.461,446,2.315,447,1.506,448,1.041,451,2.524,452,0.864,453,1.041,454,0.674,455,1.349,459,0.793,460,1.383,462,2.86,463,1.775,464,1.95,465,1.041,466,1.041,467,1.666,470,2.028,471,1.687,472,1.425,474,0.73,483,1.587,484,1.587,485,1.729,494,1.746,497,1.157,500,0.945,506,1.461,511,1.976,514,1.671,515,0.674,517,1.157,519,2.087,520,1.892,521,1.041,522,1.157,523,1.506,527,1.506,531,2.127,537,1.169,539,1.157,544,1.304,545,1.513,546,1.506,547,1.304,548,1.157,549,0.945,550,1.506,553,1.729,554,1.304,556,1.304,567,1.157,578,1.157,583,1.157,588,1.304,604,1.814,615,0.945,617,1.157,621,0.864,623,0.945,624,0.945,633,1.852,634,1.269,641,1.513,642,1.729,653,0.864,654,1.304,655,1.169,665,0.793,670,0.945,676,0.945,685,1.157,696,1.041,704,1.041,705,1.506,706,1.304,723,1.157,724,1.157,726,2.083,728,1.587,730,1.157,733,1.157,734,1.157,741,1.513,751,2.087,758,1.506,765,1.506,770,1.506,786,1.852,817,1.506,818,2.307,830,1.892,836,0.945,841,0.674,844,2.223,847,1.383,861,1.506,863,1.506,865,1.041,872,3.264,873,0.674,874,1.304,875,2.087,907,1.157,910,2.61,914,2.315,925,1.513,926,2.083,929,1.157,933,1.852,955,1.304,957,1.304,961,1.506,963,1.506,967,1.506,972,1.157,974,1.892,984,0.945,995,1.506,1079,0.945,1093,2.41,1094,3.014,1098,1.506,1107,1.304,1108,1.506,1124,2.41,1125,1.506,1131,1.506,1133,1.506,1134,2.41,1136,1.506,1146,1.157,1184,1.506,1185,1.828,1186,1.506,1187,2.41,1188,4.183,1189,1.828,1190,1.828,1191,1.828,1192,1.828,1193,1.304,1194,1.828,1195,1.828,1196,1.506,1197,1.828,1198,1.828,1199,1.828,1200,1.828,1201,1.506,1202,4.576,1203,3.014,1204,1.828,1205,2.41,1206,1.828,1207,1.828,1208,4.576,1209,4.576,1210,2.927,1211,2.927,1212,1.828,1213,1.828,1214,1.304,1215,1.157,1216,0.945,1217,1.041,1218,1.304,1219,1.157,1220,1.304,1221,1.157,1222,2.61,1223,1.828,1224,1.828,1225,1.828,1226,2.087,1227,1.304,1228,1.506,1229,1.828,1230,1.506,1231,1.828,1232,1.828,1233,1.828,1234,2.41,1235,2.927,1236,1.828,1237,1.828,1238,1.828,1239,3.659,1240,2.927,1241,2.927,1242,2.927,1243,2.927,1244,1.828,1245,1.828,1246,1.828,1247,2.41,1248,1.304,1249,1.506,1250,1.506,1251,2.927,1252,1.828,1253,1.828,1254,1.828,1255,1.828,1256,1.828,1257,1.828,1258,2.927,1259,1.506,1260,3.659,1261,1.828,1262,1.506,1263,1.304,1264,1.304,1265,1.157,1266,1.506,1267,1.506,1268,1.828,1269,1.828,1270,1.304,1271,1.506,1272,1.157,1273,1.304,1274,1.828,1275,2.927,1276,1.828,1277,1.828,1278,1.506,1279,2.41,1280,1.828,1281,1.828,1282,1.304,1283,1.828]],["keywords/template:templates/docs/getting-started/overview",[]],["title/template:templates/docs/getting-started/upgrade-guide/index",[52,0.815,316,1.995]],["text/template:templates/docs/getting-started/upgrade-guide/index",[0,0.751,1,0.698,2,1.809,4,1.072,6,1.156,9,1.95,13,0.636,14,0.636,15,1.049,16,1.214,18,1.656,19,0.751,20,1.061,23,0.953,24,0.401,26,0.733,28,1.414,29,1.459,32,1.162,33,0.751,34,0.969,35,1.273,37,0.834,38,1.034,40,0.641,42,2.449,43,1.262,44,0.893,46,1.841,47,1.636,48,1.079,49,2.025,50,1.12,51,0.834,52,1.511,53,2.183,55,0.603,56,0.384,57,1.167,58,0.449,59,0.623,60,1.273,64,1.086,65,1.262,67,0.974,68,0.913,70,0.415,73,0.751,75,1.353,77,0.572,78,1.943,79,1.197,81,0.704,83,0.751,84,1.413,85,1.414,86,0.834,87,0.449,88,1.422,93,1.086,94,0.572,95,0.761,96,1.167,97,0.415,99,0.751,101,1.511,102,0.384,104,1.167,105,0.747,106,0.237,107,0.941,108,0.652,111,0.356,112,2.255,113,1.591,114,1.086,116,1.156,117,1.414,119,1.128,125,1.273,126,0.751,128,1.486,129,0.751,131,1.594,132,0.572,135,0.834,136,2.053,137,0.834,138,1.038,139,1.379,140,0.834,142,0.527,143,0.486,145,1.214,148,0.999,150,1.034,151,2.747,154,1.162,155,1.273,157,1.262,158,0.814,164,1.312,166,2.183,167,0.682,171,1.968,173,1.167,174,0.941,175,1.414,177,1.841,178,0.824,180,1.118,183,1.441,190,1.075,191,1.086,194,0.623,197,0.969,201,1.273,205,1.471,206,0.884,209,0.623,210,1.419,212,1.414,214,1.414,216,0.941,220,1.306,221,1.375,222,0.893,223,1.982,226,1.079,238,0.572,244,1.471,245,0.854,249,0.943,250,1.294,251,0.941,253,0.682,259,1.086,262,2.183,264,0.941,266,0.415,267,1.086,268,0.969,270,0.527,272,1.162,273,1.086,274,0.623,275,0.415,277,1.167,279,1.594,281,1.086,285,0.449,287,1.086,290,0.834,292,1.072,293,1.594,294,1.056,296,1.273,300,1.413,303,1.414,305,2.072,307,0.941,310,1.156,312,1.413,313,1.056,314,1.368,316,4.01,317,1.086,318,1.162,321,1.812,322,1.504,323,1.982,325,1.086,326,1.086,327,3.656,328,1.375,329,1.086,330,0.991,331,1.375,332,0.941,333,0.941,335,0.959,338,1.464,341,2.735,342,1.273,343,3.434,345,1.656,346,1.273,348,0.751,349,0.751,350,1.663,351,0.893,354,0.572,356,1.086,358,1.771,365,1.086,366,0.623,388,2.168,391,0.751,394,0.572,398,0.969,399,1.413,401,0.991,402,1.072,404,0.572,405,2.075,418,1.591,423,1.594,439,1.086,443,0.834,445,1.368,446,0.834,453,1.656,454,1.535,458,0.941,459,1.486,460,1.375,469,0.623,470,1.765,471,0.486,472,0.991,474,1.162,475,0.834,480,1.414,494,1.809,495,0.751,500,1.771,504,1.594,505,0.941,506,0.527,508,1.414,512,0.834,513,0.682,515,1.072,517,0.834,520,1.982,521,1.273,524,1.594,531,1.162,537,0.527,544,1.594,545,0.682,548,1.414,549,0.682,553,0.623,554,1.594,558,0.834,559,4.47,567,0.834,568,2.955,569,2.822,570,2.735,579,0.572,583,0.834,588,0.941,594,1.841,604,1.925,620,0.751,621,2.206,623,0.682,624,1.156,626,1.594,633,1.414,634,0.572,636,1.594,641,1.156,642,0.623,647,2.822,653,1.056,654,0.941,655,1.773,658,0.751,660,0.623,663,1.594,669,1.273,670,0.682,673,0.751,676,1.156,685,0.834,687,1.594,693,0.834,704,0.751,706,0.941,713,0.941,724,0.834,730,2.809,741,1.156,742,0.941,745,0.941,746,1.841,748,0.834,763,1.086,767,0.834,769,0.941,775,0.751,782,1.841,785,1.771,787,0.941,789,2.396,790,2.396,814,2.822,815,2.444,818,1.812,830,2.679,836,0.682,839,0.941,841,0.824,842,1.414,844,1.663,847,1.056,851,1.841,853,0.834,854,1.086,857,1.841,858,1.414,865,1.656,872,0.941,873,0.486,875,0.941,876,1.414,881,0.834,895,1.841,903,0.941,907,0.834,913,0.834,920,1.086,925,0.682,926,2.527,933,1.841,946,1.594,951,1.594,954,1.594,965,0.941,968,0.751,972,1.414,973,0.941,974,2.414,982,1.086,984,1.156,1002,1.086,1006,1.95,1010,0.941,1020,3.656,1035,1.414,1042,1.414,1051,1.086,1058,0.941,1080,1.594,1082,1.086,1083,1.086,1087,1.841,1089,1.086,1102,1.086,1107,2.075,1110,1.594,1130,1.841,1135,3.846,1140,1.086,1141,1.086,1160,1.841,1177,1.841,1180,0.834,1187,1.086,1201,1.841,1203,1.841,1205,1.841,1216,1.771,1217,0.751,1248,0.941,1259,1.086,1265,1.414,1273,0.941,1284,4.166,1285,2.909,1286,2.235,1287,2.909,1288,2.235,1289,4.439,1290,1.086,1291,3.834,1292,1.086,1293,1.319,1294,3.834,1295,1.319,1296,2.396,1297,1.319,1298,1.319,1299,3.834,1300,1.319,1301,1.319,1302,1.319,1303,1.319,1304,2.235,1305,3.158,1306,0.941,1307,1.319,1308,2.235,1309,3.426,1310,1.319,1311,1.319,1312,1.086,1313,2.235,1314,1.319,1315,1.319,1316,1.319,1317,1.319,1318,2.235,1319,1.319,1320,1.319,1321,1.319,1322,1.086,1323,1.319,1324,2.909,1325,3.426,1326,1.319,1327,1.319,1328,2.909,1329,2.909,1330,2.235,1331,3.834,1332,1.319,1333,2.235,1334,3.426,1335,3.426,1336,1.319,1337,1.319,1338,1.319,1339,1.319,1340,1.319,1341,2.235,1342,1.319,1343,2.235,1344,1.319,1345,1.319,1346,1.086,1347,1.319,1348,1.319,1349,4.166,1350,1.319,1351,2.235,1352,1.319,1353,1.594,1354,1.086,1355,3.426,1356,2.235,1357,1.319,1358,1.319,1359,1.319,1360,1.319,1361,1.319,1362,1.319,1363,1.319,1364,1.319,1365,2.235,1366,2.909,1367,2.235,1368,1.319,1369,1.319,1370,1.319,1371,1.319,1372,1.319,1373,1.319,1374,2.235,1375,2.235,1376,2.235,1377,1.319,1378,1.319,1379,1.841,1380,1.319,1381,1.319,1382,1.086,1383,1.319,1384,1.086,1385,1.319,1386,1.086,1387,2.909,1388,2.909,1389,3.426,1390,1.319,1391,4.866,1392,0.941,1393,1.086,1394,1.319,1395,1.319,1396,2.235,1397,1.319,1398,2.235,1399,1.319,1400,1.319,1401,2.235,1402,1.319,1403,1.319,1404,1.319,1405,2.396,1406,1.319,1407,1.319,1408,1.319,1409,1.319,1410,2.235,1411,1.086,1412,1.319,1413,1.319,1414,2.909,1415,1.319,1416,1.319,1417,1.319,1418,3.426,1419,2.235,1420,1.319,1421,1.319,1422,1.319,1423,1.319,1424,1.319,1425,1.319,1426,1.319,1427,1.319,1428,1.086,1429,1.319,1430,1.086,1431,1.319,1432,1.319,1433,1.319,1434,1.319,1435,1.319,1436,1.319,1437,1.319,1438,1.319,1439,3.834,1440,1.319,1441,1.319,1442,1.319,1443,1.319,1444,1.319,1445,1.319,1446,1.319,1447,2.235,1448,2.235,1449,1.319,1450,1.319,1451,1.319,1452,1.319,1453,1.319,1454,2.235,1455,1.319,1456,1.319,1457,1.319,1458,1.319,1459,1.319,1460,1.319,1461,1.319,1462,2.235,1463,1.319,1464,0.941,1465,1.319,1466,1.319,1467,1.319,1468,1.319,1469,1.319,1470,1.319,1471,1.319,1472,1.319,1473,3.426,1474,1.319,1475,1.086,1476,1.086,1477,1.319,1478,1.319,1479,1.086,1480,1.319,1481,2.235,1482,2.235,1483,1.319,1484,1.086,1485,1.319,1486,1.319,1487,1.319,1488,1.319,1489,1.319,1490,1.319,1491,1.841,1492,2.235,1493,1.319,1494,1.319,1495,1.319,1496,1.319,1497,1.319,1498,1.319,1499,1.319,1500,1.319]],["keywords/template:templates/docs/getting-started/upgrade-guide/index",[]],["title/template:templates/docs/getting-started/upgrade-guide/v2-deprecations",[78,0.743,314,0.743,1353,1.326,1501,1.531]],["text/template:templates/docs/getting-started/upgrade-guide/v2-deprecations",[26,0.68,67,0.994,68,1.082,78,2.212,138,1.082,244,1.745,314,2.212,319,4.562,1353,3.951,1501,4.562]],["keywords/template:templates/docs/getting-started/upgrade-guide/v2-deprecations",[]],["title/template:templates/docs/getting-started/what-is-mirage",[40,0.366]],["text/template:templates/docs/getting-started/what-is-mirage",[13,0.604,14,0.799,15,1.105,20,0.814,23,0.624,33,3.025,34,1.807,38,1.578,40,0.672,41,2.636,48,1.313,50,1.223,55,1.124,56,1.215,68,0.814,70,1.674,79,1.716,81,1.313,89,1.807,92,2.372,102,1.549,103,2.372,104,1.419,105,1.167,106,0.953,108,1.897,113,1.419,118,2.154,119,1.242,138,0.814,142,1.664,143,2.398,144,1.664,158,1.244,183,1.039,190,1.223,195,3.007,207,1.664,226,1.313,248,2.154,249,0.885,262,3.331,268,1.807,285,1.419,286,1.536,303,2.636,323,2.154,335,0.959,338,1.124,363,3.025,375,2.972,395,1.969,402,1.536,404,1.807,409,2.372,414,2.154,448,2.372,449,2.972,451,2.747,452,1.969,478,2.636,494,1.993,505,2.972,506,2.46,508,2.636,553,2.51,570,4.394,641,3.024,653,1.969,673,2.372,676,3.185,696,3.025,748,2.636,759,2.372,766,2.972,773,3.432,818,1.969,841,1.536,892,2.636,911,3.432,956,2.972,960,2.972,984,2.154,985,3.432,1106,2.972,1110,2.972,1181,2.972,1193,2.972,1270,3.79,1282,2.972,1306,2.972,1386,3.432,1392,2.972,1405,3.432,1502,4.818,1503,4.167,1504,5.85,1505,4.167,1506,4.167,1507,4.167,1508,4.167,1509,4.167,1510,3.432,1511,5.313,1512,5.313,1513,4.167,1514,3.432,1515,4.167,1516,4.167,1517,4.167,1518,4.167,1519,4.167]],["keywords/template:templates/docs/getting-started/what-is-mirage",[]],["title/template:templates/docs/route-handlers/functions",[68,0.731]],["text/template:templates/docs/route-handlers/functions",[1,0.708,2,1.834,4,1.296,11,1.197,13,0.633,14,0.687,15,1.06,16,1.24,20,0.831,23,0.526,24,1.004,26,0.661,29,0.532,34,1.525,35,2.706,38,1.783,40,0.417,41,1.463,43,1.003,44,2.041,49,1.525,53,2.001,55,0.948,56,0.674,57,1.964,58,1.741,59,1.092,65,1.003,67,0.631,68,1.27,75,1.185,77,1.003,79,0.948,81,0.728,87,0.788,88,0.576,92,2.422,95,1.197,96,1.619,97,1.34,105,0.415,106,0.966,108,0.674,111,0.948,112,0.852,117,1.463,119,1.143,132,1.525,138,1.278,139,1.64,143,0.852,144,2.235,145,0.674,146,1.092,148,0.674,150,0.624,151,1.195,155,1.316,157,2.061,158,1.127,164,0.728,172,2.422,178,0.852,180,1.631,183,0.876,190,0.979,205,1.34,206,0.746,207,0.923,209,1.092,214,1.463,219,1.003,220,1.906,223,1.195,225,1.649,238,1.003,244,0.728,245,0.576,249,0.746,250,1.85,263,0.923,266,1.108,268,2.061,269,2.224,270,1.898,275,1.108,277,1.197,285,1.964,286,1.296,290,1.463,292,0.852,294,1.092,300,0.852,304,1.463,305,1.751,318,1.699,330,1.619,331,1.092,332,1.649,334,1.463,335,0.979,337,2.895,338,1.452,339,1.904,344,1.661,351,0.923,354,2.061,358,1.195,363,1.316,367,3.914,371,2.041,388,2.691,399,1.296,402,0.852,404,1.845,416,1.195,418,0.788,443,3.234,445,1.898,451,2.643,452,1.092,453,1.316,455,0.852,457,0.923,462,1.845,463,1.108,464,1.699,465,2.422,466,2.422,467,3.186,470,1.741,471,0.852,472,0.788,478,1.463,497,2.224,500,1.195,515,1.568,517,1.463,531,1.404,532,2.199,537,0.923,540,1.904,553,1.092,557,1.463,558,1.463,578,2.224,582,1.463,610,1.649,613,1.195,620,1.316,621,2.01,699,1.904,702,2.001,722,3.914,723,1.463,731,1.649,738,1.092,740,1.649,815,1.649,836,1.195,844,1.525,847,1.092,865,1.316,867,1.649,873,1.984,874,1.649,878,1.818,880,2.691,881,1.463,894,2.691,909,1.463,913,1.463,926,1.316,929,1.463,947,1.904,955,1.649,958,2.507,960,1.649,965,1.649,968,1.316,969,2.507,970,1.904,1010,1.649,1035,2.224,1058,1.649,1095,1.904,1120,1.904,1128,3.034,1145,2.895,1146,2.691,1147,2.895,1177,1.463,1180,2.224,1234,1.904,1262,1.904,1263,3.389,1264,2.507,1265,1.463,1266,1.904,1267,1.904,1272,1.463,1278,1.904,1279,1.904,1292,2.895,1305,1.904,1312,1.904,1322,2.895,1354,4.21,1475,1.904,1476,1.904,1484,1.904,1491,1.904,1520,3.515,1521,2.895,1522,2.895,1523,2.312,1524,2.312,1525,4.752,1526,2.312,1527,2.312,1528,2.312,1529,2.312,1530,3.034,1531,3.515,1532,1.904,1533,1.904,1534,2.312,1535,2.312,1536,2.312,1537,2.312,1538,2.312,1539,4.752,1540,4.253,1541,2.312,1542,2.312,1543,2.312,1544,2.312,1545,2.312,1546,2.312,1547,2.312,1548,3.515,1549,2.312,1550,2.312,1551,3.515,1552,2.312,1553,2.312,1554,3.515,1555,2.312,1556,2.312,1557,2.312,1558,2.312,1559,2.312,1560,2.312,1561,1.904,1562,2.312,1563,2.312,1564,2.312,1565,1.904,1566,2.312,1567,2.312,1568,2.312,1569,2.312,1570,2.312,1571,2.312,1572,2.895,1573,2.895,1574,2.895,1575,3.515,1576,1.904,1577,2.312,1578,2.312,1579,2.312,1580,2.312,1581,2.312,1582,2.312,1583,3.515,1584,2.895,1585,2.312,1586,2.312,1587,2.312,1588,2.312,1589,2.312,1590,2.312,1591,2.312,1592,2.312,1593,2.312]],["keywords/template:templates/docs/route-handlers/functions",[]],["title/template:templates/docs/route-handlers/shorthands",[43,1.622]],["text/template:templates/docs/route-handlers/shorthands",[1,0.706,2,1.782,11,0.958,13,0.567,14,0.499,15,0.996,18,3.159,20,0.795,23,0.866,24,0.857,26,0.345,35,3.395,38,1.725,40,0.513,42,2.885,43,3.023,49,2.406,50,0.936,65,1.22,68,0.795,75,1.304,89,1.22,91,1.329,95,2.119,102,0.82,104,1.385,105,0.505,111,0.759,119,1.178,138,1.13,139,1.551,143,1.037,145,1.392,146,1.329,148,1.392,154,1.907,157,1.22,158,0.795,167,1.455,173,0.958,179,1.78,180,1.618,182,1.329,183,0.701,190,0.648,205,1.879,206,0.863,221,2.256,224,2.315,245,1.383,249,1.321,250,1.618,252,2.573,266,0.886,268,1.764,285,1.626,290,1.78,291,2.9,292,1.499,294,1.329,302,2.007,305,1.037,330,2.119,335,0.648,338,1.097,354,2.071,388,3.511,395,1.329,399,1.037,411,2.573,414,1.455,445,1.624,455,1.037,456,1.78,457,1.124,459,1.764,462,1.764,467,2.315,474,1.124,479,2.9,493,1.78,524,3.958,531,1.124,532,3.157,552,3.349,553,1.329,578,1.78,582,1.78,604,1.22,605,1.78,624,1.455,655,1.907,669,3.159,676,1.455,693,1.78,698,2.317,702,1.602,704,1.602,711,5.028,724,3.021,749,2.317,764,2.317,787,2.007,818,1.921,821,1.602,844,2.698,873,1.499,876,3.659,878,1.455,880,2.573,881,2.573,903,2.9,914,1.78,925,1.455,929,1.78,933,1.78,946,2.9,957,2.007,958,2.007,968,2.315,969,3.731,974,2.469,984,2.102,1006,1.602,1079,2.469,1112,3.933,1128,3.958,1146,1.78,1263,2.007,1264,2.007,1265,2.573,1273,2.007,1282,2.007,1379,4.308,1393,3.933,1502,2.317,1510,2.317,1521,2.317,1522,3.349,1572,2.317,1573,2.317,1574,3.349,1576,2.317,1584,5.202,1594,2.813,1595,2.813,1596,2.813,1597,5.963,1598,2.813,1599,2.813,1600,4.066,1601,2.813,1602,4.066,1603,5.783,1604,2.813,1605,4.066,1606,5.231,1607,2.813,1608,4.066,1609,6.105,1610,2.813,1611,2.813,1612,2.813,1613,2.813,1614,4.775,1615,2.813,1616,2.813,1617,2.813,1618,2.813,1619,2.813,1620,2.813,1621,2.813,1622,2.813,1623,2.813,1624,2.813,1625,2.813,1626,4.066,1627,2.813,1628,2.813]],["keywords/template:templates/docs/route-handlers/shorthands",[]],["title/template:templates/docs/testing/acceptance-tests",[106,0.502,413,1.213]],["text/template:templates/docs/testing/acceptance-tests",[1,0.695,2,0.931,4,1.902,6,2.96,13,0.593,14,0.673,15,0.49,16,0.796,17,1.556,20,0.534,22,2.25,23,0.409,24,0.843,26,0.576,29,1.395,40,0.593,41,1.729,42,1.291,44,1.091,48,0.861,50,1.081,52,0.796,53,1.556,55,0.737,57,1.356,58,0.931,60,2.266,63,1.949,67,0.714,68,0.534,69,2.058,70,0.861,79,1.266,81,1.254,82,1.729,84,1.007,85,2.519,87,1.356,88,0.681,89,1.185,91,1.291,94,1.185,97,1.48,101,1.369,105,1.108,106,1.273,108,1.369,112,1.731,113,0.931,118,1.413,119,0.845,132,1.185,138,1.072,141,2.438,145,1.723,150,0.737,152,2.519,154,1.091,156,2.96,157,1.726,158,0.918,164,1.254,173,0.931,176,1.729,178,1.007,186,1.729,190,1.081,194,1.291,203,2.25,206,0.845,210,0.931,222,1.091,225,1.949,226,1.626,244,0.861,245,0.992,247,2.25,248,1.413,249,0.845,250,1.504,253,2.668,260,2.839,263,1.091,266,1.254,272,1.59,274,1.291,275,1.48,277,0.931,296,2.266,300,1.007,312,1.467,330,2.013,331,2.438,344,1.291,346,1.556,349,1.556,351,1.875,371,1.59,394,1.185,395,2.591,397,3.868,398,1.185,399,1.007,400,1.729,401,0.931,403,1.729,404,1.185,408,1.291,413,2.037,416,2.428,422,1.949,423,1.949,436,1.291,453,1.556,457,1.091,460,1.881,462,2.788,463,1.804,464,1.875,469,2.438,472,0.931,474,1.091,475,2.519,477,2.674,482,3.123,483,2.563,484,2.627,485,2.965,493,1.729,494,1.868,500,1.413,511,1.291,513,2.058,514,1.59,515,1.007,522,1.729,529,2.25,531,1.091,547,1.949,548,1.729,556,1.949,579,1.185,583,1.729,617,3.908,620,2.266,623,1.413,624,1.413,629,1.729,638,1.949,641,1.413,653,1.291,655,1.091,658,1.556,665,1.185,670,2.058,674,3.279,702,2.674,726,2.674,728,1.185,730,2.519,731,3.68,733,2.519,734,2.972,735,3.35,736,3.868,738,1.291,739,2.25,740,1.949,745,1.949,766,1.949,768,2.25,775,1.556,781,1.949,785,2.058,786,1.729,821,2.266,823,2.25,830,2.058,837,2.25,841,1.007,847,1.291,892,1.729,953,3.279,980,1.949,1100,2.25,1106,1.949,1214,1.949,1215,1.729,1216,2.058,1217,1.556,1218,1.949,1219,1.729,1220,1.949,1221,1.729,1222,1.949,1226,3.68,1227,1.949,1228,2.25,1250,2.25,1270,1.949,1272,3.265,1290,2.25,1411,2.25,1479,2.25,1530,1.949,1565,2.25,1629,3.981,1630,2.732,1631,2.25,1632,2.732,1633,2.732,1634,2.732,1635,3.981,1636,2.732,1637,2.732,1638,2.25,1639,3.981,1640,2.732,1641,2.732,1642,4.696,1643,2.732,1644,4.696,1645,2.732,1646,2.732,1647,2.732,1648,2.25,1649,2.732,1650,2.732,1651,2.732,1652,2.732,1653,2.732,1654,2.732,1655,3.279,1656,3.981,1657,2.25,1658,2.732,1659,1.949,1660,3.981,1661,1.949,1662,2.732,1663,2.732,1664,2.732,1665,2.732,1666,2.732,1667,2.732,1668,3.981,1669,3.981,1670,3.981,1671,2.732,1672,2.732,1673,2.519]],["keywords/template:templates/docs/testing/acceptance-tests",[]],["title/template:templates/docs/testing/assertions",[141,1.767]],["text/template:templates/docs/testing/assertions",[1,0.695,2,1.566,13,0.515,14,0.727,15,1.162,16,1.34,17,1.907,23,0.846,24,0.601,26,0.411,32,1.338,38,1.721,40,0.6,47,1.235,50,1.364,51,2.12,52,0.976,55,1.524,56,0.976,59,1.583,75,0.835,79,1.24,83,1.907,88,0.835,92,2.618,94,1.994,95,1.566,97,1.055,98,2.759,100,2.759,103,2.618,104,1.141,105,0.825,106,1.063,108,0.976,112,1.235,113,1.141,119,0.711,122,2.389,123,3.787,127,2.759,128,1.994,129,1.907,130,2.389,131,3.28,132,1.994,133,2.389,138,1.026,141,3.26,142,2.713,143,2.083,144,2.097,145,1.34,148,0.976,150,1.65,152,3.576,154,1.338,156,2.715,158,1.196,164,1.055,183,0.835,206,0.711,209,2.173,210,1.141,214,2.12,219,1.453,220,1.141,226,1.449,250,1.34,252,2.12,254,1.907,263,2.257,265,2.759,277,1.141,313,1.583,335,0.771,349,1.907,366,1.583,409,1.907,414,1.732,416,1.732,427,2.759,428,2.759,452,1.583,454,1.235,463,1.449,470,1.141,472,1.141,477,3.218,479,4.031,480,3.748,482,1.907,483,2.277,484,2.277,485,3.06,495,1.907,498,5.161,506,2.097,511,1.583,513,1.732,515,1.695,526,2.12,530,2.759,535,3.28,536,3.745,537,1.836,539,2.12,549,1.732,557,2.91,563,2.759,579,1.453,640,2.389,642,1.583,655,2.097,660,2.67,664,1.732,670,1.732,673,1.907,735,3.28,738,1.583,741,1.732,751,2.389,775,1.907,778,2.759,786,2.12,841,1.235,853,2.12,873,1.235,878,1.732,894,2.12,921,2.759,974,1.732,1006,1.907,1022,2.759,1079,1.732,1168,2.759,1177,2.12,1186,2.759,1222,3.28,1226,3.28,1247,2.759,1271,2.759,1306,2.389,1464,2.389,1638,2.759,1648,2.759,1659,2.389,1661,3.28,1674,3.35,1675,3.35,1676,5.251,1677,3.35,1678,3.35,1679,5.652,1680,3.35,1681,3.35,1682,3.35,1683,3.35,1684,5.251,1685,3.35,1686,3.35,1687,3.35,1688,3.35,1689,3.35,1690,3.35,1691,3.35,1692,3.35,1693,3.35,1694,3.35,1695,3.35,1696,3.35,1697,3.35,1698,3.35,1699,3.35,1700,3.35,1701,3.35,1702,3.35,1703,3.35,1704,2.759]],["keywords/template:templates/docs/testing/assertions",[]],["title/template:templates/docs/testing/integration-and-unit-tests",[106,0.401,785,1.155,1673,1.413]],["text/template:templates/docs/testing/integration-and-unit-tests",[1,0.708,4,1.381,13,0.626,14,0.792,15,0.997,18,2.549,20,0.492,23,0.974,24,0.452,26,0.309,29,1.526,34,1.092,38,0.679,40,0.642,42,1.189,44,1.005,47,0.928,50,0.863,55,1.43,56,0.734,58,1.806,67,0.452,68,0.732,69,1.301,79,1.207,81,1.41,84,0.928,85,2.371,88,1.116,95,1.276,97,0.793,101,0.734,102,0.734,104,1.276,105,0.951,106,1.147,111,1.01,113,1.276,119,0.951,138,0.875,141,2.505,142,1.496,143,0.928,150,1.337,158,0.732,173,1.276,180,0.734,182,1.189,190,0.58,194,1.189,195,1.77,197,1.092,206,1.18,207,2.118,221,1.189,222,1.005,226,0.793,238,1.092,245,1.236,249,0.951,250,0.734,253,2.564,254,1.433,266,0.793,272,1.005,274,2.343,277,0.857,285,1.525,300,1.381,302,1.795,310,1.301,312,1.828,328,1.77,335,0.58,338,1.01,345,1.433,391,1.433,398,1.092,404,1.092,405,1.795,406,2.073,413,1.941,448,3.442,457,1.005,459,1.092,463,1.967,464,1.496,469,1.189,470,0.857,471,0.928,474,1.005,477,2.133,483,2.411,484,2.411,485,3.094,494,1.276,499,3.537,503,2.073,506,1.005,511,1.77,514,1.496,515,0.928,521,1.433,532,1.301,537,1.496,539,1.592,549,1.301,585,1.795,605,3.138,629,1.592,634,1.092,639,1.795,728,1.941,733,1.592,759,1.433,781,1.795,785,1.937,841,0.928,842,1.592,843,1.433,847,2.115,867,1.795,870,5.143,871,2.073,873,1.65,887,2.073,909,1.592,941,2.073,1035,1.592,1150,2.073,1179,2.073,1215,3.138,1216,2.874,1217,2.824,1219,3.517,1221,3.517,1227,1.795,1248,1.795,1249,2.073,1272,3.138,1296,3.687,1346,2.073,1382,2.073,1392,1.795,1428,3.086,1430,2.073,1464,1.795,1514,2.073,1530,1.795,1561,2.073,1655,2.073,1657,2.073,1659,3.537,1661,3.537,1673,2.371,1705,2.517,1706,4.959,1707,4.959,1708,5.559,1709,5.758,1710,5.559,1711,5.559,1712,5.758,1713,3.747,1714,3.747,1715,2.517,1716,3.747,1717,2.517,1718,2.517,1719,2.517,1720,2.517,1721,2.517,1722,6.154,1723,5.758,1724,2.517,1725,2.517,1726,4.959,1727,4.959,1728,4.959,1729,2.517,1730,2.517,1731,3.747,1732,4.477,1733,2.517,1734,3.747,1735,3.747,1736,4.477,1737,3.747,1738,3.747,1739,2.517,1740,3.747,1741,3.747,1742,2.517,1743,2.517,1744,3.747,1745,2.517,1746,2.517,1747,2.517,1748,2.517,1749,2.517,1750,2.517,1751,2.517,1752,2.517,1753,2.517,1754,3.747,1755,4.477,1756,2.517,1757,2.517,1758,2.517,1759,4.477,1760,2.517,1761,2.517]],["keywords/template:templates/docs/testing/integration-and-unit-tests",[]],["title/template:templates/docs/testing/setup-mirage",[106,0.401,285,0.761,1216,1.155]],["text/template:templates/docs/testing/setup-mirage",[1,0.708,13,0.519,23,0.621,26,0.509,29,1.578,40,0.603,68,1.036,71,2.626,75,1.035,77,1.8,78,1.657,95,1.414,96,1.414,101,1.21,105,1.048,106,1.251,111,1.119,116,2.74,134,2.96,135,2.626,136,3.176,137,2.626,138,0.811,139,1.321,140,2.626,158,0.811,171,1.961,190,1.344,219,1.8,244,1.307,245,1.035,246,5.067,249,1.125,253,2.146,266,1.307,275,1.307,285,1.805,306,3.418,333,2.96,334,2.626,335,0.956,366,2.504,401,1.414,413,1.8,443,2.626,464,1.657,465,2.363,466,2.363,483,2.532,484,2.532,515,2.152,532,2.146,623,2.146,704,2.363,734,3.695,785,2.146,841,1.529,1181,2.96,1214,4.165,1215,3.695,1216,3.286,1217,3.324,1218,4.165,1219,3.695,1220,4.165,1221,3.695,1384,3.418,1532,3.418,1533,3.418,1631,4.809,1673,2.626,1762,4.15,1763,4.15,1764,4.15,1765,4.15]],["keywords/template:templates/docs/testing/setup-mirage",[]],["title/template:templates/index",[102,1.09]],["text/template:templates/index",[1,0.515,13,0.515,48,1.657,57,1.792,58,1.792,68,1.028,77,2.281,81,1.657,102,1.533,106,1.099,108,1.533,118,2.719,120,4.332,143,1.938,158,1.197,167,2.719,226,1.657,249,1.117,335,1.211,391,2.995,413,2.281,494,1.792,512,3.328,723,3.328,741,2.719,761,3.328,767,3.328,829,4.332,1042,3.328,1079,2.719,1193,3.752,1196,4.332,1230,4.332,1766,5.26,1767,5.26,1768,5.26,1769,5.26,1770,5.26]],["keywords/template:templates/index",[]],["title/template:templates/not-found",[1771,3.079]],["text/template:templates/not-found",[272,2.228,665,2.419,1180,3.53,1704,4.595,1771,4.595,1772,5.579]],["keywords/template:templates/not-found",[]]],"invertedIndex":[["",{"_index":1,"title":{},"text":{"template:blog/detail":{"position":[[1,1]]},"template:docs/advanced/customizing-the-inflector":{"position":[[252,1],[264,1],[311,2],[592,2],[942,2],[1071,3],[1075,1],[1093,1],[1116,2],[1211,1],[1228,1],[1301,2],[1588,2]]},"template:docs/advanced/environment-options":{"position":[[116,2],[141,3],[161,3],[179,1],[205,1],[207,1],[223,2],[226,1],[549,2],[574,3],[594,3],[612,1],[638,1],[640,1],[656,2],[659,1],[688,2],[713,3],[733,3],[752,1],[778,1],[780,1],[797,2],[800,1],[1080,1],[1098,1],[1100,1],[1142,1],[1191,2],[1202,2],[1239,1],[2272,2],[2297,3],[2325,1],[2327,1],[2353,2],[2870,2],[2895,3],[2923,1],[2925,1],[2958,2]]},"template:docs/advanced/mocking-guids":{"position":[[794,1],[810,1],[852,1],[868,1],[879,1],[892,1],[894,2],[945,1],[956,1],[996,1],[1003,1],[1016,1],[1051,1],[1053,2],[1139,1],[1163,1],[1217,1],[1237,1],[1239,2],[1289,1],[1309,1],[1311,1]]},"template:docs/advanced/server-configuration":{"position":[[1316,1],[2980,2],[3017,1],[3043,1],[3077,1],[3092,1],[3143,1],[3161,1],[3163,1],[3184,1],[3233,2],[3245,1],[3247,2],[3265,1],[3274,2],[3299,2],[3302,2],[3339,1],[3341,2],[3395,1],[3421,1],[3455,1],[3470,1],[3521,1],[3539,1],[3541,1],[3562,1],[3611,2],[3622,2],[3659,1],[3679,1],[3681,2],[3699,1],[3708,2],[3733,1],[4858,2],[4954,1],[5007,1],[5041,1],[5056,1],[5107,1],[5125,1],[5127,1],[5148,1],[5197,2],[5268,2],[5305,1],[5325,1],[5327,2],[5345,1],[5354,2],[5379,1]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[394,2],[397,1],[399,2],[430,1],[465,1],[490,1],[496,1],[503,1],[665,3]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1274,1],[1292,1],[1294,1],[1324,1],[1348,1],[1360,1],[1362,1],[1364,2],[1399,2],[1417,2],[1432,1],[1506,2],[1707,1],[1709,1],[1746,1],[1769,1],[1791,2],[1837,1],[1854,1],[1897,1],[1917,1],[1919,2],[1967,1],[2079,1],[2081,2],[2115,1]]},"template:docs/data-layer/database":{"position":[[724,2],[780,1],[811,1],[813,1],[837,2],[840,1],[861,2],[864,1],[883,2],[886,1],[888,3],[892,1],[1005,2],[1008,1],[1035,3],[1103,1],[1105,1],[1138,2],[1141,1],[1171,2],[1174,1],[1202,1],[1204,1],[1580,2],[1655,1],[1868,3]]},"template:docs/data-layer/factories":{"position":[[823,2],[856,1],[864,1],[913,3],[1061,2],[1124,1],[1150,1],[1388,2],[1409,1],[1419,1],[1421,1],[1431,1],[1433,1],[1435,1],[1552,2],[1615,1],[1640,1],[1708,3],[1712,1],[1747,1],[1757,1],[1759,1],[1836,1],[1838,1],[1840,1],[2298,2],[2334,1],[2344,1],[2395,3],[2462,2],[2498,1],[2508,1],[2580,3],[2695,1],[2705,1],[2707,1],[2739,1],[2741,1],[2743,1],[2788,2],[2824,1],[2834,1],[2894,1],[2917,1],[2919,3],[3185,1],[3195,1],[3197,1],[3225,2],[3228,1],[3256,2],[3259,1],[3287,2],[3290,1],[3318,2],[3321,1],[3349,1],[3351,1],[3353,1],[3402,2],[3438,1],[3448,1],[3474,1],[3482,1],[3549,1],[3572,2],[3589,1],[3638,2],[3650,1],[3663,1],[3665,1],[3695,2],[3714,1],[3732,1],[3734,3],[3868,1],[3878,1],[3880,1],[3951,2],[3954,1],[4024,2],[4027,1],[4097,2],[4100,1],[4171,2],[4174,1],[4244,2],[4247,1],[4249,1],[4663,2],[4718,2],[4743,1],[4798,1],[4800,2],[4884,1],[4908,3],[4912,2],[4937,1],[4997,1],[5347,2],[5382,1],[5392,1],[5418,1],[5426,1],[5491,1],[5523,2],[5537,1],[5566,2],[5588,1],[5590,3],[5675,1],[5677,1],[5738,1],[5740,1],[5805,1],[5807,1],[5866,1],[5868,1],[6044,1],[6095,3],[6162,3],[6233,1],[6261,1],[6289,3],[6316,1],[6357,3],[6549,1],[6589,3],[6719,2],[6722,1],[6754,1],[6777,2],[6780,1],[6814,1],[6821,3],[6825,3],[6829,3],[7587,2],[7642,3],[7646,2],[7719,3],[7876,2],[7962,1],[8006,3],[8010,1],[8012,3],[8758,1],[8824,1],[8840,3],[9306,2],[9392,1],[9410,1],[9454,3],[9458,1],[9460,1],[9462,3],[9535,1],[9551,3],[10057,2],[10092,1],[10109,1],[10255,2],[10258,3],[10666,2],[10701,1],[10718,1],[10864,3],[10903,2],[10906,3],[10994,1],[11057,1],[11288,1],[11313,3],[11511,2],[11546,1],[11563,1],[11684,1],[11718,1],[11725,3],[11729,1],[11731,2],[11734,3],[12321,2],[12356,1],[12366,1],[12443,1],[12461,1],[12505,3],[12509,1],[12511,1],[12513,3],[12574,2],[12609,1],[12632,1],[12703,3],[12829,2],[12864,1],[12894,1],[12983,2],[12986,3],[13075,2],[13110,1],[13140,1],[13236,1],[13253,2],[13256,2],[13259,3],[13561,2],[13624,1],[13658,1],[13876,2],[13937,1],[13961,1],[13977,3],[13981,1],[14042,2],[14201,1],[14203,1],[14234,1],[14365,2],[14429,2],[14455,1],[14457,2],[14472,2],[14496,1],[14530,1],[14558,1],[15269,1],[15367,3],[15371,3],[15479,1],[16326,1],[16340,1],[16377,1],[16401,1],[16411,3],[16437,1],[16491,3],[16574,3],[16998,1],[17022,1],[17070,3],[17153,3]]},"template:docs/data-layer/fixtures":{"position":[[359,2],[422,1],[456,1],[458,1],[481,2],[484,1],[507,2],[510,1],[541,1],[543,1],[545,3],[549,1],[836,2],[883,1],[885,1],[933,2],[936,1],[982,2],[985,1],[1046,2],[1049,1],[1100,2],[1103,1],[1153,2],[1156,1],[1206,2],[1209,1],[1256,2],[1259,1],[1309,2],[1312,1],[1359,2],[1362,1],[1415,2],[1418,2],[1917,2],[1980,1],[2005,1],[2185,2],[2248,1],[2294,2],[2341,1],[2546,1],[2655,3],[2659,3],[2742,1],[2858,2],[2913,3],[2917,2],[2998,3],[3060,1],[3106,3],[3184,3],[3260,2],[3280,1],[3289,1],[3291,1],[3324,1],[3326,2],[3336,1],[3338,1],[3401,1],[3403,1],[3405,1],[3944,2],[3987,1],[3989,1],[4022,1],[4024,2],[4027,2],[4070,1],[4072,1],[4135,1],[4137,2],[4308,2],[4363,1],[4382,3],[4386,2],[4467,3],[4549,2],[4592,1],[4594,1],[4614,1],[4620,2],[4645,1],[4647,2],[4650,2],[4693,1],[4695,1],[4758,1],[4760,2]]},"template:docs/data-layer/models":{"position":[[882,2],[919,1],[927,1],[1140,1],[1152,1],[1217,3],[1286,2],[1342,1],[1398,3],[1402,1],[1657,2],[1713,1],[1743,1],[2078,2],[2081,1],[2114,3],[2255,3],[2307,3],[2547,1],[2607,3],[2635,1]]},"template:docs/data-layer/orm":{"position":[[454,2],[464,1],[474,1],[476,1],[509,2],[512,1],[542,2],[545,1],[573,1],[575,1],[577,1],[716,1],[904,2],[925,1],[933,1],[972,1],[996,1],[998,1],[1000,1],[1018,1],[1135,2],[1138,1],[1150,1],[1201,1],[1209,1],[1253,1],[1274,1],[1276,1],[1278,2],[1281,3],[1354,1],[1437,1],[1602,2],[1605,1],[1617,1],[1675,1],[1677,1],[1685,1],[1729,1],[1731,1],[1733,1],[1735,2],[1769,2],[1776,4],[1800,2],[1803,1],[1820,1],[1834,3],[1856,3],[2069,1],[2170,1],[2234,1],[2242,1],[2281,1],[2305,2],[2323,1],[2336,1],[2344,1],[2371,1],[2373,1],[2375,1],[2377,1],[2379,1],[3231,2],[3264,1],[3272,1],[3321,3],[3887,2],[3890,1],[3899,1],[3951,3],[4359,2],[4403,1],[4423,1],[4484,3],[4552,1],[4560,1],[4599,1],[4673,1],[4675,1],[4677,1],[4981,2],[5014,1],[5033,1],[5112,3],[5163,2],[5197,1],[5205,1],[5254,3],[5613,1],[5621,1],[5660,1],[5734,2],[5752,1],[5764,1],[5772,1],[5798,1],[5800,1],[5802,1],[5804,2],[5817,1],[5819,1],[5858,1],[5886,1],[5888,1],[5890,1],[5892,1],[6204,1],[6248,2],[6251,1],[6253,1],[6262,1],[6283,1],[6316,1],[6318,3],[6322,1],[6806,1],[6808,1],[6845,1],[6847,2],[6858,1],[6860,1],[6960,1],[6962,1],[6964,3],[7272,1],[7323,3],[7439,3],[7667,1],[7677,1],[7679,1],[7749,1],[7751,2],[7762,1],[7764,1],[7796,2],[7799,1],[7830,1],[7832,1],[7834,1],[7897,1],[7964,3],[8039,3],[8043,3],[8086,1],[8096,1],[8098,1],[8168,1],[8170,2],[8181,1],[8183,1],[8215,2],[8218,1],[8249,1],[8251,1],[8253,1]]},"template:docs/data-layer/relationships":{"position":[[551,2],[588,1],[607,1],[684,3],[983,2],[1006,1],[1011,2],[1056,2],[1091,1],[1135,2],[1187,2],[1854,2],[1891,1],[1908,1],[1985,3],[2149,2],[2182,1],[2192,2],[2239,2],[2286,1],[2310,2],[2366,2],[2420,2],[2639,2],[2676,1],[2704,1],[2820,3],[3067,2],[3133,3],[3137,2],[3203,3],[3699,2],[3761,3],[3765,2],[3866,3],[4089,2],[4151,3],[4155,2],[4227,1],[4250,3],[4282,1],[4298,2],[4301,3],[4486,1],[4506,1],[4647,2],[4745,2],[4748,3],[4752,2],[4829,3],[4833,2],[4908,3],[5167,1],[5206,3],[5243,1],[5266,3],[5304,1],[5327,3],[5331,2],[5364,2],[5367,1],[5394,1],[5396,2],[5428,1],[5430,1],[5455,2],[5506,2],[5594,2],[5597,3],[5601,2],[5652,3],[5656,2],[5709,3],[5722,1],[5758,3],[5785,1],[5793,3],[5823,1],[5831,3],[5835,2],[5860,2],[5863,1],[5865,1],[5886,2],[5889,1],[5912,2],[5915,3],[5919,1],[5921,2],[5945,1],[5947,1],[5949,1],[5972,2],[5975,3],[5979,2],[6007,1]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1164,1],[1186,1],[1281,3],[1595,1],[1617,1],[1700,1],[1830,1],[1832,3],[1930,1]]},"template:docs/data-layer/serializers/index":{"position":[[172,2],[175,1],[223,3],[257,2],[274,1],[282,1],[322,1],[346,1],[348,1],[350,1],[2247,2],[2291,1],[2311,1],[2372,3],[2833,3],[3242,2],[3259,1],[3298,1],[3367,1],[3380,1],[3406,1],[3417,1],[3498,1],[3523,1],[3525,3],[4095,1],[4115,1],[4207,3],[4276,1],[4284,1],[4324,1],[4348,2],[4366,1],[4384,1],[4392,1],[4394,1],[4420,2],[4423,1],[4449,2],[4452,1],[4478,2],[4481,1],[4483,1],[4485,1],[4487,1],[4489,1],[4696,2],[4837,1],[4846,1],[4864,1],[4914,1],[4916,2],[4919,1],[4921,3],[4989,1],[4997,1],[5037,1],[5061,2],[5079,1],[5097,1],[5106,1],[5146,1],[5148,1],[5150,1],[5152,1],[5154,1],[5616,1],[5709,2],[5775,1],[5788,1],[5820,1],[5861,1],[5891,3],[6184,2],[6250,1],[6263,1],[6295,1],[6363,1],[6393,3],[6978,1]]},"template:docs/getting-started/installation":{"position":[[855,1]]},"template:docs/getting-started/overview":{"position":[[377,2],[415,1],[432,1],[461,2],[464,2],[467,1],[476,1],[484,1],[486,1],[523,1],[546,1],[548,2],[551,1],[588,1],[608,1],[610,2],[613,1],[650,1],[668,1],[670,2],[673,1],[675,2],[678,3],[682,1],[856,1],[1924,1],[1988,2],[2021,1],[2029,1],[2078,3],[2403,2],[2406,1],[2436,3],[2933,2],[2958,1],[2960,1],[3259,1],[3440,2],[3476,1],[3486,1],[3546,1],[3569,2],[3595,2],[3605,1],[3615,1],[3631,1],[3671,1],[3678,1],[3684,1],[3690,1],[3697,2],[3716,3],[3754,1],[3756,1],[3804,2],[3807,1],[3855,2],[3858,2],[3861,3],[3865,1],[4243,2],[4306,1],[4340,2],[4474,2],[4499,1],[4501,1],[4538,1],[4586,1],[4588,2],[4591,1],[4628,1],[4676,1],[4678,2],[4681,2],[4684,3],[4688,1],[4923,2],[4965,1],[4988,1],[5017,1],[5031,1],[5090,1],[5124,1],[5228,1],[5347,3],[5351,3],[5355,3],[5489,1],[5501,1],[5531,1],[5555,3],[5642,3],[6060,2],[6093,1],[6110,1],[6182,3],[6186,2],[6225,1],[6244,1],[6312,3],[6486,2],[6489,1],[6501,1],[6568,3],[6678,1],[6703,1],[6741,1],[6772,1],[6802,3],[6835,1],[6859,3],[6892,1],[6919,2],[6922,1],[6924,3],[6993,3],[6997,3],[7450,2],[7467,1],[7475,1],[7512,1],[7536,1],[7538,1],[7540,1],[7717,2],[7734,1],[7744,1],[7775,1],[7777,1],[8166,2],[8210,1],[8223,1],[8299,1],[8325,2],[8353,1],[8379,1],[8381,3],[8519,2],[8557,1],[8570,1],[8633,1],[8649,1],[8651,3],[8655,2],[8693,1],[8737,2],[8740,1],[8788,3],[8792,1],[8893,1],[8902,1],[8933,2],[8952,1],[8954,1],[9006,2],[9009,1],[9055,2],[9058,3],[9062,1],[9064,1],[9412,2],[9415,1],[9446,3],[10302,2],[10555,2],[10727,1]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[98,1],[148,1],[447,2],[462,1],[470,1],[509,1],[517,1],[969,1],[996,1],[1030,1],[1045,1],[1097,1],[1115,1],[1117,1],[1138,1],[1187,2],[1198,2],[1235,1],[1237,2],[1313,1],[1315,1],[2489,1],[3093,1],[3212,1],[3221,1],[3238,1],[3257,1],[3266,1],[3276,1],[3295,1],[3600,2],[3987,1],[3989,1],[4065,3],[4069,1],[4153,3],[4157,1],[4231,1],[4233,1],[4308,3],[4312,1],[4328,1],[4330,1],[4379,2],[4382,1],[4384,1],[4405,1],[4426,1],[4515,1],[4517,1],[4561,1],[4609,3],[4613,1],[5122,2],[5202,2],[5218,1],[5232,1],[6239,1],[7805,1],[7807,1],[7818,1],[7852,1],[7854,2],[7926,1],[7965,1],[7980,2],[7998,1],[8009,1],[8017,1],[8042,1],[8044,1],[8046,1],[8048,1],[8452,1],[9559,2],[9575,1],[9583,1],[9621,1],[9623,3],[9627,2],[9645,1],[9655,1],[9663,1],[9688,1],[9690,1],[9692,1],[9694,1],[9696,1],[10212,2],[10228,1],[10236,1],[10274,1],[10276,3],[10280,2],[10298,1],[10308,1],[10317,1],[10343,1],[10345,1],[10347,1],[10349,1],[10351,1],[10950,2],[10994,1],[11014,1],[11114,3],[11413,1],[11651,2],[11685,1],[11693,1],[11753,2],[11785,1],[11804,1],[11881,3],[12217,2],[12251,1],[12268,1],[12342,3],[12346,2],[12378,1],[12397,1],[12474,3],[12887,2],[13429,1],[14254,4],[14586,1],[15130,5],[15519,1],[15544,2],[15559,3],[15580,1],[15604,2],[15618,3],[15767,1],[15800,2],[15815,1],[15848,1],[15850,3],[15919,1],[15952,2],[15966,1],[15999,1],[16001,3],[16616,1],[16624,1],[16835,1],[18041,1],[18043,2],[18059,3],[18398,2],[18410,1],[18412,2],[18428,3]]},"template:docs/route-handlers/functions":{"position":[[193,2],[233,2],[236,2],[239,1],[248,1],[289,2],[292,3],[550,2],[553,2],[556,1],[558,3],[562,3],[587,2],[590,2],[593,1],[595,3],[599,3],[629,2],[632,2],[635,1],[637,3],[641,3],[669,2],[672,2],[675,1],[677,3],[681,3],[912,2],[952,2],[955,2],[958,1],[967,1],[1008,2],[1011,2],[1014,1],[1029,3],[1243,2],[1289,1],[1306,1],[1327,1],[1355,2],[1358,2],[1361,1],[1370,1],[1411,2],[1414,3],[1445,2],[1448,2],[1451,1],[1477,2],[1480,1],[1495,3],[1499,1],[1681,1],[1697,1],[1706,2],[1709,3],[1713,3],[1968,2],[1971,1],[2001,3],[2290,2],[2293,1],[2302,1],[2354,3],[2528,2],[2531,1],[2543,1],[2620,3],[2624,3],[3078,2],[3081,1],[3090,1],[3143,2],[3563,1],[3576,1],[3608,1],[3644,1],[3646,1],[3656,2],[3672,3],[3865,1],[3878,1],[3910,1],[3962,1],[3964,1],[3974,2],[3990,3],[4196,2],[4211,1],[4219,1],[4248,1],[4320,2],[4338,1],[4346,1],[4354,1],[4377,1],[4379,1],[4381,1],[4383,1],[4385,1],[4487,1],[4499,1],[4532,2],[4541,1],[4543,1],[4619,1],[4621,2],[4659,3],[5383,2],[5386,2],[5389,1],[5391,3],[5395,3],[5708,1],[5738,1],[5798,1],[5833,1],[5965,1],[5977,1],[6016,2],[6019,3],[6023,3],[6459,2],[6486,1],[6497,1],[6542,1],[6592,1],[6604,1],[6662,1],[6701,1],[6708,1],[6735,1],[6752,2],[6755,1],[6790,3],[6794,1],[6796,3],[6800,1],[6920,4],[7084,4],[7204,2],[7239,1],[7263,2],[7351,4]]},"template:docs/route-handlers/shorthands":{"position":[[306,2],[309,1],[339,3],[839,2],[842,1],[854,1],[931,3],[1272,2],[1308,2],[1375,2],[1428,2],[1473,2],[1476,1],[1508,2],[1536,3],[1558,2],[1598,2],[1668,2],[1715,2],[1773,2],[1776,1],[1785,1],[1839,2],[1867,3],[1940,2],[1975,1],[1992,3],[2027,1],[2044,3],[2048,2],[2084,2],[2096,2],[2108,2],[2111,1],[2121,1],[2175,2],[2203,3],[2244,2],[2281,2],[2348,2],[2395,2],[2458,1],[2470,1],[2541,3],[2850,2],[2924,2],[2996,2],[3043,2],[3111,1],[3120,1],[3151,1],[3231,3],[3540,2],[3580,2],[3650,2],[3697,2],[3755,2],[3758,1],[3767,1],[3824,3],[3870,2],[3936,2],[3976,2],[3988,2],[4000,2],[4003,1],[4012,1],[4045,1],[4114,3],[4325,2],[4377,2],[4502,2],[4667,1],[4675,1],[4693,1],[4695,3],[4699,2],[4863,1],[4873,1],[4884,1],[4886,3],[4890,2],[5161,1],[5178,3],[5182,2],[5501,1],[5560,1],[5572,30],[5609,1],[5638,1],[5673,1],[5705,1],[5755,1]]},"template:docs/testing/acceptance-tests":{"position":[[658,1],[681,1],[703,1],[712,1],[726,1],[785,1],[819,1],[850,1],[917,1],[919,2],[932,3],[936,3],[1740,1],[1839,3],[1843,3],[2472,2],[2508,1],[2518,1],[2591,3],[3097,1],[3196,3],[3200,3],[3280,1],[3292,1],[3322,1],[3346,3],[3428,3],[3715,1],[3717,2],[3765,2],[3790,2],[3842,3],[3846,3],[4246,1],[4279,2],[4282,2],[4285,2],[4296,1],[4330,1],[4332,3],[4501,3],[5258,2],[5313,1],[5381,2],[5534,1],[5620,3],[5624,3],[5821,1],[5847,2],[5850,3],[5854,3]]},"template:docs/testing/assertions":{"position":[[1043,1],[1074,1],[1101,2],[1206,2],[1281,2],[1405,3],[1727,1],[1745,1],[1773,1],[1795,3],[1808,1],[2035,3],[2578,2],[2618,1],[2642,1],[2660,3],[2672,1],[2698,1],[2700,1],[2722,2],[2725,1],[2727,1],[3098,1],[3135,1],[3153,3],[3192,1],[3209,3],[3265,2],[3331,3],[3335,2],[3381,1],[3402,1],[3519,1],[3547,3],[3551,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[405,1],[414,1],[437,1],[458,1],[487,1],[501,1],[561,1],[573,1],[604,1],[705,1],[735,1],[759,3],[871,3],[931,3],[935,3],[1131,1],[1140,1],[1163,1],[1184,1],[1213,1],[1227,1],[1287,1],[1299,1],[1330,1],[1436,1],[1470,2],[1473,2],[1476,2],[1487,1],[1512,4],[1521,2],[1660,3],[1715,3],[1719,3],[2055,1],[2067,1],[2099,1],[2202,1],[2204,2],[2276,3],[2338,2],[2368,3],[2372,3],[2523,1],[2535,1],[2567,1],[2670,1],[2672,2],[2675,2],[2705,1],[2737,1],[2758,3],[2820,3],[2882,2],[2912,3],[2916,3],[3278,1],[3530,2],[3533,2],[3550,2],[3647,1],[3738,3],[4200,1],[4209,1],[4232,1],[4253,1],[4282,1],[4296,1],[4343,1],[4359,1],[4409,1],[4421,1],[4453,1],[4556,1],[4558,2],[4561,1],[4624,1],[4656,1],[4677,3],[4691,1],[4742,1],[4855,3],[4917,2],[4947,3],[4951,3],[5292,2],[5351,1],[5364,1],[5401,1],[5407,1],[5458,1],[5472,1],[5498,1],[5586,2],[5620,3],[5635,2],[5674,2],[5677,1],[5690,1],[5745,1],[5780,1],[5881,1],[5956,1],[5973,1],[6041,1],[6084,2],[6087,1],[6114,3],[6118,3],[6122,1],[6267,1],[6276,1],[6299,1],[6320,1],[6349,1],[6363,1],[6410,1],[6426,1],[6557,1],[6569,1],[6601,1],[6704,1],[6706,2],[6709,1],[6772,1],[6804,1],[6825,3],[6862,1],[6913,1],[7020,3],[7082,2],[7112,3],[7116,3]]},"template:docs/testing/setup-mirage":{"position":[[271,1],[294,1],[323,1],[337,1],[396,1],[430,1],[526,1],[528,2],[541,3],[545,3],[656,1],[679,1],[708,1],[722,1],[811,2],[869,1],[903,1],[953,1],[966,3],[1015,1],[1017,2],[1030,3],[1034,3],[1233,1],[1256,1],[1285,1],[1299,1],[1346,1],[1372,1],[1406,1],[1421,1],[1457,1],[1476,1],[1494,1],[1496,1],[1517,1],[1566,2],[1578,1],[1595,1],[1615,1],[1642,2],[1645,2],[1648,1],[1698,2],[1701,1],[1703,2],[1740,1],[1761,1],[1795,1],[1845,1],[1858,3],[1907,1],[1909,2],[1922,3],[1926,3]]},"template:index":{"position":[[285,1]]},"template:templates/blog/detail":{"position":[[1,1]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[252,1],[264,1],[311,2],[592,2],[942,2],[1071,3],[1075,1],[1093,1],[1116,2],[1211,1],[1228,1],[1301,2],[1588,2]]},"template:templates/docs/advanced/environment-options":{"position":[[116,2],[141,3],[161,3],[179,1],[205,1],[207,1],[223,2],[226,1],[549,2],[574,3],[594,3],[612,1],[638,1],[640,1],[656,2],[659,1],[688,2],[713,3],[733,3],[752,1],[778,1],[780,1],[797,2],[800,1],[1080,1],[1098,1],[1100,1],[1142,1],[1191,2],[1202,2],[1239,1],[2272,2],[2297,3],[2325,1],[2327,1],[2353,2],[2870,2],[2895,3],[2923,1],[2925,1],[2958,2]]},"template:templates/docs/advanced/mocking-guids":{"position":[[794,1],[810,1],[852,1],[868,1],[879,1],[892,1],[894,2],[945,1],[956,1],[996,1],[1003,1],[1016,1],[1051,1],[1053,2],[1139,1],[1163,1],[1217,1],[1237,1],[1239,2],[1289,1],[1309,1],[1311,1]]},"template:templates/docs/advanced/server-configuration":{"position":[[1316,1],[2980,2],[3017,1],[3043,1],[3077,1],[3092,1],[3143,1],[3161,1],[3163,1],[3184,1],[3233,2],[3245,1],[3247,2],[3265,1],[3274,2],[3299,2],[3302,2],[3339,1],[3341,2],[3395,1],[3421,1],[3455,1],[3470,1],[3521,1],[3539,1],[3541,1],[3562,1],[3611,2],[3622,2],[3659,1],[3679,1],[3681,2],[3699,1],[3708,2],[3733,1],[4858,2],[4954,1],[5007,1],[5041,1],[5056,1],[5107,1],[5125,1],[5127,1],[5148,1],[5197,2],[5268,2],[5305,1],[5325,1],[5327,2],[5345,1],[5354,2],[5379,1]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[394,2],[397,1],[399,2],[430,1],[465,1],[490,1],[496,1],[503,1],[665,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1274,1],[1292,1],[1294,1],[1324,1],[1348,1],[1360,1],[1362,1],[1364,2],[1399,2],[1417,2],[1432,1],[1506,2],[1707,1],[1709,1],[1746,1],[1769,1],[1791,2],[1837,1],[1854,1],[1897,1],[1917,1],[1919,2],[1967,1],[2079,1],[2081,2],[2115,1]]},"template:templates/docs/data-layer/database":{"position":[[724,2],[780,1],[811,1],[813,1],[837,2],[840,1],[861,2],[864,1],[883,2],[886,1],[888,3],[892,1],[1005,2],[1008,1],[1035,3],[1103,1],[1105,1],[1138,2],[1141,1],[1171,2],[1174,1],[1202,1],[1204,1],[1580,2],[1655,1],[1868,3]]},"template:templates/docs/data-layer/factories":{"position":[[823,2],[856,1],[864,1],[913,3],[1061,2],[1124,1],[1150,1],[1388,2],[1409,1],[1419,1],[1421,1],[1431,1],[1433,1],[1435,1],[1552,2],[1615,1],[1640,1],[1708,3],[1712,1],[1747,1],[1757,1],[1759,1],[1836,1],[1838,1],[1840,1],[2298,2],[2334,1],[2344,1],[2395,3],[2462,2],[2498,1],[2508,1],[2580,3],[2695,1],[2705,1],[2707,1],[2739,1],[2741,1],[2743,1],[2788,2],[2824,1],[2834,1],[2894,1],[2917,1],[2919,3],[3185,1],[3195,1],[3197,1],[3225,2],[3228,1],[3256,2],[3259,1],[3287,2],[3290,1],[3318,2],[3321,1],[3349,1],[3351,1],[3353,1],[3402,2],[3438,1],[3448,1],[3474,1],[3482,1],[3549,1],[3572,2],[3589,1],[3638,2],[3650,1],[3663,1],[3665,1],[3695,2],[3714,1],[3732,1],[3734,3],[3868,1],[3878,1],[3880,1],[3951,2],[3954,1],[4024,2],[4027,1],[4097,2],[4100,1],[4171,2],[4174,1],[4244,2],[4247,1],[4249,1],[4663,2],[4718,2],[4743,1],[4798,1],[4800,2],[4884,1],[4908,3],[4912,2],[4937,1],[4997,1],[5347,2],[5382,1],[5392,1],[5418,1],[5426,1],[5491,1],[5523,2],[5537,1],[5566,2],[5588,1],[5590,3],[5675,1],[5677,1],[5738,1],[5740,1],[5805,1],[5807,1],[5866,1],[5868,1],[6044,1],[6095,3],[6162,3],[6233,1],[6261,1],[6289,3],[6316,1],[6357,3],[6549,1],[6589,3],[6719,2],[6722,1],[6754,1],[6777,2],[6780,1],[6814,1],[6821,3],[6825,3],[6829,3],[7587,2],[7642,3],[7646,2],[7719,3],[7876,2],[7962,1],[8006,3],[8010,1],[8012,3],[8758,1],[8824,1],[8840,3],[9306,2],[9392,1],[9410,1],[9454,3],[9458,1],[9460,1],[9462,3],[9535,1],[9551,3],[10057,2],[10092,1],[10109,1],[10255,2],[10258,3],[10666,2],[10701,1],[10718,1],[10864,3],[10903,2],[10906,3],[10994,1],[11057,1],[11288,1],[11313,3],[11511,2],[11546,1],[11563,1],[11684,1],[11718,1],[11725,3],[11729,1],[11731,2],[11734,3],[12321,2],[12356,1],[12366,1],[12443,1],[12461,1],[12505,3],[12509,1],[12511,1],[12513,3],[12574,2],[12609,1],[12632,1],[12703,3],[12829,2],[12864,1],[12894,1],[12983,2],[12986,3],[13075,2],[13110,1],[13140,1],[13236,1],[13253,2],[13256,2],[13259,3],[13561,2],[13624,1],[13658,1],[13876,2],[13937,1],[13961,1],[13977,3],[13981,1],[14042,2],[14201,1],[14203,1],[14234,1],[14365,2],[14429,2],[14455,1],[14457,2],[14472,2],[14496,1],[14530,1],[14558,1],[15269,1],[15367,3],[15371,3],[15479,1],[16326,1],[16340,1],[16377,1],[16401,1],[16411,3],[16437,1],[16491,3],[16574,3],[16998,1],[17022,1],[17070,3],[17153,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[359,2],[422,1],[456,1],[458,1],[481,2],[484,1],[507,2],[510,1],[541,1],[543,1],[545,3],[549,1],[836,2],[883,1],[885,1],[933,2],[936,1],[982,2],[985,1],[1046,2],[1049,1],[1100,2],[1103,1],[1153,2],[1156,1],[1206,2],[1209,1],[1256,2],[1259,1],[1309,2],[1312,1],[1359,2],[1362,1],[1415,2],[1418,2],[1917,2],[1980,1],[2005,1],[2185,2],[2248,1],[2294,2],[2341,1],[2546,1],[2655,3],[2659,3],[2742,1],[2858,2],[2913,3],[2917,2],[2998,3],[3060,1],[3106,3],[3184,3],[3260,2],[3280,1],[3289,1],[3291,1],[3324,1],[3326,2],[3336,1],[3338,1],[3401,1],[3403,1],[3405,1],[3944,2],[3987,1],[3989,1],[4022,1],[4024,2],[4027,2],[4070,1],[4072,1],[4135,1],[4137,2],[4308,2],[4363,1],[4382,3],[4386,2],[4467,3],[4549,2],[4592,1],[4594,1],[4614,1],[4620,2],[4645,1],[4647,2],[4650,2],[4693,1],[4695,1],[4758,1],[4760,2]]},"template:templates/docs/data-layer/models":{"position":[[882,2],[919,1],[927,1],[1140,1],[1152,1],[1217,3],[1286,2],[1342,1],[1398,3],[1402,1],[1657,2],[1713,1],[1743,1],[2078,2],[2081,1],[2114,3],[2255,3],[2307,3],[2547,1],[2607,3],[2635,1]]},"template:templates/docs/data-layer/orm":{"position":[[454,2],[464,1],[474,1],[476,1],[509,2],[512,1],[542,2],[545,1],[573,1],[575,1],[577,1],[716,1],[904,2],[925,1],[933,1],[972,1],[996,1],[998,1],[1000,1],[1018,1],[1135,2],[1138,1],[1150,1],[1201,1],[1209,1],[1253,1],[1274,1],[1276,1],[1278,2],[1281,3],[1354,1],[1437,1],[1602,2],[1605,1],[1617,1],[1675,1],[1677,1],[1685,1],[1729,1],[1731,1],[1733,1],[1735,2],[1769,2],[1776,4],[1800,2],[1803,1],[1820,1],[1834,3],[1856,3],[2069,1],[2170,1],[2234,1],[2242,1],[2281,1],[2305,2],[2323,1],[2336,1],[2344,1],[2371,1],[2373,1],[2375,1],[2377,1],[2379,1],[3231,2],[3264,1],[3272,1],[3321,3],[3887,2],[3890,1],[3899,1],[3951,3],[4359,2],[4403,1],[4423,1],[4484,3],[4552,1],[4560,1],[4599,1],[4673,1],[4675,1],[4677,1],[4981,2],[5014,1],[5033,1],[5112,3],[5163,2],[5197,1],[5205,1],[5254,3],[5613,1],[5621,1],[5660,1],[5734,2],[5752,1],[5764,1],[5772,1],[5798,1],[5800,1],[5802,1],[5804,2],[5817,1],[5819,1],[5858,1],[5886,1],[5888,1],[5890,1],[5892,1],[6204,1],[6248,2],[6251,1],[6253,1],[6262,1],[6283,1],[6316,1],[6318,3],[6322,1],[6806,1],[6808,1],[6845,1],[6847,2],[6858,1],[6860,1],[6960,1],[6962,1],[6964,3],[7272,1],[7323,3],[7439,3],[7667,1],[7677,1],[7679,1],[7749,1],[7751,2],[7762,1],[7764,1],[7796,2],[7799,1],[7830,1],[7832,1],[7834,1],[7897,1],[7964,3],[8039,3],[8043,3],[8086,1],[8096,1],[8098,1],[8168,1],[8170,2],[8181,1],[8183,1],[8215,2],[8218,1],[8249,1],[8251,1],[8253,1]]},"template:templates/docs/data-layer/relationships":{"position":[[551,2],[588,1],[607,1],[684,3],[983,2],[1006,1],[1011,2],[1056,2],[1091,1],[1135,2],[1187,2],[1854,2],[1891,1],[1908,1],[1985,3],[2149,2],[2182,1],[2192,2],[2239,2],[2286,1],[2310,2],[2366,2],[2420,2],[2639,2],[2676,1],[2704,1],[2820,3],[3067,2],[3133,3],[3137,2],[3203,3],[3699,2],[3761,3],[3765,2],[3866,3],[4089,2],[4151,3],[4155,2],[4227,1],[4250,3],[4282,1],[4298,2],[4301,3],[4486,1],[4506,1],[4647,2],[4745,2],[4748,3],[4752,2],[4829,3],[4833,2],[4908,3],[5167,1],[5206,3],[5243,1],[5266,3],[5304,1],[5327,3],[5331,2],[5364,2],[5367,1],[5394,1],[5396,2],[5428,1],[5430,1],[5455,2],[5506,2],[5594,2],[5597,3],[5601,2],[5652,3],[5656,2],[5709,3],[5722,1],[5758,3],[5785,1],[5793,3],[5823,1],[5831,3],[5835,2],[5860,2],[5863,1],[5865,1],[5886,2],[5889,1],[5912,2],[5915,3],[5919,1],[5921,2],[5945,1],[5947,1],[5949,1],[5972,2],[5975,3],[5979,2],[6007,1]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1164,1],[1186,1],[1281,3],[1595,1],[1617,1],[1700,1],[1830,1],[1832,3],[1930,1]]},"template:templates/docs/data-layer/serializers/index":{"position":[[172,2],[175,1],[223,3],[257,2],[274,1],[282,1],[322,1],[346,1],[348,1],[350,1],[2247,2],[2291,1],[2311,1],[2372,3],[2833,3],[3242,2],[3259,1],[3298,1],[3367,1],[3380,1],[3406,1],[3417,1],[3498,1],[3523,1],[3525,3],[4095,1],[4115,1],[4207,3],[4276,1],[4284,1],[4324,1],[4348,2],[4366,1],[4384,1],[4392,1],[4394,1],[4420,2],[4423,1],[4449,2],[4452,1],[4478,2],[4481,1],[4483,1],[4485,1],[4487,1],[4489,1],[4696,2],[4837,1],[4846,1],[4864,1],[4914,1],[4916,2],[4919,1],[4921,3],[4989,1],[4997,1],[5037,1],[5061,2],[5079,1],[5097,1],[5106,1],[5146,1],[5148,1],[5150,1],[5152,1],[5154,1],[5616,1],[5709,2],[5775,1],[5788,1],[5820,1],[5861,1],[5891,3],[6184,2],[6250,1],[6263,1],[6295,1],[6363,1],[6393,3],[6978,1]]},"template:templates/docs/getting-started/installation":{"position":[[855,1]]},"template:templates/docs/getting-started/overview":{"position":[[377,2],[415,1],[432,1],[461,2],[464,2],[467,1],[476,1],[484,1],[486,1],[523,1],[546,1],[548,2],[551,1],[588,1],[608,1],[610,2],[613,1],[650,1],[668,1],[670,2],[673,1],[675,2],[678,3],[682,1],[856,1],[1924,1],[1988,2],[2021,1],[2029,1],[2078,3],[2403,2],[2406,1],[2436,3],[2933,2],[2958,1],[2960,1],[3259,1],[3440,2],[3476,1],[3486,1],[3546,1],[3569,2],[3595,2],[3605,1],[3615,1],[3631,1],[3671,1],[3678,1],[3684,1],[3690,1],[3697,2],[3716,3],[3754,1],[3756,1],[3804,2],[3807,1],[3855,2],[3858,2],[3861,3],[3865,1],[4243,2],[4306,1],[4340,2],[4474,2],[4499,1],[4501,1],[4538,1],[4586,1],[4588,2],[4591,1],[4628,1],[4676,1],[4678,2],[4681,2],[4684,3],[4688,1],[4923,2],[4965,1],[4988,1],[5017,1],[5031,1],[5090,1],[5124,1],[5228,1],[5347,3],[5351,3],[5355,3],[5489,1],[5501,1],[5531,1],[5555,3],[5642,3],[6060,2],[6093,1],[6110,1],[6182,3],[6186,2],[6225,1],[6244,1],[6312,3],[6486,2],[6489,1],[6501,1],[6568,3],[6678,1],[6703,1],[6741,1],[6772,1],[6802,3],[6835,1],[6859,3],[6892,1],[6919,2],[6922,1],[6924,3],[6993,3],[6997,3],[7450,2],[7467,1],[7475,1],[7512,1],[7536,1],[7538,1],[7540,1],[7717,2],[7734,1],[7744,1],[7775,1],[7777,1],[8166,2],[8210,1],[8223,1],[8299,1],[8325,2],[8353,1],[8379,1],[8381,3],[8519,2],[8557,1],[8570,1],[8633,1],[8649,1],[8651,3],[8655,2],[8693,1],[8737,2],[8740,1],[8788,3],[8792,1],[8893,1],[8902,1],[8933,2],[8952,1],[8954,1],[9006,2],[9009,1],[9055,2],[9058,3],[9062,1],[9064,1],[9412,2],[9415,1],[9446,3],[10302,2],[10555,2],[10727,1]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[98,1],[148,1],[447,2],[462,1],[470,1],[509,1],[517,1],[969,1],[996,1],[1030,1],[1045,1],[1097,1],[1115,1],[1117,1],[1138,1],[1187,2],[1198,2],[1235,1],[1237,2],[1313,1],[1315,1],[2489,1],[3093,1],[3212,1],[3221,1],[3238,1],[3257,1],[3266,1],[3276,1],[3295,1],[3600,2],[3987,1],[3989,1],[4065,3],[4069,1],[4153,3],[4157,1],[4231,1],[4233,1],[4308,3],[4312,1],[4328,1],[4330,1],[4379,2],[4382,1],[4384,1],[4405,1],[4426,1],[4515,1],[4517,1],[4561,1],[4609,3],[4613,1],[5122,2],[5202,2],[5218,1],[5232,1],[6239,1],[7805,1],[7807,1],[7818,1],[7852,1],[7854,2],[7926,1],[7965,1],[7980,2],[7998,1],[8009,1],[8017,1],[8042,1],[8044,1],[8046,1],[8048,1],[8452,1],[9559,2],[9575,1],[9583,1],[9621,1],[9623,3],[9627,2],[9645,1],[9655,1],[9663,1],[9688,1],[9690,1],[9692,1],[9694,1],[9696,1],[10212,2],[10228,1],[10236,1],[10274,1],[10276,3],[10280,2],[10298,1],[10308,1],[10317,1],[10343,1],[10345,1],[10347,1],[10349,1],[10351,1],[10950,2],[10994,1],[11014,1],[11114,3],[11413,1],[11651,2],[11685,1],[11693,1],[11753,2],[11785,1],[11804,1],[11881,3],[12217,2],[12251,1],[12268,1],[12342,3],[12346,2],[12378,1],[12397,1],[12474,3],[12887,2],[13429,1],[14254,4],[14586,1],[15130,5],[15519,1],[15544,2],[15559,3],[15580,1],[15604,2],[15618,3],[15767,1],[15800,2],[15815,1],[15848,1],[15850,3],[15919,1],[15952,2],[15966,1],[15999,1],[16001,3],[16616,1],[16624,1],[16835,1],[18041,1],[18043,2],[18059,3],[18398,2],[18410,1],[18412,2],[18428,3]]},"template:templates/docs/route-handlers/functions":{"position":[[193,2],[233,2],[236,2],[239,1],[248,1],[289,2],[292,3],[550,2],[553,2],[556,1],[558,3],[562,3],[587,2],[590,2],[593,1],[595,3],[599,3],[629,2],[632,2],[635,1],[637,3],[641,3],[669,2],[672,2],[675,1],[677,3],[681,3],[912,2],[952,2],[955,2],[958,1],[967,1],[1008,2],[1011,2],[1014,1],[1029,3],[1243,2],[1289,1],[1306,1],[1327,1],[1355,2],[1358,2],[1361,1],[1370,1],[1411,2],[1414,3],[1445,2],[1448,2],[1451,1],[1477,2],[1480,1],[1495,3],[1499,1],[1681,1],[1697,1],[1706,2],[1709,3],[1713,3],[1968,2],[1971,1],[2001,3],[2290,2],[2293,1],[2302,1],[2354,3],[2528,2],[2531,1],[2543,1],[2620,3],[2624,3],[3078,2],[3081,1],[3090,1],[3143,2],[3563,1],[3576,1],[3608,1],[3644,1],[3646,1],[3656,2],[3672,3],[3865,1],[3878,1],[3910,1],[3962,1],[3964,1],[3974,2],[3990,3],[4196,2],[4211,1],[4219,1],[4248,1],[4320,2],[4338,1],[4346,1],[4354,1],[4377,1],[4379,1],[4381,1],[4383,1],[4385,1],[4487,1],[4499,1],[4532,2],[4541,1],[4543,1],[4619,1],[4621,2],[4659,3],[5383,2],[5386,2],[5389,1],[5391,3],[5395,3],[5708,1],[5738,1],[5798,1],[5833,1],[5965,1],[5977,1],[6016,2],[6019,3],[6023,3],[6459,2],[6486,1],[6497,1],[6542,1],[6592,1],[6604,1],[6662,1],[6701,1],[6708,1],[6735,1],[6752,2],[6755,1],[6790,3],[6794,1],[6796,3],[6800,1],[6920,4],[7084,4],[7204,2],[7239,1],[7263,2],[7351,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[306,2],[309,1],[339,3],[839,2],[842,1],[854,1],[931,3],[1272,2],[1308,2],[1375,2],[1428,2],[1473,2],[1476,1],[1508,2],[1536,3],[1558,2],[1598,2],[1668,2],[1715,2],[1773,2],[1776,1],[1785,1],[1839,2],[1867,3],[1940,2],[1975,1],[1992,3],[2027,1],[2044,3],[2048,2],[2084,2],[2096,2],[2108,2],[2111,1],[2121,1],[2175,2],[2203,3],[2244,2],[2281,2],[2348,2],[2395,2],[2458,1],[2470,1],[2541,3],[2850,2],[2924,2],[2996,2],[3043,2],[3111,1],[3120,1],[3151,1],[3231,3],[3540,2],[3580,2],[3650,2],[3697,2],[3755,2],[3758,1],[3767,1],[3824,3],[3870,2],[3936,2],[3976,2],[3988,2],[4000,2],[4003,1],[4012,1],[4045,1],[4114,3],[4325,2],[4377,2],[4502,2],[4667,1],[4675,1],[4693,1],[4695,3],[4699,2],[4863,1],[4873,1],[4884,1],[4886,3],[4890,2],[5161,1],[5178,3],[5182,2],[5501,1],[5560,1],[5572,30],[5609,1],[5638,1],[5673,1],[5705,1],[5755,1]]},"template:templates/docs/testing/acceptance-tests":{"position":[[658,1],[681,1],[703,1],[712,1],[726,1],[785,1],[819,1],[850,1],[917,1],[919,2],[932,3],[936,3],[1740,1],[1839,3],[1843,3],[2472,2],[2508,1],[2518,1],[2591,3],[3097,1],[3196,3],[3200,3],[3280,1],[3292,1],[3322,1],[3346,3],[3428,3],[3715,1],[3717,2],[3765,2],[3790,2],[3842,3],[3846,3],[4246,1],[4279,2],[4282,2],[4285,2],[4296,1],[4330,1],[4332,3],[4501,3],[5258,2],[5313,1],[5381,2],[5534,1],[5620,3],[5624,3],[5821,1],[5847,2],[5850,3],[5854,3]]},"template:templates/docs/testing/assertions":{"position":[[1043,1],[1074,1],[1101,2],[1206,2],[1281,2],[1405,3],[1727,1],[1745,1],[1773,1],[1795,3],[1808,1],[2035,3],[2578,2],[2618,1],[2642,1],[2660,3],[2672,1],[2698,1],[2700,1],[2722,2],[2725,1],[2727,1],[3098,1],[3135,1],[3153,3],[3192,1],[3209,3],[3265,2],[3331,3],[3335,2],[3381,1],[3402,1],[3519,1],[3547,3],[3551,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[405,1],[414,1],[437,1],[458,1],[487,1],[501,1],[561,1],[573,1],[604,1],[705,1],[735,1],[759,3],[871,3],[931,3],[935,3],[1131,1],[1140,1],[1163,1],[1184,1],[1213,1],[1227,1],[1287,1],[1299,1],[1330,1],[1436,1],[1470,2],[1473,2],[1476,2],[1487,1],[1512,4],[1521,2],[1660,3],[1715,3],[1719,3],[2055,1],[2067,1],[2099,1],[2202,1],[2204,2],[2276,3],[2338,2],[2368,3],[2372,3],[2523,1],[2535,1],[2567,1],[2670,1],[2672,2],[2675,2],[2705,1],[2737,1],[2758,3],[2820,3],[2882,2],[2912,3],[2916,3],[3278,1],[3530,2],[3533,2],[3550,2],[3647,1],[3738,3],[4200,1],[4209,1],[4232,1],[4253,1],[4282,1],[4296,1],[4343,1],[4359,1],[4409,1],[4421,1],[4453,1],[4556,1],[4558,2],[4561,1],[4624,1],[4656,1],[4677,3],[4691,1],[4742,1],[4855,3],[4917,2],[4947,3],[4951,3],[5292,2],[5351,1],[5364,1],[5401,1],[5407,1],[5458,1],[5472,1],[5498,1],[5586,2],[5620,3],[5635,2],[5674,2],[5677,1],[5690,1],[5745,1],[5780,1],[5881,1],[5956,1],[5973,1],[6041,1],[6084,2],[6087,1],[6114,3],[6118,3],[6122,1],[6267,1],[6276,1],[6299,1],[6320,1],[6349,1],[6363,1],[6410,1],[6426,1],[6557,1],[6569,1],[6601,1],[6704,1],[6706,2],[6709,1],[6772,1],[6804,1],[6825,3],[6862,1],[6913,1],[7020,3],[7082,2],[7112,3],[7116,3]]},"template:templates/docs/testing/setup-mirage":{"position":[[271,1],[294,1],[323,1],[337,1],[396,1],[430,1],[526,1],[528,2],[541,3],[545,3],[656,1],[679,1],[708,1],[722,1],[811,2],[869,1],[903,1],[953,1],[966,3],[1015,1],[1017,2],[1030,3],[1034,3],[1233,1],[1256,1],[1285,1],[1299,1],[1346,1],[1372,1],[1406,1],[1421,1],[1457,1],[1476,1],[1494,1],[1496,1],[1517,1],[1566,2],[1578,1],[1595,1],[1615,1],[1642,2],[1645,2],[1648,1],[1698,2],[1701,1],[1703,2],[1740,1],[1761,1],[1795,1],[1845,1],[1858,3],[1907,1],[1909,2],[1922,3],[1926,3]]},"template:templates/index":{"position":[[285,1]]}},"keywords":{}}],["0",{"_index":1529,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1083,1]]},"template:templates/docs/route-handlers/functions":{"position":[[1083,1]]}},"keywords":{}}],["0-3",{"_index":1436,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13388,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13388,3]]}},"keywords":{}}],["0.1.x",{"_index":1439,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13423,5],[14114,6],[14918,6],[16233,6],[17932,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13423,5],[14114,6],[14918,6],[16233,6],[17932,6]]}},"keywords":{}}],["0.2",{"_index":1418,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11614,4],[13431,3],[16419,4],[17191,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11614,4],[13431,3],[16419,4],[17191,3]]}},"keywords":{}}],["0.2.0",{"_index":1442,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13668,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13668,6]]}},"keywords":{}}],["0.2.x",{"_index":1414,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11407,5],[11454,5],[14413,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11407,5],[11454,5],[14413,6]]}},"keywords":{}}],["0.2.x'",{"_index":1424,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[12607,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12607,7]]}},"keywords":{}}],["0.3",{"_index":1389,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8529,3],[9191,4],[10888,3],[11415,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8529,3],[9191,4],[10888,3],[11415,3]]}},"keywords":{}}],["0.3.x",{"_index":1387,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8446,5],[8541,6],[11463,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8446,5],[8541,6],[11463,5]]}},"keywords":{}}],["0.4",{"_index":1388,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8454,3],[8503,3],[10535,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8454,3],[8503,3],[10535,3]]}},"keywords":{}}],["0.x",{"_index":1359,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5994,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5994,3]]}},"keywords":{}}],["01/01/2000",{"_index":586,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4785,12],[4984,12]]},"template:templates/docs/data-layer/factories":{"position":[[4785,12],[4984,12]]}},"keywords":{}}],["1",{"_index":470,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1111,4]]},"template:docs/data-layer/factories":{"position":[[1427,3],[1765,4],[2713,4],[3203,4],[3222,2],[3886,4],[3905,3],[4749,4],[4768,3],[5683,4]]},"template:docs/data-layer/fixtures":{"position":[[464,2],[891,2],[3297,4],[3344,4],[3359,4],[3995,4],[4078,4],[4093,4],[4600,4],[4616,3],[4701,4],[4716,4]]},"template:docs/data-layer/orm":{"position":[[482,4],[939,4],[1360,4],[2075,4],[2248,4],[4566,4],[5627,4],[5794,3],[5825,4],[6814,4],[6866,4],[6956,3],[7685,4],[8104,4]]},"template:docs/data-layer/relationships":{"position":[[986,1],[2152,3],[5373,2],[5871,2]]},"template:docs/data-layer/serializers/index":{"position":[[288,4],[3265,4],[4290,4],[4416,3],[5003,4]]},"template:docs/getting-started/overview":{"position":[[492,2],[3578,2],[3686,3],[3772,3],[4507,2],[4554,3],[7481,2],[7750,2],[8908,2],[8960,2],[8975,2],[9015,2],[9030,2]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1576,2],[1697,2],[7824,2],[7850,1],[7950,2],[8040,1],[9604,4],[9684,3],[10257,4],[15563,3],[15622,3]]},"template:docs/route-handlers/functions":{"position":[[1460,3],[3654,1],[3972,1],[4375,1],[4615,3]]},"template:docs/testing/assertions":{"position":[[3473,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4570,2]]},"template:templates/docs/data-layer/database":{"position":[[1111,4]]},"template:templates/docs/data-layer/factories":{"position":[[1427,3],[1765,4],[2713,4],[3203,4],[3222,2],[3886,4],[3905,3],[4749,4],[4768,3],[5683,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[464,2],[891,2],[3297,4],[3344,4],[3359,4],[3995,4],[4078,4],[4093,4],[4600,4],[4616,3],[4701,4],[4716,4]]},"template:templates/docs/data-layer/orm":{"position":[[482,4],[939,4],[1360,4],[2075,4],[2248,4],[4566,4],[5627,4],[5794,3],[5825,4],[6814,4],[6866,4],[6956,3],[7685,4],[8104,4]]},"template:templates/docs/data-layer/relationships":{"position":[[986,1],[2152,3],[5373,2],[5871,2]]},"template:templates/docs/data-layer/serializers/index":{"position":[[288,4],[3265,4],[4290,4],[4416,3],[5003,4]]},"template:templates/docs/getting-started/overview":{"position":[[492,2],[3578,2],[3686,3],[3772,3],[4507,2],[4554,3],[7481,2],[7750,2],[8908,2],[8960,2],[8975,2],[9015,2],[9030,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1576,2],[1697,2],[7824,2],[7850,1],[7950,2],[8040,1],[9604,4],[9684,3],[10257,4],[15563,3],[15622,3]]},"template:templates/docs/route-handlers/functions":{"position":[[1460,3],[3654,1],[3972,1],[4375,1],[4615,3]]},"template:templates/docs/testing/assertions":{"position":[[3473,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4570,2]]}},"keywords":{}}],["1.0",{"_index":1299,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1563,3],[1620,3],[1684,3],[2818,3],[5684,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1563,3],[1620,3],[1684,3],[2818,3],[5684,4]]}},"keywords":{}}],["10",{"_index":617,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6750,3],[6880,2],[8820,3],[9531,3],[11776,2],[11833,3],[13653,4]]},"template:docs/data-layer/fixtures":{"position":[[1368,3]]},"template:docs/getting-started/overview":{"position":[[4335,4]]},"template:docs/testing/acceptance-tests":{"position":[[416,2],[1774,4],[1836,2],[2224,3],[3131,4],[3193,2],[3760,4],[3839,2],[5376,4]]},"template:templates/docs/data-layer/factories":{"position":[[6750,3],[6880,2],[8820,3],[9531,3],[11776,2],[11833,3],[13653,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[1368,3]]},"template:templates/docs/getting-started/overview":{"position":[[4335,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[416,2],[1774,4],[1836,2],[2224,3],[3131,4],[3193,2],[3760,4],[3839,2],[5376,4]]}},"keywords":{}}],["10/26/2014",{"_index":534,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1678,13],[1806,13]]},"template:templates/docs/data-layer/factories":{"position":[[1678,13],[1806,13]]}},"keywords":{}}],["100",{"_index":827,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2651,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[2651,3]]}},"keywords":{}}],["1000",{"_index":385,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[505,7]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[505,7]]}},"keywords":{}}],["10000",{"_index":1538,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1699,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1699,6]]}},"keywords":{}}],["10:00:00",{"_index":684,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[10245,9],[10854,9]]},"template:templates/docs/data-layer/factories":{"position":[[10245,9],[10854,9]]}},"keywords":{}}],["15",{"_index":442,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[2110,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[2110,4]]}},"keywords":{}}],["18",{"_index":1344,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4597,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4597,3]]}},"keywords":{}}],["1950",{"_index":1204,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3617,5]]},"template:templates/docs/getting-started/overview":{"position":[[3617,5]]}},"keywords":{}}],["1992",{"_index":1210,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3782,5],[4564,5]]},"template:templates/docs/getting-started/overview":{"position":[[3782,5],[4564,5]]}},"keywords":{}}],["2",{"_index":471,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1147,4]]},"template:docs/data-layer/factories":{"position":[[3234,4],[3253,2],[3960,4],[3979,3],[4943,4],[5746,4]]},"template:docs/data-layer/fixtures":{"position":[[490,2],[942,2]]},"template:docs/data-layer/orm":{"position":[[518,4],[7745,3],[7770,4],[8189,4]]},"template:docs/data-layer/relationships":{"position":[[1008,2],[2156,2],[2184,3],[5436,2],[5955,2]]},"template:docs/data-layer/serializers/index":{"position":[[4445,3]]},"template:docs/getting-started/overview":{"position":[[557,2],[3587,2],[3823,3],[4597,2],[4644,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4861,2]]},"template:docs/route-handlers/functions":{"position":[[1464,2]]},"template:docs/testing/integration-and-unit-tests":{"position":[[6718,2]]},"template:templates/docs/data-layer/database":{"position":[[1147,4]]},"template:templates/docs/data-layer/factories":{"position":[[3234,4],[3253,2],[3960,4],[3979,3],[4943,4],[5746,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[490,2],[942,2]]},"template:templates/docs/data-layer/orm":{"position":[[518,4],[7745,3],[7770,4],[8189,4]]},"template:templates/docs/data-layer/relationships":{"position":[[1008,2],[2156,2],[2184,3],[5436,2],[5955,2]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4445,3]]},"template:templates/docs/getting-started/overview":{"position":[[557,2],[3587,2],[3823,3],[4597,2],[4644,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4861,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1464,2]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[6718,2]]}},"keywords":{}}],["2.0",{"_index":1298,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1499,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1499,3]]}},"keywords":{}}],["2.6.0",{"_index":1173,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1003,6]]},"template:templates/docs/getting-started/installation":{"position":[[1003,6]]}},"keywords":{}}],["2/22/2019",{"_index":573,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3996,12]]},"template:templates/docs/data-layer/factories":{"position":[[3996,12]]}},"keywords":{}}],["200",{"_index":1573,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6162,3],[6235,3]]},"template:docs/route-handlers/shorthands":{"position":[[1218,3]]},"template:templates/docs/route-handlers/functions":{"position":[[6162,3],[6235,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1218,3]]}},"keywords":{}}],["2000",{"_index":1533,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1329,5]]},"template:docs/testing/setup-mirage":{"position":[[1617,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1329,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[1617,4]]}},"keywords":{}}],["2008",{"_index":1211,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3833,5],[4654,5]]},"template:templates/docs/getting-started/overview":{"position":[[3833,5],[4654,5]]}},"keywords":{}}],["201",{"_index":1576,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6191,3]]},"template:docs/route-handlers/shorthands":{"position":[[1230,3]]},"template:templates/docs/route-handlers/functions":{"position":[[6191,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1230,3]]}},"keywords":{}}],["2010-01-01",{"_index":683,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[10233,11],[10842,11]]},"template:templates/docs/data-layer/factories":{"position":[[10233,11],[10842,11]]}},"keywords":{}}],["2014",{"_index":936,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1414,6],[2129,6],[4650,6],[5711,6],[6920,6],[7416,6]]},"template:templates/docs/data-layer/orm":{"position":[[1414,6],[2129,6],[4650,6],[5711,6],[6920,6],[7416,6]]}},"keywords":{}}],["2019",{"_index":1206,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3633,5]]},"template:templates/docs/getting-started/overview":{"position":[[3633,5]]}},"keywords":{}}],["204",{"_index":1575,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6179,3],[6202,3]]},"template:templates/docs/route-handlers/functions":{"position":[[6179,3],[6202,3]]}},"keywords":{}}],["23",{"_index":950,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2165,4],[2366,4]]},"template:templates/docs/data-layer/orm":{"position":[[2165,4],[2366,4]]}},"keywords":{}}],["24",{"_index":379,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[413,2],[492,3]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[413,2],[492,3]]}},"keywords":{}}],["26",{"_index":935,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1410,3],[2125,3],[4646,3],[5707,3],[6916,3],[7412,3]]},"template:templates/docs/data-layer/orm":{"position":[[1410,3],[2125,3],[4646,3],[5707,3],[6916,3],[7412,3]]}},"keywords":{}}],["3",{"_index":472,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1180,4]]},"template:docs/data-layer/factories":{"position":[[3265,4],[3284,2],[4033,4],[4052,3],[5628,2],[5813,4],[6586,2],[10500,2],[11474,1],[11715,2],[11790,1]]},"template:docs/data-layer/fixtures":{"position":[[516,2],[991,2]]},"template:docs/data-layer/orm":{"position":[[551,4],[7805,4],[8164,3],[8224,4]]},"template:docs/data-layer/relationships":{"position":[[2159,2],[2188,3],[5895,2]]},"template:docs/data-layer/serializers/index":{"position":[[4474,3]]},"template:docs/getting-started/overview":{"position":[[619,2],[5262,3],[5345,1],[6991,1]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5272,2],[6287,3],[6342,2]]},"template:docs/route-handlers/functions":{"position":[[1467,2]]},"template:docs/testing/acceptance-tests":{"position":[[5618,1]]},"template:docs/testing/assertions":{"position":[[3189,2]]},"template:templates/docs/data-layer/database":{"position":[[1180,4]]},"template:templates/docs/data-layer/factories":{"position":[[3265,4],[3284,2],[4033,4],[4052,3],[5628,2],[5813,4],[6586,2],[10500,2],[11474,1],[11715,2],[11790,1]]},"template:templates/docs/data-layer/fixtures":{"position":[[516,2],[991,2]]},"template:templates/docs/data-layer/orm":{"position":[[551,4],[7805,4],[8164,3],[8224,4]]},"template:templates/docs/data-layer/relationships":{"position":[[2159,2],[2188,3],[5895,2]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4474,3]]},"template:templates/docs/getting-started/overview":{"position":[[619,2],[5262,3],[5345,1],[6991,1]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5272,2],[6287,3],[6342,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1467,2]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5618,1]]},"template:templates/docs/testing/assertions":{"position":[[3189,2]]}},"keywords":{}}],["3.0",{"_index":1290,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[276,3]]},"template:docs/testing/acceptance-tests":{"position":[[590,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[276,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[590,5]]}},"keywords":{}}],["3.0-style",{"_index":1635,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[1118,9],[1205,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1118,9],[1205,9]]}},"keywords":{}}],["3000",{"_index":1535,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1490,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1490,4]]}},"keywords":{}}],["3600",{"_index":384,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[498,4]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[498,4]]}},"keywords":{}}],["4",{"_index":558,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3296,4],[3315,2],[4106,4],[4125,3]]},"template:docs/data-layer/fixtures":{"position":[[1055,2]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7308,2]]},"template:docs/route-handlers/functions":{"position":[[1470,2]]},"template:templates/docs/data-layer/factories":{"position":[[3296,4],[3315,2],[4106,4],[4125,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[1055,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7308,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1470,2]]}},"keywords":{}}],["4000",{"_index":1527,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1024,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1024,4]]}},"keywords":{}}],["5",{"_index":557,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3108,3],[3327,4],[3346,2],[3845,2],[4180,4],[4199,3],[6811,2],[6853,1],[6911,1],[15303,3],[15365,1],[15425,1]]},"template:docs/data-layer/fixtures":{"position":[[1109,2]]},"template:docs/route-handlers/functions":{"position":[[1473,3]]},"template:docs/testing/assertions":{"position":[[3132,2],[3329,1]]},"template:templates/docs/data-layer/factories":{"position":[[3108,3],[3327,4],[3346,2],[3845,2],[4180,4],[4199,3],[6811,2],[6853,1],[6911,1],[15303,3],[15365,1],[15425,1]]},"template:templates/docs/data-layer/fixtures":{"position":[[1109,2]]},"template:templates/docs/route-handlers/functions":{"position":[[1473,3]]},"template:templates/docs/testing/assertions":{"position":[[3132,2],[3329,1]]}},"keywords":{}}],["5).foreach(us",{"_index":616,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6703,15]]},"template:templates/docs/data-layer/factories":{"position":[[6703,15]]}},"keywords":{}}],["5/14/2018",{"_index":572,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3922,12]]},"template:templates/docs/data-layer/factories":{"position":[[3922,12]]}},"keywords":{}}],["500",{"_index":1657,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4336,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1517,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4336,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1517,3]]}},"keywords":{}}],["50m",{"_index":1528,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1054,4]]},"template:templates/docs/route-handlers/functions":{"position":[[1054,4]]}},"keywords":{}}],["6",{"_index":801,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1162,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1162,2]]}},"keywords":{}}],["6/2/2018",{"_index":574,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4069,11]]},"template:templates/docs/data-layer/factories":{"position":[[4069,11]]}},"keywords":{}}],["6/30/2018",{"_index":576,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4216,12]]},"template:templates/docs/data-layer/factories":{"position":[[4216,12]]}},"keywords":{}}],["65",{"_index":1343,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4556,4],[4606,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4556,4],[4606,2]]}},"keywords":{}}],["7",{"_index":805,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1215,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1215,2]]}},"keywords":{}}],["7/29/2018",{"_index":575,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4142,12]]},"template:templates/docs/data-layer/factories":{"position":[[4142,12]]}},"keywords":{}}],["8",{"_index":808,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1265,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1265,2]]}},"keywords":{}}],["9",{"_index":811,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1318,2]]},"template:templates/docs/data-layer/fixtures":{"position":[[1318,2]]}},"keywords":{}}],["aaa",{"_index":1645,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3577,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3577,3]]}},"keywords":{}}],["abil",{"_index":202,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[145,7]]},"template:docs/data-layer/database":{"position":[[300,7]]},"template:docs/data-layer/factories":{"position":[[59,7]]},"template:templates/docs/advanced/mocking-guids":{"position":[[145,7]]},"template:templates/docs/data-layer/database":{"position":[[300,7]]},"template:templates/docs/data-layer/factories":{"position":[[59,7]]}},"keywords":{}}],["abov",{"_index":87,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1492,5]]},"template:docs/data-layer/factories":{"position":[[3125,5]]},"template:docs/data-layer/fixtures":{"position":[[3814,6],[5010,5]]},"template:docs/data-layer/models":{"position":[[1519,5]]},"template:docs/data-layer/orm":{"position":[[3463,5]]},"template:docs/data-layer/relationships":{"position":[[2885,6]]},"template:docs/data-layer/serializers/index":{"position":[[880,5]]},"template:docs/getting-started/overview":{"position":[[1484,6],[2881,6],[4425,6],[8803,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12821,6]]},"template:docs/route-handlers/functions":{"position":[[5004,6]]},"template:docs/testing/acceptance-tests":{"position":[[2084,6],[3655,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1492,5]]},"template:templates/docs/data-layer/factories":{"position":[[3125,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[3814,6],[5010,5]]},"template:templates/docs/data-layer/models":{"position":[[1519,5]]},"template:templates/docs/data-layer/orm":{"position":[[3463,5]]},"template:templates/docs/data-layer/relationships":{"position":[[2885,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[880,5]]},"template:templates/docs/getting-started/overview":{"position":[[1484,6],[2881,6],[4425,6],[8803,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12821,6]]},"template:templates/docs/route-handlers/functions":{"position":[[5004,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2084,6],[3655,6]]}},"keywords":{}}],["abram",{"_index":994,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7822,7],[8031,7],[8241,7]]},"template:templates/docs/data-layer/orm":{"position":[[7822,7],[8031,7],[8241,7]]}},"keywords":{}}],["absolut",{"_index":1618,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[5096,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5096,8]]}},"keywords":{}}],["abstract",{"_index":1004,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[8522,8]]},"template:templates/docs/data-layer/orm":{"position":[[8522,8]]}},"keywords":{}}],["accept",{"_index":413,"title":{"template:docs/testing/acceptance-tests":{"position":[[0,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[0,10]]}},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[763,10]]},"template:docs/data-layer/factories":{"position":[[4587,7],[13002,7]]},"template:docs/getting-started/overview":{"position":[[4779,10],[10747,10]]},"template:docs/testing/acceptance-tests":{"position":[[1,10],[18,10],[5958,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[69,10],[381,10],[7267,10]]},"template:docs/testing/setup-mirage":{"position":[[39,12]]},"template:index":{"position":[[153,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[763,10]]},"template:templates/docs/data-layer/factories":{"position":[[4587,7],[13002,7]]},"template:templates/docs/getting-started/overview":{"position":[[4779,10],[10747,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1,10],[18,10],[5958,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[69,10],[381,10],[7267,10]]},"template:templates/docs/testing/setup-mirage":{"position":[[39,12]]},"template:templates/index":{"position":[[153,10]]}},"keywords":{}}],["access",{"_index":371,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[126,6],[706,6]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1439,6]]},"template:docs/data-layer/database":{"position":[[162,6],[396,6],[907,6],[1400,6]]},"template:docs/data-layer/factories":{"position":[[15159,6]]},"template:docs/data-layer/models":{"position":[[1002,6],[1886,9],[1906,6],[2490,6]]},"template:docs/data-layer/serializers/index":{"position":[[5681,6]]},"template:docs/getting-started/overview":{"position":[[2468,6]]},"template:docs/route-handlers/functions":{"position":[[1814,9],[1911,6],[2211,6],[2371,6],[3188,8]]},"template:docs/testing/acceptance-tests":{"position":[[1076,8],[1144,8]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[126,6],[706,6]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1439,6]]},"template:templates/docs/data-layer/database":{"position":[[162,6],[396,6],[907,6],[1400,6]]},"template:templates/docs/data-layer/factories":{"position":[[15159,6]]},"template:templates/docs/data-layer/models":{"position":[[1002,6],[1886,9],[1906,6],[2490,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5681,6]]},"template:templates/docs/getting-started/overview":{"position":[[2468,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1814,9],[1911,6],[2211,6],[2371,6],[3188,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1076,8],[1144,8]]}},"keywords":{}}],["accomplish",{"_index":781,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[333,10]]},"template:docs/testing/acceptance-tests":{"position":[[2411,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4017,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[333,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2411,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4017,10]]}},"keywords":{}}],["accordingli",{"_index":1376,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7635,12],[11334,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7635,12],[11334,11]]}},"keywords":{}}],["account",{"_index":1675,"title":{},"text":{"template:docs/testing/assertions":{"position":[[303,7]]},"template:templates/docs/testing/assertions":{"position":[[303,7]]}},"keywords":{}}],["act",{"_index":397,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[177,3],[386,4]]},"template:docs/testing/acceptance-tests":{"position":[[3441,4],[3490,4],[3768,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[177,3],[386,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3441,4],[3490,4],[3768,3]]}},"keywords":{}}],["action",{"_index":1626,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[5461,8],[5553,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5461,8],[5553,6]]}},"keywords":{}}],["activemodelseri",{"_index":1107,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1566,21]]},"template:docs/getting-started/overview":{"position":[[9129,22]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7389,21],[8143,21],[14947,21]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1566,21]]},"template:templates/docs/getting-started/overview":{"position":[[9129,22]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7389,21],[8143,21],[14947,21]]}},"keywords":{}}],["activescenario",{"_index":434,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1754,14]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1754,14]]}},"keywords":{}}],["actual",{"_index":537,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1852,8],[17336,8]]},"template:docs/data-layer/orm":{"position":[[8907,8]]},"template:docs/data-layer/relationships":{"position":[[2935,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1500,6]]},"template:docs/getting-started/overview":{"position":[[3008,8],[4056,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8726,8]]},"template:docs/route-handlers/functions":{"position":[[479,6]]},"template:docs/testing/assertions":{"position":[[2400,6],[3740,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3040,8],[5136,6]]},"template:templates/docs/data-layer/factories":{"position":[[1852,8],[17336,8]]},"template:templates/docs/data-layer/orm":{"position":[[8907,8]]},"template:templates/docs/data-layer/relationships":{"position":[[2935,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1500,6]]},"template:templates/docs/getting-started/overview":{"position":[[3008,8],[4056,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8726,8]]},"template:templates/docs/route-handlers/functions":{"position":[[479,6]]},"template:templates/docs/testing/assertions":{"position":[[2400,6],[3740,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3040,8],[5136,6]]}},"keywords":{}}],["ad",{"_index":314,"title":{"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[13,5]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[13,5]]}},"text":{"template:docs/advanced/server-configuration":{"position":[[2551,5]]},"template:docs/data-layer/factories":{"position":[[9950,6]]},"template:docs/data-layer/fixtures":{"position":[[3430,5]]},"template:docs/data-layer/relationships":{"position":[[4328,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[60,5]]},"template:docs/getting-started/overview":{"position":[[1303,2],[10729,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3658,5],[3841,5],[8053,5],[17457,6]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[14,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[2551,5]]},"template:templates/docs/data-layer/factories":{"position":[[9950,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[3430,5]]},"template:templates/docs/data-layer/relationships":{"position":[[4328,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[60,5]]},"template:templates/docs/getting-started/overview":{"position":[[1303,2],[10729,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3658,5],[3841,5],[8053,5],[17457,6]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[14,5]]}},"keywords":{}}],["add",{"_index":164,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1906,3],[1971,3]]},"template:docs/advanced/server-configuration":{"position":[[2405,3]]},"template:docs/advanced/switching-between-scenarios":{"position":[[36,4],[450,3],[1200,3]]},"template:docs/data-layer/factories":{"position":[[3361,3]]},"template:docs/data-layer/fixtures":{"position":[[801,3],[4488,3]]},"template:docs/data-layer/orm":{"position":[[262,3],[1923,3],[4862,3]]},"template:docs/data-layer/relationships":{"position":[[143,4],[767,4],[2001,4],[2830,3]]},"template:docs/getting-started/installation":{"position":[[103,3],[223,3],[1013,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[166,3],[858,3],[3080,3],[10054,3],[13702,3],[17068,3]]},"template:docs/route-handlers/functions":{"position":[[1516,3]]},"template:docs/testing/acceptance-tests":{"position":[[596,3],[3932,3]]},"template:docs/testing/assertions":{"position":[[1682,3]]},"template:templates/docs/advanced/environment-options":{"position":[[1906,3],[1971,3]]},"template:templates/docs/advanced/server-configuration":{"position":[[2405,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[36,4],[450,3],[1200,3]]},"template:templates/docs/data-layer/factories":{"position":[[3361,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[801,3],[4488,3]]},"template:templates/docs/data-layer/orm":{"position":[[262,3],[1923,3],[4862,3]]},"template:templates/docs/data-layer/relationships":{"position":[[143,4],[767,4],[2001,4],[2830,3]]},"template:templates/docs/getting-started/installation":{"position":[[103,3],[223,3],[1013,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[166,3],[858,3],[3080,3],[10054,3],[13702,3],[17068,3]]},"template:templates/docs/route-handlers/functions":{"position":[[1516,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[596,3],[3932,3]]},"template:templates/docs/testing/assertions":{"position":[[1682,3]]}},"keywords":{}}],["addit",{"_index":303,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2161,10]]},"template:docs/data-layer/factories":{"position":[[7422,10],[13010,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3532,10],[17512,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1215,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2161,10]]},"template:templates/docs/data-layer/factories":{"position":[[7422,10],[13010,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3532,10],[17512,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1215,8]]}},"keywords":{}}],["addition",{"_index":1322,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3414,13]]},"template:docs/route-handlers/functions":{"position":[[5287,13],[6268,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3414,13]]},"template:templates/docs/route-handlers/functions":{"position":[[5287,13],[6268,13]]}},"keywords":{}}],["addon",{"_index":1160,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[93,5],[524,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1966,6],[17354,5]]},"template:templates/docs/getting-started/installation":{"position":[[93,5],[524,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1966,6],[17354,5]]}},"keywords":{}}],["address",{"_index":1006,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[8709,9]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1724,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7841,8],[7871,7],[8000,8],[8025,10]]},"template:docs/route-handlers/shorthands":{"position":[[3921,14]]},"template:docs/testing/assertions":{"position":[[356,7]]},"template:templates/docs/data-layer/orm":{"position":[[8709,9]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1724,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7841,8],[7871,7],[8000,8],[8025,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[3921,14]]},"template:templates/docs/testing/assertions":{"position":[[356,7]]}},"keywords":{}}],["addressid",{"_index":1085,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[961,9],[1146,10],[1269,11],[1739,12]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[961,9],[1146,10],[1269,11],[1739,12]]}},"keywords":{}}],["adher",{"_index":1155,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[6732,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6732,6]]}},"keywords":{}}],["adjust",{"_index":339,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3780,6],[3855,6]]},"template:docs/route-handlers/functions":{"position":[[765,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[3780,6],[3855,6]]},"template:templates/docs/route-handlers/functions":{"position":[[765,6]]}},"keywords":{}}],["adjust/cr",{"_index":360,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4886,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[4886,13]]}},"keywords":{}}],["admin",{"_index":719,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[14154,5],[14165,10],[14228,5],[14488,7]]},"template:templates/docs/data-layer/factories":{"position":[[14154,5],[14165,10],[14228,5],[14488,7]]}},"keywords":{}}],["administr",{"_index":433,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1653,13],[1672,18],[1732,13]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1653,13],[1672,18],[1732,13]]}},"keywords":{}}],["advanc",{"_index":1703,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3937,8]]},"template:templates/docs/testing/assertions":{"position":[[3937,8]]}},"keywords":{}}],["advantag",{"_index":865,"title":{},"text":{"template:docs/data-layer/models":{"position":[[16,9]]},"template:docs/data-layer/orm":{"position":[[4127,9]]},"template:docs/getting-started/overview":{"position":[[2149,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2303,9],[16372,9],[18106,9]]},"template:docs/route-handlers/functions":{"position":[[5261,9]]},"template:templates/docs/data-layer/models":{"position":[[16,9]]},"template:templates/docs/data-layer/orm":{"position":[[4127,9]]},"template:templates/docs/getting-started/overview":{"position":[[2149,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2303,9],[16372,9],[18106,9]]},"template:templates/docs/route-handlers/functions":{"position":[[5261,9]]}},"keywords":{}}],["advic",{"_index":25,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[172,6],[235,9],[314,7],[686,9],[875,8],[1157,8],[1169,8],[1730,6]]},"template:docs/data-layer/factories":{"position":[[16045,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[172,6],[235,9],[314,7],[686,9],[875,8],[1157,8],[1169,8],[1730,6]]},"template:templates/docs/data-layer/factories":{"position":[[16045,6]]}},"keywords":{}}],["affect",{"_index":423,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1155,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8426,6],[12701,6]]},"template:docs/testing/acceptance-tests":{"position":[[4829,6]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1155,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8426,6],[12701,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4829,6]]}},"keywords":{}}],["aftercr",{"_index":622,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7050,11],[7288,12],[7838,11],[8038,11],[8616,11],[8955,11],[9136,11],[9703,11],[11340,13],[11880,11],[12273,11],[13351,11],[15926,11],[16142,12],[16769,11],[17157,11],[17382,11]]},"template:templates/docs/data-layer/factories":{"position":[[7050,11],[7288,12],[7838,11],[8038,11],[8616,11],[8955,11],[9136,11],[9703,11],[11340,13],[11880,11],[12273,11],[13351,11],[15926,11],[16142,12],[16769,11],[17157,11],[17382,11]]}},"keywords":{}}],["aftercreate(post",{"_index":645,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7936,17],[9366,17],[11658,17],[12417,17]]},"template:templates/docs/data-layer/factories":{"position":[[7936,17],[9366,17],[11658,17],[12417,17]]}},"keywords":{}}],["ag",{"_index":1089,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1771,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4509,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1771,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4509,5]]}},"keywords":{}}],["again",{"_index":980,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[5258,6]]},"template:docs/data-layer/relationships":{"position":[[1646,6]]},"template:docs/testing/acceptance-tests":{"position":[[4696,6]]},"template:templates/docs/data-layer/orm":{"position":[[5258,6]]},"template:templates/docs/data-layer/relationships":{"position":[[1646,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4696,6]]}},"keywords":{}}],["against",{"_index":142,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1278,7],[1347,7]]},"template:docs/data-layer/database":{"position":[[1457,7]]},"template:docs/data-layer/factories":{"position":[[1887,7]]},"template:docs/getting-started/installation":{"position":[[1406,7]]},"template:docs/getting-started/overview":{"position":[[10397,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8740,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1135,7]]},"template:docs/testing/assertions":{"position":[[43,7],[401,7],[611,7],[746,7],[1216,7],[1526,7],[1580,7],[2234,7],[2329,7],[2388,7],[2988,7],[3275,7],[3350,7],[3589,7],[3834,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1847,7],[7421,7]]},"template:templates/docs/advanced/environment-options":{"position":[[1278,7],[1347,7]]},"template:templates/docs/data-layer/database":{"position":[[1457,7]]},"template:templates/docs/data-layer/factories":{"position":[[1887,7]]},"template:templates/docs/getting-started/installation":{"position":[[1406,7]]},"template:templates/docs/getting-started/overview":{"position":[[10397,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8740,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1135,7]]},"template:templates/docs/testing/assertions":{"position":[[43,7],[401,7],[611,7],[746,7],[1216,7],[1526,7],[1580,7],[2234,7],[2329,7],[2388,7],[2988,7],[3275,7],[3350,7],[3589,7],[3834,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1847,7],[7421,7]]}},"keywords":{}}],["ago",{"_index":1381,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8080,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8080,4]]}},"keywords":{}}],["ajax",{"_index":374,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[285,4]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[285,4]]}},"keywords":{}}],["align",{"_index":329,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2905,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5082,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[2905,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5082,7]]}},"keywords":{}}],["allow",{"_index":366,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[45,6]]},"template:docs/data-layer/database":{"position":[[241,6]]},"template:docs/data-layer/orm":{"position":[[335,6],[8505,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1451,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16738,6]]},"template:docs/testing/assertions":{"position":[[2151,8]]},"template:docs/testing/setup-mirage":{"position":[[184,6],[581,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[45,6]]},"template:templates/docs/data-layer/database":{"position":[[241,6]]},"template:templates/docs/data-layer/orm":{"position":[[335,6],[8505,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1451,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16738,6]]},"template:templates/docs/testing/assertions":{"position":[[2151,8]]},"template:templates/docs/testing/setup-mirage":{"position":[[184,6],[581,6]]}},"keywords":{}}],["along",{"_index":252,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[364,5]]},"template:docs/getting-started/overview":{"position":[[10764,5]]},"template:docs/route-handlers/shorthands":{"position":[[2651,5],[3342,5]]},"template:docs/testing/assertions":{"position":[[2858,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[364,5]]},"template:templates/docs/getting-started/overview":{"position":[[10764,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2651,5],[3342,5]]},"template:templates/docs/testing/assertions":{"position":[[2858,6]]}},"keywords":{}}],["alongsid",{"_index":1306,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2098,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[862,9]]},"template:docs/testing/assertions":{"position":[[466,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2098,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[862,9]]},"template:templates/docs/testing/assertions":{"position":[[466,9]]}},"keywords":{}}],["alreadi",{"_index":238,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[1117,7],[1195,7]]},"template:docs/data-layer/factories":{"position":[[8681,7],[9194,7]]},"template:docs/data-layer/orm":{"position":[[4690,7]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[136,7]]},"template:docs/getting-started/overview":{"position":[[1612,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2988,7]]},"template:docs/route-handlers/functions":{"position":[[5109,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2471,7]]},"template:templates/docs/advanced/mocking-guids":{"position":[[1117,7],[1195,7]]},"template:templates/docs/data-layer/factories":{"position":[[8681,7],[9194,7]]},"template:templates/docs/data-layer/orm":{"position":[[4690,7]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[136,7]]},"template:templates/docs/getting-started/overview":{"position":[[1612,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2988,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5109,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2471,7]]}},"keywords":{}}],["altern",{"_index":773,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17621,11]]},"template:docs/getting-started/what-is-mirage":{"position":[[1662,12]]},"template:templates/docs/data-layer/factories":{"position":[[17621,11]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1662,12]]}},"keywords":{}}],["although",{"_index":365,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[29,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13944,9]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[29,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13944,9]]}},"keywords":{}}],["alway",{"_index":460,"title":{},"text":{"template:docs/data-layer/database":{"position":[[610,6]]},"template:docs/data-layer/factories":{"position":[[11174,7]]},"template:docs/data-layer/fixtures":{"position":[[3660,6]]},"template:docs/getting-started/installation":{"position":[[1438,6]]},"template:docs/getting-started/overview":{"position":[[5808,6],[9872,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9346,6],[10905,6],[18685,6]]},"template:docs/testing/acceptance-tests":{"position":[[5026,6],[5168,6]]},"template:templates/docs/data-layer/database":{"position":[[610,6]]},"template:templates/docs/data-layer/factories":{"position":[[11174,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[3660,6]]},"template:templates/docs/getting-started/installation":{"position":[[1438,6]]},"template:templates/docs/getting-started/overview":{"position":[[5808,6],[9872,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9346,6],[10905,6],[18685,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5026,6],[5168,6]]}},"keywords":{}}],["alwaysincludelinkagedata",{"_index":1130,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4176,25]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10771,24],[11083,25]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4176,25]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10771,24],[11083,25]]}},"keywords":{}}],["america",{"_index":1334,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4036,9],[4124,9],[4279,9],[4350,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4036,9],[4124,9],[4279,9],[4350,9]]}},"keywords":{}}],["ann",{"_index":1242,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6843,5],[9039,5]]},"template:templates/docs/getting-started/overview":{"position":[[6843,5],[9039,5]]}},"keywords":{}}],["annot",{"_index":1038,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2909,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2909,10]]}},"keywords":{}}],["anonym",{"_index":502,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[232,9],[14078,9],[14093,14],[14205,10],[14460,11]]},"template:templates/docs/data-layer/factories":{"position":[[232,9],[14078,9],[14093,14],[14205,10],[14460,11]]}},"keywords":{}}],["anoth",{"_index":738,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15558,7]]},"template:docs/data-layer/orm":{"position":[[6357,7]]},"template:docs/data-layer/relationships":{"position":[[192,7],[536,7]]},"template:docs/data-layer/serializers/index":{"position":[[3657,7]]},"template:docs/route-handlers/functions":{"position":[[4798,7]]},"template:docs/testing/acceptance-tests":{"position":[[2685,7]]},"template:docs/testing/assertions":{"position":[[2262,7]]},"template:templates/docs/data-layer/factories":{"position":[[15558,7]]},"template:templates/docs/data-layer/orm":{"position":[[6357,7]]},"template:templates/docs/data-layer/relationships":{"position":[[192,7],[536,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3657,7]]},"template:templates/docs/route-handlers/functions":{"position":[[4798,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2685,7]]},"template:templates/docs/testing/assertions":{"position":[[2262,7]]}},"keywords":{}}],["anotherauthor",{"_index":1013,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1093,14]]},"template:templates/docs/data-layer/relationships":{"position":[[1093,14]]}},"keywords":{}}],["anyth",{"_index":585,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4635,8],[10275,8]]},"template:docs/data-layer/orm":{"position":[[5414,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3054,8]]},"template:templates/docs/data-layer/factories":{"position":[[4635,8],[10275,8]]},"template:templates/docs/data-layer/orm":{"position":[[5414,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3054,8]]}},"keywords":{}}],["api",{"_index":335,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3267,6],[3701,6],[5347,6]]},"template:docs/data-layer/database":{"position":[[1910,4],[1926,3]]},"template:docs/data-layer/factories":{"position":[[13680,3]]},"template:docs/data-layer/fixtures":{"position":[[1678,3],[1748,3],[2696,3]]},"template:docs/data-layer/orm":{"position":[[770,4]]},"template:docs/data-layer/relationships":{"position":[[6013,3],[6227,4]]},"template:docs/data-layer/serializers/index":{"position":[[906,3],[1016,3],[3537,3],[5268,3],[6935,3]]},"template:docs/getting-started/overview":{"position":[[258,3],[434,6],[7676,3],[9330,3],[10104,4],[10417,4],[10496,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5385,4],[6691,3],[8856,3],[9510,4],[14196,3],[14904,3]]},"template:docs/getting-started/what-is-mirage":{"position":[[95,5]]},"template:docs/route-handlers/functions":{"position":[[1308,6],[7146,4],[7529,3]]},"template:docs/route-handlers/shorthands":{"position":[[12,4]]},"template:docs/testing/assertions":{"position":[[4003,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3932,3]]},"template:docs/testing/setup-mirage":{"position":[[1597,5]]},"template:index":{"position":[[324,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[3267,6],[3701,6],[5347,6]]},"template:templates/docs/data-layer/database":{"position":[[1910,4],[1926,3]]},"template:templates/docs/data-layer/factories":{"position":[[13680,3]]},"template:templates/docs/data-layer/fixtures":{"position":[[1678,3],[1748,3],[2696,3]]},"template:templates/docs/data-layer/orm":{"position":[[770,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6013,3],[6227,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[906,3],[1016,3],[3537,3],[5268,3],[6935,3]]},"template:templates/docs/getting-started/overview":{"position":[[258,3],[434,6],[7676,3],[9330,3],[10104,4],[10417,4],[10496,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5385,4],[6691,3],[8856,3],[9510,4],[14196,3],[14904,3]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[95,5]]},"template:templates/docs/route-handlers/functions":{"position":[[1308,6],[7146,4],[7529,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[12,4]]},"template:templates/docs/testing/assertions":{"position":[[4003,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3932,3]]},"template:templates/docs/testing/setup-mirage":{"position":[[1597,5]]},"template:templates/index":{"position":[[324,4]]}},"keywords":{}}],["api/advic",{"_index":39,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[485,13],[1571,12]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[485,13],[1571,12]]}},"keywords":{}}],["api/movi",{"_index":1188,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[735,12],[2940,11],[4389,11],[4481,11]]},"template:templates/docs/getting-started/overview":{"position":[[735,12],[2940,11],[4389,11],[4481,11]]}},"keywords":{}}],["api/movies/${movie.id}/cast-memb",{"_index":1138,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4875,38]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4875,38]]}},"keywords":{}}],["api/movies/1",{"_index":927,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[857,13],[911,13]]},"template:templates/docs/data-layer/orm":{"position":[[857,13],[911,13]]}},"keywords":{}}],["api/movies/1/cast-memb",{"_index":1139,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5117,28]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5117,28]]}},"keywords":{}}],["api/movies/1?include=director",{"_index":981,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[5549,30]]},"template:templates/docs/data-layer/orm":{"position":[[5549,30]]}},"keywords":{}}],["api/users/1",{"_index":1408,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[10328,14]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10328,14]]}},"keywords":{}}],["app",{"_index":158,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1647,3]]},"template:docs/advanced/server-configuration":{"position":[[531,3]]},"template:docs/data-layer/database":{"position":[[357,4]]},"template:docs/data-layer/factories":{"position":[[417,4],[993,4],[7582,4],[7758,4],[8384,3],[12083,4],[14600,3],[14698,3],[15461,3]]},"template:docs/data-layer/models":{"position":[[540,3],[742,4]]},"template:docs/data-layer/orm":{"position":[[704,3]]},"template:docs/data-layer/serializers/index":{"position":[[391,4],[858,4],[1166,4],[1365,4],[1413,3],[3197,3],[3902,4],[4501,3],[4599,3]]},"template:docs/getting-started/installation":{"position":[[1160,4],[1247,3],[1612,3]]},"template:docs/getting-started/overview":{"position":[[708,3],[4362,3],[7153,3],[7552,4],[10058,4],[10158,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1787,4],[5653,5],[8533,4],[9225,4],[9385,3],[13982,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[636,4],[1010,3],[1044,3],[1131,3],[1943,4]]},"template:docs/route-handlers/functions":{"position":[[316,3],[860,3],[2180,3],[2484,4],[4156,3],[5033,3],[6976,4],[7110,3]]},"template:docs/route-handlers/shorthands":{"position":[[2641,3],[3332,3]]},"template:docs/testing/acceptance-tests":{"position":[[48,3],[358,4],[4093,3]]},"template:docs/testing/assertions":{"position":[[120,4],[281,3],[547,3],[680,3],[880,3],[1475,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3080,4],[3251,3]]},"template:docs/testing/setup-mirage":{"position":[[841,3]]},"template:index":{"position":[[82,4],[248,3]]},"template:templates/docs/advanced/environment-options":{"position":[[1647,3]]},"template:templates/docs/advanced/server-configuration":{"position":[[531,3]]},"template:templates/docs/data-layer/database":{"position":[[357,4]]},"template:templates/docs/data-layer/factories":{"position":[[417,4],[993,4],[7582,4],[7758,4],[8384,3],[12083,4],[14600,3],[14698,3],[15461,3]]},"template:templates/docs/data-layer/models":{"position":[[540,3],[742,4]]},"template:templates/docs/data-layer/orm":{"position":[[704,3]]},"template:templates/docs/data-layer/serializers/index":{"position":[[391,4],[858,4],[1166,4],[1365,4],[1413,3],[3197,3],[3902,4],[4501,3],[4599,3]]},"template:templates/docs/getting-started/installation":{"position":[[1160,4],[1247,3],[1612,3]]},"template:templates/docs/getting-started/overview":{"position":[[708,3],[4362,3],[7153,3],[7552,4],[10058,4],[10158,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1787,4],[5653,5],[8533,4],[9225,4],[9385,3],[13982,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[636,4],[1010,3],[1044,3],[1131,3],[1943,4]]},"template:templates/docs/route-handlers/functions":{"position":[[316,3],[860,3],[2180,3],[2484,4],[4156,3],[5033,3],[6976,4],[7110,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2641,3],[3332,3]]},"template:templates/docs/testing/acceptance-tests":{"position":[[48,3],[358,4],[4093,3]]},"template:templates/docs/testing/assertions":{"position":[[120,4],[281,3],[547,3],[680,3],[880,3],[1475,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3080,4],[3251,3]]},"template:templates/docs/testing/setup-mirage":{"position":[[841,3]]},"template:templates/index":{"position":[[82,4],[248,3]]}},"keywords":{}}],["app'",{"_index":152,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1512,5],[1790,5],[2800,5]]},"template:docs/data-layer/database":{"position":[[1522,5]]},"template:docs/testing/acceptance-tests":{"position":[[173,5],[1353,5]]},"template:docs/testing/assertions":{"position":[[62,5],[1228,5],[3287,5],[3653,5]]},"template:templates/docs/advanced/environment-options":{"position":[[1512,5],[1790,5],[2800,5]]},"template:templates/docs/data-layer/database":{"position":[[1522,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[173,5],[1353,5]]},"template:templates/docs/testing/assertions":{"position":[[62,5],[1228,5],[3287,5],[3653,5]]}},"keywords":{}}],["app-nam",{"_index":1764,"title":{},"text":{"template:docs/testing/setup-mirage":{"position":[[822,8]]},"template:templates/docs/testing/setup-mirage":{"position":[[822,8]]}},"keywords":{}}],["app-name/mirage/config",{"_index":1763,"title":{},"text":{"template:docs/testing/setup-mirage":{"position":[[785,25]]},"template:templates/docs/testing/setup-mirage":{"position":[[785,25]]}},"keywords":{}}],["app.import",{"_index":1303,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1853,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1853,10]]}},"keywords":{}}],["app/initializers/custom-inflector-rules.j",{"_index":66,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[945,42]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[945,42]]}},"keywords":{}}],["app/mirag",{"_index":177,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2259,12],[2340,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13627,11],[13855,10]]},"template:templates/docs/advanced/environment-options":{"position":[[2259,12],[2340,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13627,11],[13855,10]]}},"keywords":{}}],["app/models/blog-post.j",{"_index":1054,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4755,23]]},"template:templates/docs/data-layer/relationships":{"position":[[4755,23]]}},"keywords":{}}],["app/models/car.j",{"_index":1071,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5604,17]]},"template:templates/docs/data-layer/relationships":{"position":[[5604,17]]}},"keywords":{}}],["app/models/comment.j",{"_index":1053,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4650,21]]},"template:templates/docs/data-layer/relationships":{"position":[[4650,21]]}},"keywords":{}}],["app/models/picture.j",{"_index":1055,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4836,21]]},"template:templates/docs/data-layer/relationships":{"position":[[4836,21]]}},"keywords":{}}],["app/models/user.j",{"_index":1070,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5509,18]]},"template:templates/docs/data-layer/relationships":{"position":[[5509,18]]}},"keywords":{}}],["app/models/watch.j",{"_index":1072,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5659,19]]},"template:templates/docs/data-layer/relationships":{"position":[[5659,19]]}},"keywords":{}}],["appli",{"_index":346,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4192,5],[4259,5],[4361,5]]},"template:docs/data-layer/factories":{"position":[[9775,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1864,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6210,7],[7374,7]]},"template:docs/testing/acceptance-tests":{"position":[[1308,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[4192,5],[4259,5],[4361,5]]},"template:templates/docs/data-layer/factories":{"position":[[9775,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1864,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6210,7],[7374,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1308,7]]}},"keywords":{}}],["applic",{"_index":70,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1059,11]]},"template:docs/advanced/mocking-guids":{"position":[[20,12]]},"template:docs/advanced/server-configuration":{"position":[[4547,11],[4583,11],[4780,12]]},"template:docs/data-layer/database":{"position":[[207,12]]},"template:docs/data-layer/factories":{"position":[[2048,13]]},"template:docs/data-layer/models":{"position":[[250,11]]},"template:docs/data-layer/orm":{"position":[[4336,11]]},"template:docs/data-layer/serializers/index":{"position":[[1779,12],[2599,11],[2770,16],[2919,11],[4761,16],[6032,11],[7038,12],[7295,12]]},"template:docs/getting-started/installation":{"position":[[238,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1900,11]]},"template:docs/getting-started/what-is-mirage":{"position":[[364,11],[1194,11]]},"template:docs/testing/acceptance-tests":{"position":[[551,11]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1059,11]]},"template:templates/docs/advanced/mocking-guids":{"position":[[20,12]]},"template:templates/docs/advanced/server-configuration":{"position":[[4547,11],[4583,11],[4780,12]]},"template:templates/docs/data-layer/database":{"position":[[207,12]]},"template:templates/docs/data-layer/factories":{"position":[[2048,13]]},"template:templates/docs/data-layer/models":{"position":[[250,11]]},"template:templates/docs/data-layer/orm":{"position":[[4336,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1779,12],[2599,11],[2770,16],[2919,11],[4761,16],[6032,11],[7038,12],[7295,12]]},"template:templates/docs/getting-started/installation":{"position":[[238,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1900,11]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[364,11],[1194,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[551,11]]}},"keywords":{}}],["application'",{"_index":182,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2449,13]]},"template:docs/advanced/server-configuration":{"position":[[1750,13]]},"template:docs/data-layer/models":{"position":[[70,13]]},"template:docs/data-layer/orm":{"position":[[2701,13],[2803,13],[3068,13],[8776,13]]},"template:docs/data-layer/serializers/index":{"position":[[3098,13]]},"template:docs/route-handlers/shorthands":{"position":[[5938,13]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4167,13]]},"template:templates/docs/advanced/environment-options":{"position":[[2449,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[1750,13]]},"template:templates/docs/data-layer/models":{"position":[[70,13]]},"template:templates/docs/data-layer/orm":{"position":[[2701,13],[2803,13],[3068,13],[8776,13]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3098,13]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5938,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4167,13]]}},"keywords":{}}],["application-wid",{"_index":213,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[288,16]]},"template:docs/data-layer/serializers/index":{"position":[[2162,16]]},"template:templates/docs/advanced/mocking-guids":{"position":[[288,16]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2162,16]]}},"keywords":{}}],["application/json",{"_index":1578,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6318,17]]},"template:templates/docs/route-handlers/functions":{"position":[[6318,17]]}},"keywords":{}}],["applicationseri",{"_index":1116,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[2743,21],[4734,21],[6834,21]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2743,21],[4734,21],[6834,21]]}},"keywords":{}}],["applicationserializer.extend",{"_index":1117,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[2802,30],[4793,30]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2802,30],[4793,30]]}},"keywords":{}}],["application|modelnam",{"_index":218,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[447,23]]},"template:templates/docs/advanced/mocking-guids":{"position":[[447,23]]}},"keywords":{}}],["applyemberdataseri",{"_index":353,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4330,25],[4981,25]]},"template:templates/docs/advanced/server-configuration":{"position":[[4330,25],[4981,25]]}},"keywords":{"module:ember-cli-mirage/ember-data":{"position":[null]}}}],["applyemberdataserializers(config.seri",{"_index":362,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[5213,46]]},"template:templates/docs/advanced/server-configuration":{"position":[[5213,46]]}},"keywords":{}}],["approach",{"_index":85,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1422,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10488,8],[14308,8]]},"template:docs/testing/acceptance-tests":{"position":[[2617,8],[3502,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4073,8],[5009,8]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1422,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10488,8],[14308,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2617,8],[3502,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4073,8],[5009,8]]}},"keywords":{}}],["appropri",{"_index":1112,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[2118,11]]},"template:docs/route-handlers/shorthands":{"position":[[2701,11],[3392,11],[4159,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2118,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2701,11],[3392,11],[4159,11]]}},"keywords":{}}],["arbitrari",{"_index":856,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[4919,9]]},"template:docs/data-layer/orm":{"position":[[8623,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[4919,9]]},"template:templates/docs/data-layer/orm":{"position":[[8623,9]]}},"keywords":{}}],["architectur",{"_index":1097,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[443,12]]},"template:templates/docs/data-layer/serializers/index":{"position":[[443,12]]}},"keywords":{}}],["aren't",{"_index":671,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9609,6]]},"template:templates/docs/data-layer/factories":{"position":[[9609,6]]}},"keywords":{}}],["argument",{"_index":270,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[950,8],[1247,8]]},"template:docs/data-layer/database":{"position":[[957,9]]},"template:docs/data-layer/factories":{"position":[[1241,9],[1525,8],[4553,8],[8026,8],[10404,8],[11243,9]]},"template:docs/data-layer/fixtures":{"position":[[2137,8]]},"template:docs/data-layer/orm":{"position":[[3966,8]]},"template:docs/data-layer/serializers/index":{"position":[[6174,9]]},"template:docs/getting-started/overview":{"position":[[2451,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6447,9]]},"template:docs/route-handlers/functions":{"position":[[430,8],[701,8],[3817,9],[5899,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[950,8],[1247,8]]},"template:templates/docs/data-layer/database":{"position":[[957,9]]},"template:templates/docs/data-layer/factories":{"position":[[1241,9],[1525,8],[4553,8],[8026,8],[10404,8],[11243,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[2137,8]]},"template:templates/docs/data-layer/orm":{"position":[[3966,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6174,9]]},"template:templates/docs/getting-started/overview":{"position":[[2451,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6447,9]]},"template:templates/docs/route-handlers/functions":{"position":[[430,8],[701,8],[3817,9],[5899,9]]}},"keywords":{}}],["around",{"_index":1283,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10924,6]]},"template:templates/docs/getting-started/overview":{"position":[[10924,6]]}},"keywords":{}}],["arrang",{"_index":1642,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3432,8],[3481,8],[3720,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3432,8],[3481,8],[3720,7]]}},"keywords":{}}],["array",{"_index":853,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[4495,5]]},"template:docs/data-layer/relationships":{"position":[[2242,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12890,6]]},"template:docs/testing/assertions":{"position":[[3013,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[4495,5]]},"template:templates/docs/data-layer/relationships":{"position":[[2242,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12890,6]]},"template:templates/docs/testing/assertions":{"position":[[3013,5]]}},"keywords":{}}],["arrow",{"_index":1145,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5663,5]]},"template:docs/route-handlers/functions":{"position":[[5363,5],[5498,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5663,5]]},"template:templates/docs/route-handlers/functions":{"position":[[5363,5],[5498,5]]}},"keywords":{}}],["articl",{"_index":1723,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2169,9],[2215,7],[2637,9],[3553,9],[3766,7],[4523,9],[6671,9]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2169,9],[2215,7],[2637,9],[3553,9],[3766,7],[4523,9],[6671,9]]}},"keywords":{}}],["article={{articl",{"_index":1724,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2254,21]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2254,21]]}},"keywords":{}}],["article={{this.articl",{"_index":1728,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2793,26],[3711,26],[4828,26],[6993,26]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2793,26],[3711,26],[4828,26],[6993,26]]}},"keywords":{}}],["articleform",{"_index":1722,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[2010,13],[2069,13],[2241,12],[2537,13],[2780,12],[3698,12],[4423,13],[4815,12],[6571,13],[6980,12]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2010,13],[2069,13],[2241,12],[2537,13],[2780,12],[3698,12],[4423,13],[4815,12],[6571,13],[6980,12]]}},"keywords":{}}],["ascertain",{"_index":1487,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[17371,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17371,9]]}},"keywords":{}}],["ask",{"_index":1434,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13304,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13304,3]]}},"keywords":{}}],["aspect",{"_index":1127,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3675,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3675,6]]}},"keywords":{}}],["assert",{"_index":141,"title":{"template:docs/testing/assertions":{"position":[[0,10]]},"template:templates/docs/testing/assertions":{"position":[[0,10]]}},"text":{"template:docs/advanced/environment-options":{"position":[[1268,9],[1336,10]]},"template:docs/data-layer/database":{"position":[[1450,6]]},"template:docs/data-layer/factories":{"position":[[15500,6],[16611,9],[17553,11]]},"template:docs/testing/acceptance-tests":{"position":[[3446,6],[3495,6],[3793,6],[3947,10]]},"template:docs/testing/assertions":{"position":[[1,10],[36,6],[171,6],[394,6],[484,11],[601,9],[657,6],[739,6],[1209,6],[1516,9],[1573,6],[2224,9],[2319,9],[2381,6],[2981,6],[3268,6],[3343,6],[3579,9],[3827,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2341,6],[2885,6],[4920,6],[7085,6],[7411,9]]},"template:templates/docs/advanced/environment-options":{"position":[[1268,9],[1336,10]]},"template:templates/docs/data-layer/database":{"position":[[1450,6]]},"template:templates/docs/data-layer/factories":{"position":[[15500,6],[16611,9],[17553,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3446,6],[3495,6],[3793,6],[3947,10]]},"template:templates/docs/testing/assertions":{"position":[[1,10],[36,6],[171,6],[394,6],[484,11],[601,9],[657,6],[739,6],[1209,6],[1516,9],[1573,6],[2224,9],[2319,9],[2381,6],[2981,6],[3268,6],[3343,6],[3579,9],[3827,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2341,6],[2885,6],[4920,6],[7085,6],[7411,9]]}},"keywords":{}}],["assert.deepequal(requests[0].queryparam",{"_index":1700,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3477,41]]},"template:templates/docs/testing/assertions":{"position":[[3477,41]]}},"keywords":{}}],["assert.dom(\"[data-test-id='movie-row']\").exist",{"_index":1225,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5288,49]]},"template:templates/docs/getting-started/overview":{"position":[[5288,49]]}},"keywords":{}}],["assert.dom('h1').hastext('interstellar",{"_index":1641,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3386,41]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3386,41]]}},"keywords":{}}],["assert.dom('h1').hastext('mi",{"_index":757,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16531,28],[17110,28]]},"template:templates/docs/data-layer/factories":{"position":[[16531,28],[17110,28]]}},"keywords":{}}],["assert.dom('h1').hastext('upd",{"_index":1681,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1237,33]]},"template:templates/docs/testing/assertions":{"position":[[1237,33]]}},"keywords":{}}],["assert.dom('h1').includestext(\"interstellar",{"_index":1229,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5595,46]]},"template:templates/docs/getting-started/overview":{"position":[[5595,46]]}},"keywords":{}}],["assert.dom('h2').hastext('th",{"_index":1662,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4442,29]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4442,29]]}},"keywords":{}}],["assert.dom('h2').includestext('new",{"_index":491,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1752,34]]},"template:templates/docs/data-layer/database":{"position":[[1752,34]]}},"keywords":{}}],["assert.dom('li.cast-member').exist",{"_index":1246,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6946,37]]},"template:templates/docs/getting-started/overview":{"position":[[6946,37]]}},"keywords":{}}],["assert.dom('li.movie').exist",{"_index":736,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15325,31]]},"template:docs/testing/acceptance-tests":{"position":[[1797,31],[3154,31],[3800,31]]},"template:templates/docs/data-layer/factories":{"position":[[15325,31]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1797,31],[3154,31],[3800,31]]}},"keywords":{}}],["assert.dom('option.country').exist",{"_index":826,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2605,37]]},"template:templates/docs/data-layer/fixtures":{"position":[[2605,37]]}},"keywords":{}}],["assert.dom('p').exist",{"_index":1672,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[5586,24]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5586,24]]}},"keywords":{}}],["assert.dom('tr').exist",{"_index":1697,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3296,25]]},"template:templates/docs/testing/assertions":{"position":[[3296,25]]}},"keywords":{}}],["assert.dom().includestext('sav",{"_index":1689,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1937,36]]},"template:templates/docs/testing/assertions":{"position":[[1937,36]]}},"keywords":{}}],["assert.equal(post.reload().tagids.includes(programming.id",{"_index":1690,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1974,60]]},"template:templates/docs/testing/assertions":{"position":[[1974,60]]}},"keywords":{}}],["assert.equal(requests.length",{"_index":1699,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3443,29]]},"template:templates/docs/testing/assertions":{"position":[[3443,29]]}},"keywords":{}}],["assert.equal(this.element.textcont",{"_index":1716,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[875,38],[1664,38]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[875,38],[1664,38]]}},"keywords":{}}],["assert.equal(this.server.db.lessons[0].titl",{"_index":1682,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1340,45]]},"template:templates/docs/testing/assertions":{"position":[[1340,45]]}},"keywords":{}}],["assert.equal(this.server.db.movies[0].titl",{"_index":492,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1803,44]]},"template:templates/docs/data-layer/database":{"position":[[1803,44]]}},"keywords":{}}],["assign",{"_index":204,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[183,7]]},"template:docs/data-layer/database":{"position":[[1264,7]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[419,6],[1120,6]]},"template:docs/getting-started/overview":{"position":[[3965,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[183,7]]},"template:templates/docs/data-layer/database":{"position":[[1264,7]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[419,6],[1120,6]]},"template:templates/docs/getting-started/overview":{"position":[[3965,6]]}},"keywords":{}}],["associ",{"_index":642,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7809,10],[8526,10],[8700,10],[9030,10],[9213,10],[9750,13],[12092,11],[12115,13],[12521,13],[12620,11],[12689,13],[12801,13],[12875,12],[12969,13],[13121,12],[17241,11]]},"template:docs/data-layer/fixtures":{"position":[[4536,12],[4861,12],[4959,12]]},"template:docs/data-layer/orm":{"position":[[7046,10]]},"template:docs/data-layer/relationships":{"position":[[939,10],[2096,10],[2469,11],[2507,12],[2556,11],[2613,12],[4434,11],[4463,11],[5025,13],[5051,12]]},"template:docs/getting-started/overview":{"position":[[5766,12],[5792,12],[5859,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17083,11]]},"template:docs/testing/assertions":{"position":[[2874,10]]},"template:templates/docs/data-layer/factories":{"position":[[7809,10],[8526,10],[8700,10],[9030,10],[9213,10],[9750,13],[12092,11],[12115,13],[12521,13],[12620,11],[12689,13],[12801,13],[12875,12],[12969,13],[13121,12],[17241,11]]},"template:templates/docs/data-layer/fixtures":{"position":[[4536,12],[4861,12],[4959,12]]},"template:templates/docs/data-layer/orm":{"position":[[7046,10]]},"template:templates/docs/data-layer/relationships":{"position":[[939,10],[2096,10],[2469,11],[2507,12],[2556,11],[2613,12],[4434,11],[4463,11],[5025,13],[5051,12]]},"template:templates/docs/getting-started/overview":{"position":[[5766,12],[5792,12],[5859,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17083,11]]},"template:templates/docs/testing/assertions":{"position":[[2874,10]]}},"keywords":{}}],["association('admin",{"_index":708,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13215,20]]},"template:templates/docs/data-layer/factories":{"position":[[13215,20]]}},"keywords":{}}],["asssoci",{"_index":1069,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5467,13]]},"template:templates/docs/data-layer/relationships":{"position":[[5467,13]]}},"keywords":{}}],["assum",{"_index":620,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6923,8]]},"template:docs/data-layer/orm":{"position":[[4306,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8326,9]]},"template:docs/route-handlers/functions":{"position":[[5016,7]]},"template:docs/testing/acceptance-tests":{"position":[[529,8],[1198,6]]},"template:templates/docs/data-layer/factories":{"position":[[6923,8]]},"template:templates/docs/data-layer/orm":{"position":[[4306,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8326,9]]},"template:templates/docs/route-handlers/functions":{"position":[[5016,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[529,8],[1198,6]]}},"keywords":{}}],["async",{"_index":483,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1632,5]]},"template:docs/data-layer/factories":{"position":[[15246,5],[16303,5],[16975,5]]},"template:docs/data-layer/fixtures":{"position":[[2523,5]]},"template:docs/getting-started/overview":{"position":[[5205,5],[5466,5],[6655,5]]},"template:docs/testing/acceptance-tests":{"position":[[894,5],[1717,5],[3074,5],[3692,5],[4223,5],[5511,5],[5798,5]]},"template:docs/testing/assertions":{"position":[[1020,5],[1704,5],[3075,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[682,5],[1413,5],[2179,5],[2647,5],[4533,5],[6681,5]]},"template:docs/testing/setup-mirage":{"position":[[503,5],[992,5],[1884,5]]},"template:templates/docs/data-layer/database":{"position":[[1632,5]]},"template:templates/docs/data-layer/factories":{"position":[[15246,5],[16303,5],[16975,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[2523,5]]},"template:templates/docs/getting-started/overview":{"position":[[5205,5],[5466,5],[6655,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[894,5],[1717,5],[3074,5],[3692,5],[4223,5],[5511,5],[5798,5]]},"template:templates/docs/testing/assertions":{"position":[[1020,5],[1704,5],[3075,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[682,5],[1413,5],[2179,5],[2647,5],[4533,5],[6681,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[503,5],[992,5],[1884,5]]}},"keywords":{}}],["attempt",{"_index":1565,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5610,8]]},"template:docs/testing/acceptance-tests":{"position":[[4207,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5610,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4207,7]]}},"keywords":{}}],["attr",{"_index":354,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4386,5]]},"template:docs/data-layer/models":{"position":[[1146,5]]},"template:docs/data-layer/relationships":{"position":[[5787,5],[5825,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[97,5],[126,5],[1337,5]]},"template:docs/data-layer/serializers/index":{"position":[[1757,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16023,5]]},"template:docs/route-handlers/functions":{"position":[[4493,5],[4535,5],[5971,5],[6598,5]]},"template:docs/route-handlers/shorthands":{"position":[[848,5],[2464,5],[3145,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[4386,5]]},"template:templates/docs/data-layer/models":{"position":[[1146,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5787,5],[5825,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[97,5],[126,5],[1337,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1757,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16023,5]]},"template:templates/docs/route-handlers/functions":{"position":[[4493,5],[4535,5],[5971,5],[6598,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[848,5],[2464,5],[3145,5]]}},"keywords":{}}],["attribut",{"_index":531,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1489,10],[1991,9],[2133,11],[2980,10],[4350,9],[4493,10],[4605,10],[4850,10],[5021,10],[5185,10],[5196,10],[5227,10],[6430,9],[7383,11],[8883,9],[9903,11],[10558,11],[11139,10],[11211,9],[15826,10]]},"template:docs/data-layer/fixtures":{"position":[[1529,11]]},"template:docs/data-layer/orm":{"position":[[960,11],[1241,11],[1342,11],[1543,10],[1717,11],[2269,11],[2512,10],[3357,11],[3416,10],[3511,10],[4587,11],[5648,11],[5846,11],[5974,10],[7495,9]]},"template:docs/data-layer/serializers/index":{"position":[[310,11],[3209,9],[4312,11],[5025,11]]},"template:docs/getting-started/overview":{"position":[[511,11],[576,11],[638,11],[1109,10],[4526,11],[4616,11],[5377,9],[7500,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7953,11],[9609,11],[10262,11]]},"template:docs/route-handlers/functions":{"position":[[4236,11],[4673,9]]},"template:docs/route-handlers/shorthands":{"position":[[995,10]]},"template:docs/testing/acceptance-tests":{"position":[[2908,10]]},"template:templates/docs/data-layer/factories":{"position":[[1489,10],[1991,9],[2133,11],[2980,10],[4350,9],[4493,10],[4605,10],[4850,10],[5021,10],[5185,10],[5196,10],[5227,10],[6430,9],[7383,11],[8883,9],[9903,11],[10558,11],[11139,10],[11211,9],[15826,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[1529,11]]},"template:templates/docs/data-layer/orm":{"position":[[960,11],[1241,11],[1342,11],[1543,10],[1717,11],[2269,11],[2512,10],[3357,11],[3416,10],[3511,10],[4587,11],[5648,11],[5846,11],[5974,10],[7495,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[310,11],[3209,9],[4312,11],[5025,11]]},"template:templates/docs/getting-started/overview":{"position":[[511,11],[576,11],[638,11],[1109,10],[4526,11],[4616,11],[5377,9],[7500,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7953,11],[9609,11],[10262,11]]},"template:templates/docs/route-handlers/functions":{"position":[[4236,11],[4673,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[995,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2908,10]]}},"keywords":{}}],["attrs.nam",{"_index":1580,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6649,12]]},"template:templates/docs/route-handlers/functions":{"position":[[6649,12]]}},"keywords":{}}],["augment",{"_index":288,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1644,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[1644,7]]}},"keywords":{}}],["author",{"_index":830,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2972,7],[3132,7],[4441,7]]},"template:docs/data-layer/models":{"position":[[2589,7]]},"template:docs/data-layer/relationships":{"position":[[664,7],[732,6],[950,6],[1059,6],[1150,6],[1200,6],[1514,6],[1780,7],[2761,7],[2848,6],[3811,7],[4201,7],[4365,6]]},"template:docs/getting-started/overview":{"position":[[2537,7],[3247,6],[9606,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9647,7],[9830,6],[10147,7],[10300,7],[11861,7],[11957,7],[11979,6],[12027,7],[12096,7],[12454,7],[12861,6]]},"template:docs/testing/acceptance-tests":{"position":[[5501,9],[5788,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[2972,7],[3132,7],[4441,7]]},"template:templates/docs/data-layer/models":{"position":[[2589,7]]},"template:templates/docs/data-layer/relationships":{"position":[[664,7],[732,6],[950,6],[1059,6],[1150,6],[1200,6],[1514,6],[1780,7],[2761,7],[2848,6],[3811,7],[4201,7],[4365,6]]},"template:templates/docs/getting-started/overview":{"position":[[2537,7],[3247,6],[9606,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9647,7],[9830,6],[10147,7],[10300,7],[11861,7],[11957,7],[11979,6],[12027,7],[12096,7],[12454,7],[12861,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5501,9],[5788,9]]}},"keywords":{}}],["authorid",{"_index":839,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3349,9],[3439,8],[3571,9],[4083,9],[4706,9]]},"template:docs/data-layer/relationships":{"position":[[875,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12800,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[3349,9],[3439,8],[3571,9],[4083,9],[4706,9]]},"template:templates/docs/data-layer/relationships":{"position":[[875,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12800,8]]}},"keywords":{}}],["authors/1",{"_index":1402,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9864,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9864,11]]}},"keywords":{}}],["auto",{"_index":341,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3937,4]]},"template:docs/data-layer/serializers/index":{"position":[[1842,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1427,4],[2399,4],[2576,4],[2963,4],[4686,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[3937,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1842,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1427,4],[2399,4],[2576,4],[2963,4],[4686,4]]}},"keywords":{}}],["auto-incr",{"_index":198,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[65,17]]},"template:docs/data-layer/database":{"position":[[1291,17]]},"template:templates/docs/advanced/mocking-guids":{"position":[[65,17]]},"template:templates/docs/data-layer/database":{"position":[[1291,17]]}},"keywords":{}}],["autodiscov",{"_index":301,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2020,14]]},"template:templates/docs/advanced/server-configuration":{"position":[[2020,14]]}},"keywords":{}}],["autodiscoveri",{"_index":189,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2759,13]]},"template:templates/docs/advanced/environment-options":{"position":[[2759,13]]}},"keywords":{}}],["autogener",{"_index":282,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1351,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[1351,13]]}},"keywords":{}}],["autoload",{"_index":1665,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4891,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4891,8]]}},"keywords":{}}],["automat",{"_index":178,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2404,13]]},"template:docs/advanced/server-configuration":{"position":[[1712,13]]},"template:docs/data-layer/factories":{"position":[[789,13],[7267,14]]},"template:docs/data-layer/models":{"position":[[291,13]]},"template:docs/data-layer/orm":{"position":[[3590,13],[5335,13]]},"template:docs/data-layer/relationships":{"position":[[368,13]]},"template:docs/getting-started/overview":{"position":[[1684,13],[3889,13],[8849,13]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8984,13],[9395,13]]},"template:docs/route-handlers/functions":{"position":[[5622,13]]},"template:docs/testing/acceptance-tests":{"position":[[998,13]]},"template:templates/docs/advanced/environment-options":{"position":[[2404,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[1712,13]]},"template:templates/docs/data-layer/factories":{"position":[[789,13],[7267,14]]},"template:templates/docs/data-layer/models":{"position":[[291,13]]},"template:templates/docs/data-layer/orm":{"position":[[3590,13],[5335,13]]},"template:templates/docs/data-layer/relationships":{"position":[[368,13]]},"template:templates/docs/getting-started/overview":{"position":[[1684,13],[3889,13],[8849,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8984,13],[9395,13]]},"template:templates/docs/route-handlers/functions":{"position":[[5622,13]]},"template:templates/docs/testing/acceptance-tests":{"position":[[998,13]]}},"keywords":{}}],["avail",{"_index":878,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1064,9],[2336,9],[2703,9]]},"template:docs/data-layer/relationships":{"position":[[6045,9]]},"template:docs/data-layer/serializers/index":{"position":[[3614,10],[7114,9]]},"template:docs/route-handlers/functions":{"position":[[2995,9],[3264,9]]},"template:docs/route-handlers/shorthands":{"position":[[1103,9]]},"template:docs/testing/assertions":{"position":[[2909,9]]},"template:templates/docs/data-layer/models":{"position":[[1064,9],[2336,9],[2703,9]]},"template:templates/docs/data-layer/relationships":{"position":[[6045,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3614,10],[7114,9]]},"template:templates/docs/route-handlers/functions":{"position":[[2995,9],[3264,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1103,9]]},"template:templates/docs/testing/assertions":{"position":[[2909,9]]}},"keywords":{}}],["avoid",{"_index":129,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[923,5]]},"template:docs/data-layer/fixtures":{"position":[[1584,5]]},"template:docs/getting-started/overview":{"position":[[10238,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5638,5]]},"template:docs/testing/assertions":{"position":[[2768,5]]},"template:templates/docs/advanced/environment-options":{"position":[[923,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[1584,5]]},"template:templates/docs/getting-started/overview":{"position":[[10238,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5638,5]]},"template:templates/docs/testing/assertions":{"position":[[2768,5]]}},"keywords":{}}],["await",{"_index":485,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1657,5],[1685,5],[1728,5]]},"template:docs/data-layer/factories":{"position":[[15307,5],[16495,5],[17074,5]]},"template:docs/data-layer/fixtures":{"position":[[2587,5]]},"template:docs/getting-started/overview":{"position":[[5266,5],[5559,5],[6928,5]]},"template:docs/testing/acceptance-tests":{"position":[[1779,5],[3136,5],[3257,5],[3350,5],[3772,5],[4342,5],[4360,5],[4381,5],[4420,5],[5560,5]]},"template:docs/testing/assertions":{"position":[[1104,5],[1122,5],[1143,5],[1184,5],[1838,5],[1877,5],[1915,5],[3213,5],[3231,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[763,5],[1524,5],[2223,5],[2280,5],[2316,5],[2762,5],[2824,5],[2860,5],[3680,5],[4744,5],[4797,5],[4859,5],[4895,5],[6962,5],[7024,5],[7060,5]]},"template:templates/docs/data-layer/database":{"position":[[1657,5],[1685,5],[1728,5]]},"template:templates/docs/data-layer/factories":{"position":[[15307,5],[16495,5],[17074,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[2587,5]]},"template:templates/docs/getting-started/overview":{"position":[[5266,5],[5559,5],[6928,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1779,5],[3136,5],[3257,5],[3350,5],[3772,5],[4342,5],[4360,5],[4381,5],[4420,5],[5560,5]]},"template:templates/docs/testing/assertions":{"position":[[1104,5],[1122,5],[1143,5],[1184,5],[1838,5],[1877,5],[1915,5],[3213,5],[3231,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[763,5],[1524,5],[2223,5],[2280,5],[2316,5],[2762,5],[2824,5],[2860,5],[3680,5],[4744,5],[4797,5],[4859,5],[4895,5],[6962,5],[7024,5],[7060,5]]}},"keywords":{}}],["awar",{"_index":957,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2687,5]]},"template:docs/getting-started/overview":{"position":[[8419,5]]},"template:docs/route-handlers/shorthands":{"position":[[5924,5]]},"template:templates/docs/data-layer/orm":{"position":[[2687,5]]},"template:templates/docs/getting-started/overview":{"position":[[8419,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5924,5]]}},"keywords":{}}],["away",{"_index":1005,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[8552,4]]},"template:templates/docs/data-layer/orm":{"position":[[8552,4]]}},"keywords":{}}],["back",{"_index":1042,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3379,4]]},"template:docs/data-layer/serializers/index":{"position":[[6012,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9543,4],[10016,4]]},"template:index":{"position":[[58,4]]},"template:templates/docs/data-layer/relationships":{"position":[[3379,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6012,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9543,4],[10016,4]]},"template:templates/index":{"position":[[58,4]]}},"keywords":{}}],["backend",{"_index":506,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[306,7]]},"template:docs/data-layer/models":{"position":[[657,8]]},"template:docs/data-layer/orm":{"position":[[168,9],[790,7]]},"template:docs/data-layer/serializers/index":{"position":[[817,7],[1239,8],[1637,7],[1908,7],[3701,8],[6716,7],[6927,7]]},"template:docs/getting-started/overview":{"position":[[7635,7],[8057,7],[8157,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14969,8]]},"template:docs/getting-started/what-is-mirage":{"position":[[87,7],[415,7],[688,7],[1346,7]]},"template:docs/testing/assertions":{"position":[[592,8],[725,7],[1332,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3120,10]]},"template:templates/docs/data-layer/factories":{"position":[[306,7]]},"template:templates/docs/data-layer/models":{"position":[[657,8]]},"template:templates/docs/data-layer/orm":{"position":[[168,9],[790,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[817,7],[1239,8],[1637,7],[1908,7],[3701,8],[6716,7],[6927,7]]},"template:templates/docs/getting-started/overview":{"position":[[7635,7],[8057,7],[8157,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14969,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[87,7],[415,7],[688,7],[1346,7]]},"template:templates/docs/testing/assertions":{"position":[[592,8],[725,7],[1332,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3120,10]]}},"keywords":{}}],["bad",{"_index":1454,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14390,3],[15315,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14390,3],[15315,4]]}},"keywords":{}}],["bangladesh",{"_index":809,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1274,13]]},"template:templates/docs/data-layer/fixtures":{"position":[[1274,13]]}},"keywords":{}}],["barbarian",{"_index":1554,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[4308,11],[4594,12]]},"template:templates/docs/route-handlers/functions":{"position":[[4308,11],[4594,12]]}},"keywords":{}}],["bare",{"_index":771,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17505,4]]},"template:templates/docs/data-layer/factories":{"position":[[17505,4]]}},"keywords":{}}],["base",{"_index":578,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4407,5],[4681,4],[5048,5],[7228,4],[7378,4],[10317,4],[10553,4],[15798,4],[16029,4]]},"template:docs/getting-started/overview":{"position":[[8103,4]]},"template:docs/route-handlers/functions":{"position":[[5646,5],[6111,5]]},"template:docs/route-handlers/shorthands":{"position":[[1167,5]]},"template:templates/docs/data-layer/factories":{"position":[[4407,5],[4681,4],[5048,5],[7228,4],[7378,4],[10317,4],[10553,4],[15798,4],[16029,4]]},"template:templates/docs/getting-started/overview":{"position":[[8103,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5646,5],[6111,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1167,5]]}},"keywords":{}}],["basi",{"_index":1232,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5759,6]]},"template:templates/docs/getting-started/overview":{"position":[[5759,6]]}},"keywords":{}}],["basic",{"_index":786,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[606,5]]},"template:docs/getting-started/overview":{"position":[[1188,6],[1468,5]]},"template:docs/testing/acceptance-tests":{"position":[[5948,6]]},"template:docs/testing/assertions":{"position":[[2252,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[606,5]]},"template:templates/docs/getting-started/overview":{"position":[[1188,6],[1468,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5948,6]]},"template:templates/docs/testing/assertions":{"position":[[2252,9]]}},"keywords":{}}],["be",{"_index":223,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[624,5]]},"template:docs/advanced/server-configuration":{"position":[[2568,5]]},"template:docs/data-layer/factories":{"position":[[8923,5]]},"template:docs/getting-started/installation":{"position":[[1254,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2284,5],[6997,5],[8690,5],[9099,5],[10653,5]]},"template:docs/route-handlers/functions":{"position":[[6129,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[624,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[2568,5]]},"template:templates/docs/data-layer/factories":{"position":[[8923,5]]},"template:templates/docs/getting-started/installation":{"position":[[1254,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2284,5],[6997,5],[8690,5],[9099,5],[10653,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6129,5]]}},"keywords":{}}],["becom",{"_index":749,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16171,6]]},"template:docs/route-handlers/shorthands":{"position":[[22,6]]},"template:templates/docs/data-layer/factories":{"position":[[16171,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[22,6]]}},"keywords":{}}],["befor",{"_index":77,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1262,7],[1321,7],[1361,6]]},"template:docs/advanced/environment-options":{"position":[[519,6]]},"template:docs/data-layer/factories":{"position":[[7468,6]]},"template:docs/data-layer/models":{"position":[[702,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5125,6]]},"template:docs/route-handlers/functions":{"position":[[3504,6]]},"template:docs/testing/setup-mirage":{"position":[[236,6]]},"template:index":{"position":[[287,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1262,7],[1321,7],[1361,6]]},"template:templates/docs/advanced/environment-options":{"position":[[519,6]]},"template:templates/docs/data-layer/factories":{"position":[[7468,6]]},"template:templates/docs/data-layer/models":{"position":[[702,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5125,6]]},"template:templates/docs/route-handlers/functions":{"position":[[3504,6]]},"template:templates/docs/testing/setup-mirage":{"position":[[236,6]]},"template:templates/index":{"position":[[287,6]]}},"keywords":{}}],["begin",{"_index":1649,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3967,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3967,9]]}},"keywords":{}}],["behav",{"_index":214,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[344,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9268,6],[11192,7]]},"template:docs/route-handlers/functions":{"position":[[864,7]]},"template:docs/testing/assertions":{"position":[[937,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[344,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9268,6],[11192,7]]},"template:templates/docs/route-handlers/functions":{"position":[[864,7]]},"template:templates/docs/testing/assertions":{"position":[[937,8]]}},"keywords":{}}],["behavior",{"_index":113,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[381,9]]},"template:docs/advanced/server-configuration":{"position":[[1523,9]]},"template:docs/advanced/switching-between-scenarios":{"position":[[640,8],[1166,8]]},"template:docs/data-layer/factories":{"position":[[7866,9]]},"template:docs/data-layer/orm":{"position":[[6135,8]]},"template:docs/data-layer/serializers/index":{"position":[[2969,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5542,8],[5734,9],[6968,8],[8300,8],[10552,8],[10738,8],[10892,8],[12637,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1652,9]]},"template:docs/testing/acceptance-tests":{"position":[[81,9]]},"template:docs/testing/assertions":{"position":[[3724,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[249,9],[1994,8]]},"template:templates/docs/advanced/environment-options":{"position":[[381,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[1523,9]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[640,8],[1166,8]]},"template:templates/docs/data-layer/factories":{"position":[[7866,9]]},"template:templates/docs/data-layer/orm":{"position":[[6135,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2969,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5542,8],[5734,9],[6968,8],[8300,8],[10552,8],[10738,8],[10892,8],[12637,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1652,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[81,9]]},"template:templates/docs/testing/assertions":{"position":[[3724,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[249,9],[1994,8]]}},"keywords":{}}],["behind",{"_index":1435,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13357,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13357,6]]}},"keywords":{}}],["belong",{"_index":1051,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4567,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12013,7]]},"template:templates/docs/data-layer/relationships":{"position":[[4567,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12013,7]]}},"keywords":{}}],["belongs-to",{"_index":976,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[4940,10]]},"template:templates/docs/data-layer/orm":{"position":[[4940,10]]}},"keywords":{}}],["belongsto",{"_index":321,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2715,10]]},"template:docs/data-layer/factories":{"position":[[7707,11],[12169,9],[12231,9]]},"template:docs/data-layer/fixtures":{"position":[[3492,9]]},"template:docs/data-layer/orm":{"position":[[5023,9]]},"template:docs/data-layer/relationships":{"position":[[100,9],[413,9],[467,9],[597,9],[672,11],[703,9],[750,9],[2685,10],[3191,11],[4715,11]]},"template:docs/getting-started/overview":{"position":[[6234,9],[6300,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11794,9],[11869,11],[12387,9],[12462,11],[12627,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[2715,10]]},"template:templates/docs/data-layer/factories":{"position":[[7707,11],[12169,9],[12231,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[3492,9]]},"template:templates/docs/data-layer/orm":{"position":[[5023,9]]},"template:templates/docs/data-layer/relationships":{"position":[[100,9],[413,9],[467,9],[597,9],[672,11],[703,9],[750,9],[2685,10],[3191,11],[4715,11]]},"template:templates/docs/getting-started/overview":{"position":[[6234,9],[6300,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11794,9],[11869,11],[12387,9],[12462,11],[12627,9]]}},"keywords":{}}],["belongsto(\"us",{"_index":1036,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2769,18],[3819,18],[3848,17],[4209,17],[4264,17]]},"template:templates/docs/data-layer/relationships":{"position":[[2769,18],[3819,18],[3848,17],[4209,17],[4264,17]]}},"keywords":{}}],["belongsto('person",{"_index":977,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[5092,19]]},"template:templates/docs/data-layer/orm":{"position":[[5092,19]]}},"keywords":{}}],["belongsto('us",{"_index":831,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[2980,17],[4449,17]]},"template:templates/docs/data-layer/fixtures":{"position":[[2980,17],[4449,17]]}},"keywords":{}}],["below",{"_index":290,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1813,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[866,5]]},"template:docs/route-handlers/functions":{"position":[[2674,6]]},"template:docs/route-handlers/shorthands":{"position":[[1124,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[1813,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[866,5]]},"template:templates/docs/route-handlers/functions":{"position":[[2674,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1124,6]]}},"keywords":{}}],["benefit",{"_index":315,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2557,7]]},"template:docs/data-layer/factories":{"position":[[27,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2557,7]]},"template:templates/docs/data-layer/factories":{"position":[[27,8]]}},"keywords":{}}],["best",{"_index":54,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[750,4]]},"template:docs/data-layer/factories":{"position":[[15741,4],[15773,4]]},"template:docs/data-layer/serializers/index":{"position":[[2855,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[750,4]]},"template:templates/docs/data-layer/factories":{"position":[[15741,4],[15773,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2855,4]]}},"keywords":{}}],["beta",{"_index":1437,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13392,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13392,4]]}},"keywords":{}}],["better",{"_index":1405,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9965,6],[11513,6],[12923,6]]},"template:docs/getting-started/what-is-mirage":{"position":[[1745,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9965,6],[11513,6],[12923,6]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1745,6]]}},"keywords":{}}],["between",{"_index":394,"title":{"template:docs/advanced/switching-between-scenarios":{"position":[[10,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[10,7]]}},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[11,7]]},"template:docs/data-layer/models":{"position":[[2834,7]]},"template:docs/data-layer/orm":{"position":[[2494,7]]},"template:docs/data-layer/relationships":{"position":[[77,7]]},"template:docs/getting-started/overview":{"position":[[6356,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11949,7]]},"template:docs/testing/acceptance-tests":{"position":[[4968,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[11,7]]},"template:templates/docs/data-layer/models":{"position":[[2834,7]]},"template:templates/docs/data-layer/orm":{"position":[[2494,7]]},"template:templates/docs/data-layer/relationships":{"position":[[77,7]]},"template:templates/docs/getting-started/overview":{"position":[[6356,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11949,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4968,7]]}},"keywords":{}}],["beyond",{"_index":1348,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4840,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4840,6]]}},"keywords":{}}],["bi-direct",{"_index":852,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[4280,14]]},"template:templates/docs/data-layer/fixtures":{"position":[[4280,14]]}},"keywords":{}}],["big",{"_index":915,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[226,3]]},"template:templates/docs/data-layer/orm":{"position":[[226,3]]}},"keywords":{}}],["bind",{"_index":1562,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5519,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5519,4]]}},"keywords":{}}],["bit",{"_index":1346,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4806,3]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1800,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4806,3]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1800,3]]}},"keywords":{}}],["blank",{"_index":1484,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16942,5]]},"template:docs/route-handlers/functions":{"position":[[6782,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16942,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6782,7]]}},"keywords":{}}],["blog",{"_index":0,"title":{"template:blog/index":{"position":[[0,4]]},"template:templates/blog/index":{"position":[[0,4]]}},"text":{"template:application":{"position":[[1,4]]},"template:blog/index":{"position":[[1,4]]},"template:docs/data-layer/relationships":{"position":[[4315,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13412,4]]},"template:templates/application":{"position":[[1,4]]},"template:templates/blog/index":{"position":[[1,4]]},"template:templates/docs/data-layer/relationships":{"position":[[4315,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13412,4]]}},"keywords":{}}],["blog-post",{"_index":876,"title":{},"text":{"template:docs/data-layer/models":{"position":[[830,9]]},"template:docs/data-layer/relationships":{"position":[[841,9],[5382,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6669,9],[16570,9]]},"template:docs/route-handlers/shorthands":{"position":[[5223,14],[5261,14],[5296,14],[5334,14],[5374,14],[5412,14]]},"template:templates/docs/data-layer/models":{"position":[[830,9]]},"template:templates/docs/data-layer/relationships":{"position":[[841,9],[5382,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6669,9],[16570,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5223,14],[5261,14],[5296,14],[5334,14],[5374,14],[5412,14]]}},"keywords":{}}],["blog-post.j",{"_index":1039,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3070,12],[3768,12],[4158,12]]},"template:templates/docs/data-layer/relationships":{"position":[[3070,12],[3768,12],[4158,12]]}},"keywords":{}}],["blog_post",{"_index":1449,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14242,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14242,11]]}},"keywords":{}}],["blogpost",{"_index":1024,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1625,8],[2035,8],[3181,9],[3740,10],[4130,10],[4238,11],[4579,8]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1798,10]]},"template:templates/docs/data-layer/relationships":{"position":[[1625,8],[2035,8],[3181,9],[3740,10],[4130,10],[4238,11],[4579,8]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1798,10]]}},"keywords":{}}],["blogpost.author",{"_index":1012,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1039,16],[1075,15],[3923,16]]},"template:templates/docs/data-layer/relationships":{"position":[[1039,16],[1075,15],[3923,16]]}},"keywords":{}}],["blogpost.authorid",{"_index":1011,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[964,18],[988,17],[1216,17],[1567,17]]},"template:templates/docs/data-layer/relationships":{"position":[[964,18],[988,17],[1216,17],[1567,17]]}},"keywords":{}}],["blogpost.com",{"_index":1029,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2220,18],[2268,17],[3221,17]]},"template:templates/docs/data-layer/relationships":{"position":[[2220,18],[2268,17],[3221,17]]}},"keywords":{}}],["blogpost.commentid",{"_index":1028,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2128,20],[2162,19]]},"template:templates/docs/data-layer/relationships":{"position":[[2128,20],[2162,19]]}},"keywords":{}}],["blogpost.createauthor",{"_index":1023,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1474,21]]},"template:templates/docs/data-layer/relationships":{"position":[[1474,21]]}},"keywords":{}}],["blogpost.createauthor(attr",{"_index":1016,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1157,29]]},"template:templates/docs/data-layer/relationships":{"position":[[1157,29]]}},"keywords":{}}],["blogpost.createcomment(attr",{"_index":1033,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2389,30]]},"template:templates/docs/data-layer/relationships":{"position":[[2389,30]]}},"keywords":{}}],["blogpost.newauthor(attr",{"_index":1014,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1108,26]]},"template:templates/docs/data-layer/relationships":{"position":[[1108,26]]}},"keywords":{}}],["blogpost.newcomment(attr",{"_index":1032,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2338,27]]},"template:templates/docs/data-layer/relationships":{"position":[[2338,27]]}},"keywords":{}}],["blogpost.review",{"_index":1045,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3943,18]]},"template:templates/docs/data-layer/relationships":{"position":[[3943,18]]}},"keywords":{}}],["blogpost.sav",{"_index":1025,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1741,15]]},"template:templates/docs/data-layer/relationships":{"position":[[1741,15]]}},"keywords":{}}],["blogpostid",{"_index":1091,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1815,14]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1815,14]]}},"keywords":{}}],["blueprint",{"_index":216,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[397,10]]},"template:docs/getting-started/overview":{"position":[[3188,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13687,9]]},"template:templates/docs/advanced/mocking-guids":{"position":[[397,10]]},"template:templates/docs/getting-started/overview":{"position":[[3188,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13687,9]]}},"keywords":{}}],["bodi",{"_index":1540,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[2390,5],[4041,4],[6262,5]]},"template:templates/docs/route-handlers/functions":{"position":[[2390,5],[4041,4],[6262,5]]}},"keywords":{}}],["bog",{"_index":750,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16178,6]]},"template:templates/docs/data-layer/factories":{"position":[[16178,6]]}},"keywords":{}}],["boilerpl",{"_index":706,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[12743,11],[16689,11]]},"template:docs/getting-started/overview":{"position":[[49,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[872,11]]},"template:templates/docs/data-layer/factories":{"position":[[12743,11],[16689,11]]},"template:templates/docs/getting-started/overview":{"position":[[49,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[872,11]]}},"keywords":{}}],["bookkeep",{"_index":961,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2878,11],[8540,11]]},"template:docs/getting-started/overview":{"position":[[7116,11]]},"template:templates/docs/data-layer/orm":{"position":[[2878,11],[8540,11]]},"template:templates/docs/getting-started/overview":{"position":[[7116,11]]}},"keywords":{}}],["boolean",{"_index":124,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[818,7]]},"template:docs/getting-started/overview":{"position":[[3371,9]]},"template:templates/docs/advanced/environment-options":{"position":[[818,7]]},"template:templates/docs/getting-started/overview":{"position":[[3371,9]]}},"keywords":{}}],["boot",{"_index":260,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[535,5]]},"template:docs/data-layer/factories":{"position":[[15443,4]]},"template:docs/testing/acceptance-tests":{"position":[[345,5],[993,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[535,5]]},"template:templates/docs/data-layer/factories":{"position":[[15443,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[345,5],[993,4]]}},"keywords":{}}],["borrow",{"_index":1513,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1371,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1371,7]]}},"keywords":{}}],["both",{"_index":500,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[203,4],[9656,4]]},"template:docs/data-layer/orm":{"position":[[5293,4]]},"template:docs/getting-started/overview":{"position":[[5717,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[11545,4],[12185,4],[12673,4],[16297,5]]},"template:docs/route-handlers/functions":{"position":[[6354,4]]},"template:docs/testing/acceptance-tests":{"position":[[5084,4]]},"template:templates/docs/data-layer/factories":{"position":[[203,4],[9656,4]]},"template:templates/docs/data-layer/orm":{"position":[[5293,4]]},"template:templates/docs/getting-started/overview":{"position":[[5717,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11545,4],[12185,4],[12673,4],[16297,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6354,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5084,4]]}},"keywords":{}}],["box",{"_index":971,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[4298,4]]},"template:docs/data-layer/serializers/index":{"position":[[3877,4]]},"template:templates/docs/data-layer/orm":{"position":[[4298,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3877,4]]}},"keywords":{}}],["brazil",{"_index":802,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1171,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1171,9]]}},"keywords":{}}],["break",{"_index":730,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15035,5]]},"template:docs/getting-started/overview":{"position":[[1329,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1534,8],[1655,8],[2880,8],[5644,8],[8227,8],[8385,8],[8518,5]]},"template:docs/testing/acceptance-tests":{"position":[[2816,5],[3900,5]]},"template:templates/docs/data-layer/factories":{"position":[[15035,5]]},"template:templates/docs/getting-started/overview":{"position":[[1329,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1534,8],[1655,8],[2880,8],[5644,8],[8227,8],[8385,8],[8518,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2816,5],[3900,5]]}},"keywords":{}}],["bring",{"_index":1505,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[469,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[469,5]]}},"keywords":{}}],["brittl",{"_index":768,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17421,7]]},"template:docs/testing/acceptance-tests":{"position":[[3035,8]]},"template:templates/docs/data-layer/factories":{"position":[[17421,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3035,8]]}},"keywords":{}}],["browser",{"_index":375,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[302,7]]},"template:docs/getting-started/installation":{"position":[[1201,8],[1559,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[920,8]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[302,7]]},"template:templates/docs/getting-started/installation":{"position":[[1201,8],[1559,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[920,8]]}},"keywords":{}}],["bug",{"_index":1168,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[811,3]]},"template:docs/testing/assertions":{"position":[[296,3]]},"template:templates/docs/getting-started/installation":{"position":[[811,3]]},"template:templates/docs/testing/assertions":{"position":[[296,3]]}},"keywords":{}}],["build",{"_index":33,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[377,8]]},"template:docs/advanced/environment-options":{"position":[[1518,5],[1796,5]]},"template:docs/getting-started/overview":{"position":[[10444,5],[10686,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14037,5]]},"template:docs/getting-started/what-is-mirage":{"position":[[311,6],[1033,5]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[377,8]]},"template:templates/docs/advanced/environment-options":{"position":[[1518,5],[1796,5]]},"template:templates/docs/getting-started/overview":{"position":[[10444,5],[10686,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14037,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[311,6],[1033,5]]}},"keywords":{}}],["build-tim",{"_index":159,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1658,10]]},"template:templates/docs/advanced/environment-options":{"position":[[1658,10]]}},"keywords":{}}],["build/creat",{"_index":1059,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5133,12]]},"template:templates/docs/data-layer/relationships":{"position":[[5133,12]]}},"keywords":{}}],["built",{"_index":1106,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1374,5]]},"template:docs/getting-started/what-is-mirage":{"position":[[460,5]]},"template:docs/testing/acceptance-tests":{"position":[[449,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1374,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[460,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[449,5]]}},"keywords":{}}],["bundl",{"_index":1305,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2002,6],[2240,7],[2361,7],[2839,8],[3446,7]]},"template:docs/route-handlers/functions":{"position":[[5157,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2002,6],[2240,7],[2361,7],[2839,8],[3446,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5157,7]]}},"keywords":{}}],["bypass",{"_index":1182,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1445,6]]},"template:templates/docs/getting-started/installation":{"position":[[1445,6]]}},"keywords":{}}],["call",{"_index":222,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[594,6]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[290,4]]},"template:docs/data-layer/factories":{"position":[[5594,7],[7320,6],[13485,4]]},"template:docs/data-layer/fixtures":{"position":[[1858,4],[2460,4]]},"template:docs/data-layer/relationships":{"position":[[1273,5],[1736,4]]},"template:docs/getting-started/overview":{"position":[[4104,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1848,4],[6574,4]]},"template:docs/testing/acceptance-tests":{"position":[[2228,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[6142,4]]},"template:templates/docs/advanced/mocking-guids":{"position":[[594,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[290,4]]},"template:templates/docs/data-layer/factories":{"position":[[5594,7],[7320,6],[13485,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[1858,4],[2460,4]]},"template:templates/docs/data-layer/relationships":{"position":[[1273,5],[1736,4]]},"template:templates/docs/getting-started/overview":{"position":[[4104,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1848,4],[6574,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2228,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[6142,4]]}},"keywords":{}}],["caller",{"_index":667,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9470,7]]},"template:templates/docs/data-layer/factories":{"position":[[9470,7]]}},"keywords":{}}],["came",{"_index":1395,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9538,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9538,4]]}},"keywords":{}}],["camel",{"_index":1371,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7085,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7085,9]]}},"keywords":{}}],["camelcas",{"_index":815,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1500,9],[1558,11],[1701,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14783,11],[15235,10],[15650,11],[18290,11]]},"template:docs/route-handlers/functions":{"position":[[4693,11]]},"template:templates/docs/data-layer/fixtures":{"position":[[1500,9],[1558,11],[1701,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14783,11],[15235,10],[15650,11],[18290,11]]},"template:templates/docs/route-handlers/functions":{"position":[[4693,11]]}},"keywords":{}}],["canada",{"_index":1335,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4046,9],[4134,9],[4289,9],[4360,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4046,9],[4134,9],[4289,9],[4360,9]]}},"keywords":{}}],["canon",{"_index":1480,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16479,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16479,9]]}},"keywords":{}}],["car",{"_index":1077,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5880,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5880,5]]}},"keywords":{}}],["care",{"_index":763,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17180,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2616,4]]},"template:templates/docs/data-layer/factories":{"position":[[17180,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2616,4]]}},"keywords":{}}],["case",{"_index":154,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1567,4]]},"template:docs/data-layer/factories":{"position":[[4413,5],[5054,5],[7075,6],[7233,4],[8095,4],[9661,5],[16034,5]]},"template:docs/data-layer/fixtures":{"position":[[3550,5],[5016,5]]},"template:docs/data-layer/relationships":{"position":[[831,5],[3215,5],[3878,5]]},"template:docs/data-layer/serializers/index":{"position":[[6117,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2434,5],[6560,5],[7302,5]]},"template:docs/route-handlers/shorthands":{"position":[[1531,4],[1862,4],[2198,4]]},"template:docs/testing/acceptance-tests":{"position":[[2805,4]]},"template:docs/testing/assertions":{"position":[[3950,5]]},"template:templates/docs/advanced/environment-options":{"position":[[1567,4]]},"template:templates/docs/data-layer/factories":{"position":[[4413,5],[5054,5],[7075,6],[7233,4],[8095,4],[9661,5],[16034,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[3550,5],[5016,5]]},"template:templates/docs/data-layer/relationships":{"position":[[831,5],[3215,5],[3878,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6117,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2434,5],[6560,5],[7302,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1531,4],[1862,4],[2198,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2805,4]]},"template:templates/docs/testing/assertions":{"position":[[3950,5]]}},"keywords":{}}],["case/issu",{"_index":188,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2738,10]]},"template:templates/docs/advanced/environment-options":{"position":[[2738,10]]}},"keywords":{}}],["casey",{"_index":1320,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3401,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3401,5]]}},"keywords":{}}],["cast",{"_index":1133,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4563,4]]},"template:docs/getting-started/overview":{"position":[[6640,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4563,4]]},"template:templates/docs/getting-started/overview":{"position":[[6640,4]]}},"keywords":{}}],["cast-memb",{"_index":1131,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[4368,15],[4848,15],[5081,15]]},"template:docs/getting-started/overview":{"position":[[5997,13]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4368,15],[4848,15],[5081,15]]},"template:templates/docs/getting-started/overview":{"position":[[5997,13]]}},"keywords":{}}],["castmemb",{"_index":1235,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6159,12],[6728,12]]},"template:templates/docs/getting-started/overview":{"position":[[6159,12],[6728,12]]}},"keywords":{}}],["caus",{"_index":191,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2778,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7172,5]]},"template:templates/docs/advanced/environment-options":{"position":[[2778,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7172,5]]}},"keywords":{}}],["ceremoni",{"_index":1304,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1938,9],[2598,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1938,9],[2598,8]]}},"keywords":{}}],["certain",{"_index":587,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4842,7]]},"template:docs/data-layer/fixtures":{"position":[[5333,7]]},"template:templates/docs/data-layer/factories":{"position":[[4842,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[5333,7]]}},"keywords":{}}],["certainli",{"_index":778,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[221,9]]},"template:docs/testing/assertions":{"position":[[3786,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[221,9]]},"template:templates/docs/testing/assertions":{"position":[[3786,9]]}},"keywords":{}}],["chanc",{"_index":1369,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[6933,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6933,7]]}},"keywords":{}}],["chance.j",{"_index":1345,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4761,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4761,10]]}},"keywords":{}}],["chang",{"_index":112,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[361,6]]},"template:docs/advanced/server-configuration":{"position":[[735,8]]},"template:docs/data-layer/factories":{"position":[[14337,8],[16007,7],[17448,7]]},"template:docs/data-layer/orm":{"position":[[5405,8],[6057,6],[7160,6],[8283,7]]},"template:docs/getting-started/installation":{"position":[[386,7]]},"template:docs/getting-started/overview":{"position":[[954,6],[2248,6],[2611,6],[2660,8],[7905,6],[11033,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[743,6],[1543,7],[1664,7],[2889,7],[3127,6],[4707,6],[6069,6],[6122,6],[7164,7],[8236,8],[8394,7],[8493,6],[10539,7],[11442,6],[13027,6],[13364,7],[13574,8],[14518,6],[14819,7],[15864,7],[18280,6],[18332,6],[18741,8]]},"template:docs/route-handlers/functions":{"position":[[6225,6]]},"template:docs/testing/acceptance-tests":{"position":[[2639,6],[2771,8],[4809,7]]},"template:docs/testing/assertions":{"position":[[992,6]]},"template:templates/docs/advanced/environment-options":{"position":[[361,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[735,8]]},"template:templates/docs/data-layer/factories":{"position":[[14337,8],[16007,7],[17448,7]]},"template:templates/docs/data-layer/orm":{"position":[[5405,8],[6057,6],[7160,6],[8283,7]]},"template:templates/docs/getting-started/installation":{"position":[[386,7]]},"template:templates/docs/getting-started/overview":{"position":[[954,6],[2248,6],[2611,6],[2660,8],[7905,6],[11033,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[743,6],[1543,7],[1664,7],[2889,7],[3127,6],[4707,6],[6069,6],[6122,6],[7164,7],[8236,8],[8394,7],[8493,6],[10539,7],[11442,6],[13027,6],[13364,7],[13574,8],[14518,6],[14819,7],[15864,7],[18280,6],[18332,6],[18741,8]]},"template:templates/docs/route-handlers/functions":{"position":[[6225,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2639,6],[2771,8],[4809,7]]},"template:templates/docs/testing/assertions":{"position":[[992,6]]}},"keywords":{}}],["changelog",{"_index":1288,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[201,9],[18706,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[201,9],[18706,9]]}},"keywords":{}}],["channel",{"_index":1432,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13283,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13283,7]]}},"keywords":{}}],["chastain",{"_index":1245,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[6909,9]]},"template:templates/docs/getting-started/overview":{"position":[[6909,9]]}},"keywords":{}}],["check",{"_index":664,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9162,5]]},"template:docs/data-layer/models":{"position":[[2311,5]]},"template:docs/data-layer/relationships":{"position":[[5993,5]]},"template:docs/data-layer/serializers/index":{"position":[[5254,5],[5959,5],[7062,5]]},"template:docs/getting-started/installation":{"position":[[265,5]]},"template:docs/testing/assertions":{"position":[[1289,5]]},"template:templates/docs/data-layer/factories":{"position":[[9162,5]]},"template:templates/docs/data-layer/models":{"position":[[2311,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5993,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5254,5],[5959,5],[7062,5]]},"template:templates/docs/getting-started/installation":{"position":[[265,5]]},"template:templates/docs/testing/assertions":{"position":[[1289,5]]}},"keywords":{}}],["child",{"_index":1017,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1267,5]]},"template:templates/docs/data-layer/relationships":{"position":[[1267,5]]}},"keywords":{}}],["child'",{"_index":1021,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1354,7]]},"template:templates/docs/data-layer/relationships":{"position":[[1354,7]]}},"keywords":{}}],["child.createpar",{"_index":1018,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1279,19]]},"template:templates/docs/data-layer/relationships":{"position":[[1279,19]]}},"keywords":{}}],["chime",{"_index":5,"title":{},"text":{"template:blog/detail":{"position":[[40,5]]},"template:templates/blog/detail":{"position":[[40,5]]}},"keywords":{}}],["china",{"_index":783,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[473,7],[900,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[473,7],[900,8]]}},"keywords":{}}],["choos",{"_index":309,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2381,7]]},"template:docs/data-layer/factories":{"position":[[14432,6]]},"template:docs/data-layer/serializers/index":{"position":[[631,8],[722,6],[1197,6],[1956,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[2381,7]]},"template:templates/docs/data-layer/factories":{"position":[[14432,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[631,8],[722,6],[1197,6],[1956,6]]}},"keywords":{}}],["chri",{"_index":832,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3054,5],[3090,6],[3140,6],[3308,6],[4006,6],[4629,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[3054,5],[3090,6],[3140,6],[3308,6],[4006,6],[4629,6]]}},"keywords":{}}],["christoph",{"_index":609,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6075,12],[6269,12]]},"template:docs/data-layer/orm":{"position":[[5866,12],[6825,12],[7303,12]]},"template:templates/docs/data-layer/factories":{"position":[[6075,12],[6269,12]]},"template:templates/docs/data-layer/orm":{"position":[[5866,12],[6825,12],[7303,12]]}},"keywords":{}}],["circumst",{"_index":417,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[881,13]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[881,13]]}},"keywords":{}}],["citi",{"_index":796,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1040,5],[1409,5],[2283,10],[2325,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[1040,5],[1409,5],[2283,10],[2325,6]]}},"keywords":{}}],["clarifi",{"_index":869,"title":{},"text":{"template:docs/data-layer/models":{"position":[[418,10]]},"template:templates/docs/data-layer/models":{"position":[[418,10]]}},"keywords":{}}],["class",{"_index":209,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[234,6],[846,5]]},"template:docs/data-layer/factories":{"position":[[436,7],[1217,5]]},"template:docs/data-layer/fixtures":{"position":[[783,6]]},"template:docs/getting-started/overview":{"position":[[8108,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2557,8]]},"template:docs/route-handlers/functions":{"position":[[6430,5]]},"template:docs/testing/assertions":{"position":[[369,5],[4047,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[234,6],[846,5]]},"template:templates/docs/data-layer/factories":{"position":[[436,7],[1217,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[783,6]]},"template:templates/docs/getting-started/overview":{"position":[[8108,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2557,8]]},"template:templates/docs/route-handlers/functions":{"position":[[6430,5]]},"template:templates/docs/testing/assertions":{"position":[[369,5],[4047,8]]}},"keywords":{}}],["classifi",{"_index":1122,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3408,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3408,8]]}},"keywords":{}}],["classify(attr",{"_index":1126,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3507,15]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3507,15]]}},"keywords":{}}],["clean",{"_index":403,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[280,5]]},"template:docs/data-layer/factories":{"position":[[14846,5]]},"template:docs/getting-started/overview":{"position":[[5960,6]]},"template:docs/testing/acceptance-tests":{"position":[[1583,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[280,5]]},"template:templates/docs/data-layer/factories":{"position":[[14846,5]]},"template:templates/docs/getting-started/overview":{"position":[[5960,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1583,5]]}},"keywords":{}}],["clear",{"_index":1084,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[893,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[893,6]]}},"keywords":{}}],["clever",{"_index":937,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1478,7]]},"template:templates/docs/data-layer/orm":{"position":[[1478,7]]}},"keywords":{}}],["cli",{"_index":251,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[328,3],[1466,3]]},"template:docs/getting-started/installation":{"position":[[403,3],[494,3],[807,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1783,3]]},"template:templates/docs/advanced/server-configuration":{"position":[[328,3],[1466,3]]},"template:templates/docs/getting-started/installation":{"position":[[403,3],[494,3],[807,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1783,3]]}},"keywords":{}}],["cli'",{"_index":1456,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14436,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14436,5]]}},"keywords":{}}],["click",{"_index":1734,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4345,6],[6412,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4345,6],[6412,6]]}},"keywords":{}}],["click('.edit",{"_index":1680,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1128,14]]},"template:templates/docs/testing/assertions":{"position":[[1128,14]]}},"keywords":{}}],["click('.new",{"_index":1658,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4366,14]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4366,14]]}},"keywords":{}}],["click('.sav",{"_index":1661,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4426,15]]},"template:docs/testing/assertions":{"position":[[1190,15],[1921,15]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2322,15],[2866,15],[4901,15],[7066,15]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4426,15]]},"template:templates/docs/testing/assertions":{"position":[[1190,15],[1921,15]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2322,15],[2866,15],[4901,15],[7066,15]]}},"keywords":{}}],["click('.submit",{"_index":490,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1734,17]]},"template:templates/docs/data-layer/database":{"position":[[1734,17]]}},"keywords":{}}],["client",{"_index":391,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[680,6]]},"template:docs/getting-started/installation":{"position":[[1605,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8860,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1757,6]]},"template:index":{"position":[[278,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[680,6]]},"template:templates/docs/getting-started/installation":{"position":[[1605,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8860,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1757,6]]},"template:templates/index":{"position":[[278,6]]}},"keywords":{}}],["close",{"_index":1411,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11160,7]]},"template:docs/testing/acceptance-tests":{"position":[[2037,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11160,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2037,5]]}},"keywords":{}}],["closest",{"_index":1111,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1967,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1967,7]]}},"keywords":{}}],["coalesc",{"_index":1600,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[1977,9],[2029,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1977,9],[2029,9]]}},"keywords":{}}],["code",{"_index":190,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2773,4]]},"template:docs/advanced/server-configuration":{"position":[[681,4]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[687,4]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1953,4]]},"template:docs/data-layer/database":{"position":[[382,4]]},"template:docs/data-layer/factories":{"position":[[6838,4],[8741,4],[12568,5],[16701,4]]},"template:docs/data-layer/orm":{"position":[[128,4],[8567,5]]},"template:docs/data-layer/serializers/index":{"position":[[6665,4],[6952,4]]},"template:docs/getting-started/overview":{"position":[[61,4],[9199,4],[9301,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[884,4],[1912,5],[5785,5],[10045,4],[11329,4],[12542,4],[15032,5],[18234,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[519,4],[1206,5]]},"template:docs/route-handlers/functions":{"position":[[6034,5],[6092,4],[6372,4]]},"template:docs/route-handlers/shorthands":{"position":[[1161,5]]},"template:docs/testing/acceptance-tests":{"position":[[927,4],[2003,4],[2949,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3628,5]]},"template:docs/testing/setup-mirage":{"position":[[536,4],[1025,4],[1917,4]]},"template:templates/docs/advanced/environment-options":{"position":[[2773,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[681,4]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[687,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1953,4]]},"template:templates/docs/data-layer/database":{"position":[[382,4]]},"template:templates/docs/data-layer/factories":{"position":[[6838,4],[8741,4],[12568,5],[16701,4]]},"template:templates/docs/data-layer/orm":{"position":[[128,4],[8567,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6665,4],[6952,4]]},"template:templates/docs/getting-started/overview":{"position":[[61,4],[9199,4],[9301,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[884,4],[1912,5],[5785,5],[10045,4],[11329,4],[12542,4],[15032,5],[18234,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[519,4],[1206,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6034,5],[6092,4],[6372,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1161,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[927,4],[2003,4],[2949,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3628,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[536,4],[1025,4],[1917,4]]}},"keywords":{}}],["codebas",{"_index":1510,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[878,9]]},"template:docs/route-handlers/shorthands":{"position":[[5848,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[878,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5848,9]]}},"keywords":{}}],["codemod",{"_index":1318,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3335,7],[7258,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3335,7],[7258,8]]}},"keywords":{}}],["collect",{"_index":49,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[696,10]]},"template:docs/data-layer/models":{"position":[[1021,10],[1418,10],[1552,12],[1973,11]]},"template:docs/data-layer/orm":{"position":[[4206,11]]},"template:docs/data-layer/relationships":{"position":[[2116,11],[3256,10],[4018,11],[6190,11]]},"template:docs/data-layer/serializers/index":{"position":[[79,10],[2432,10],[3002,11],[5378,10],[6504,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8641,11],[14130,10],[14220,10],[14859,10],[16327,10],[16726,11],[17613,10],[17728,11]]},"template:docs/route-handlers/functions":{"position":[[3374,10],[3748,11]]},"template:docs/route-handlers/shorthands":{"position":[[396,10],[596,11],[1260,11],[1401,10],[5036,10]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[696,10]]},"template:templates/docs/data-layer/models":{"position":[[1021,10],[1418,10],[1552,12],[1973,11]]},"template:templates/docs/data-layer/orm":{"position":[[4206,11]]},"template:templates/docs/data-layer/relationships":{"position":[[2116,11],[3256,10],[4018,11],[6190,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[79,10],[2432,10],[3002,11],[5378,10],[6504,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8641,11],[14130,10],[14220,10],[14859,10],[16327,10],[16726,11],[17613,10],[17728,11]]},"template:templates/docs/route-handlers/functions":{"position":[[3374,10],[3748,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[396,10],[596,11],[1260,11],[1401,10],[5036,10]]}},"keywords":{}}],["collection'",{"_index":890,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1768,12]]},"template:templates/docs/data-layer/models":{"position":[[1768,12]]}},"keywords":{}}],["colon",{"_index":1542,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[2931,5]]},"template:templates/docs/route-handlers/functions":{"position":[[2931,5]]}},"keywords":{}}],["combin",{"_index":692,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[11322,8],[11854,9]]},"template:templates/docs/data-layer/factories":{"position":[[11322,8],[11854,9]]}},"keywords":{}}],["come",{"_index":836,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3154,7],[3371,7],[4105,7],[4728,7]]},"template:docs/data-layer/serializers/index":{"position":[[3072,5]]},"template:docs/getting-started/installation":{"position":[[289,6]]},"template:docs/getting-started/overview":{"position":[[10430,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17176,4]]},"template:docs/route-handlers/functions":{"position":[[5076,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[3154,7],[3371,7],[4105,7],[4728,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3072,5]]},"template:templates/docs/getting-started/installation":{"position":[[289,6]]},"template:templates/docs/getting-started/overview":{"position":[[10430,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17176,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5076,5]]}},"keywords":{}}],["comedi",{"_index":564,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3686,8],[4088,8]]},"template:templates/docs/data-layer/factories":{"position":[[3686,8],[4088,8]]}},"keywords":{}}],["command",{"_index":1195,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[1910,7]]},"template:templates/docs/getting-started/overview":{"position":[[1910,7]]}},"keywords":{}}],["comment",{"_index":3,"title":{},"text":{"template:blog/detail":{"position":[[13,8],[22,9]]},"template:docs/data-layer/factories":{"position":[[6913,9],[11476,8],[11792,8]]},"template:docs/data-layer/relationships":{"position":[[1965,9],[2107,8],[2259,8],[2381,7],[2433,7],[2788,9],[2859,7],[3113,9],[3270,7],[3308,7],[4550,7],[4702,12],[4809,9],[4888,9],[4922,11],[5159,7]]},"template:templates/blog/detail":{"position":[[13,8],[22,9]]},"template:templates/docs/data-layer/factories":{"position":[[6913,9],[11476,8],[11792,8]]},"template:templates/docs/data-layer/relationships":{"position":[[1965,9],[2107,8],[2259,8],[2381,7],[2433,7],[2788,9],[2859,7],[3113,9],[3270,7],[3308,7],[4550,7],[4702,12],[4809,9],[4888,9],[4922,11],[5159,7]]}},"keywords":{}}],["comment.blogpost",{"_index":1041,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3336,16]]},"template:templates/docs/data-layer/relationships":{"position":[[3336,16]]}},"keywords":{}}],["comment.blogpostid",{"_index":1034,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2441,19]]},"template:templates/docs/data-layer/relationships":{"position":[[2441,19]]}},"keywords":{}}],["comment.buildcommentable(\"post",{"_index":1063,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5210,32]]},"template:templates/docs/data-layer/relationships":{"position":[[5210,32]]}},"keywords":{}}],["comment.commentableid",{"_index":1066,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5341,22],[5406,21]]},"template:templates/docs/data-layer/relationships":{"position":[[5341,22],[5406,21]]}},"keywords":{}}],["comment.createcommentable(\"post",{"_index":1064,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5270,33]]},"template:templates/docs/data-layer/relationships":{"position":[[5270,33]]}},"keywords":{}}],["comment.j",{"_index":1040,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[3140,10]]},"template:templates/docs/data-layer/relationships":{"position":[[3140,10]]}},"keywords":{}}],["comment1",{"_index":1030,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2288,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2288,10]]}},"keywords":{}}],["comment2",{"_index":1031,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2299,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2299,10]]}},"keywords":{}}],["commentid",{"_index":1027,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[2008,10]]},"template:templates/docs/data-layer/relationships":{"position":[[2008,10]]}},"keywords":{}}],["common",{"_index":474,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1322,6]]},"template:docs/data-layer/factories":{"position":[[15965,6]]},"template:docs/data-layer/models":{"position":[[2138,6]]},"template:docs/data-layer/orm":{"position":[[2620,6]]},"template:docs/getting-started/overview":{"position":[[818,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1955,6],[10481,6],[11565,6]]},"template:docs/route-handlers/shorthands":{"position":[[101,6]]},"template:docs/testing/acceptance-tests":{"position":[[5678,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4002,6]]},"template:templates/docs/data-layer/database":{"position":[[1322,6]]},"template:templates/docs/data-layer/factories":{"position":[[15965,6]]},"template:templates/docs/data-layer/models":{"position":[[2138,6]]},"template:templates/docs/data-layer/orm":{"position":[[2620,6]]},"template:templates/docs/getting-started/overview":{"position":[[818,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1955,6],[10481,6],[11565,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[101,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5678,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4002,6]]}},"keywords":{}}],["commun",{"_index":332,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2969,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13255,9]]},"template:docs/route-handlers/functions":{"position":[[877,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[2969,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13255,9]]},"template:templates/docs/route-handlers/functions":{"position":[[877,13]]}},"keywords":{}}],["complet",{"_index":414,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[838,8]]},"template:docs/data-layer/database":{"position":[[317,8]]},"template:docs/getting-started/overview":{"position":[[7267,10]]},"template:docs/getting-started/what-is-mirage":{"position":[[341,8]]},"template:docs/route-handlers/shorthands":{"position":[[486,8]]},"template:docs/testing/assertions":{"position":[[3875,9]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[838,8]]},"template:templates/docs/data-layer/database":{"position":[[317,8]]},"template:templates/docs/getting-started/overview":{"position":[[7267,10]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[341,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[486,8]]},"template:templates/docs/testing/assertions":{"position":[[3875,9]]}},"keywords":{}}],["complex",{"_index":192,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2846,7]]},"template:docs/data-layer/orm":{"position":[[160,7],[2430,8],[8405,7],[8644,7]]},"template:docs/getting-started/overview":{"position":[[1255,7]]},"template:templates/docs/advanced/environment-options":{"position":[[2846,7]]},"template:templates/docs/data-layer/orm":{"position":[[160,7],[2430,8],[8405,7],[8644,7]]},"template:templates/docs/getting-started/overview":{"position":[[1255,7]]}},"keywords":{}}],["complic",{"_index":945,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1887,11]]},"template:templates/docs/data-layer/orm":{"position":[[1887,11]]}},"keywords":{}}],["compon",{"_index":870,"title":{},"text":{"template:docs/data-layer/models":{"position":[[568,11]]},"template:docs/testing/integration-and-unit-tests":{"position":[[185,10],[563,9],[1289,9],[2024,10],[2057,9],[2525,9],[3445,10],[3519,10],[3831,10],[4411,9],[6559,9]]},"template:templates/docs/data-layer/models":{"position":[[568,11]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[185,10],[563,9],[1289,9],[2024,10],[2057,9],[2525,9],[3445,10],[3519,10],[3831,10],[4411,9],[6559,9]]}},"keywords":{}}],["compos",{"_index":686,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[10632,7]]},"template:templates/docs/data-layer/factories":{"position":[[10632,7]]}},"keywords":{}}],["compound",{"_index":1366,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[6761,8],[8913,8],[10713,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6761,8],[8913,8],[10713,8]]}},"keywords":{}}],["compris",{"_index":743,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15860,8]]},"template:templates/docs/data-layer/factories":{"position":[[15860,8]]}},"keywords":{}}],["conan",{"_index":1551,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[4264,8],[4556,8]]},"template:templates/docs/route-handlers/functions":{"position":[[4264,8],[4556,8]]}},"keywords":{}}],["concept",{"_index":1282,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10881,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1379,8]]},"template:docs/route-handlers/shorthands":{"position":[[66,7]]},"template:templates/docs/getting-started/overview":{"position":[[10881,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1379,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[66,7]]}},"keywords":{}}],["conceptu",{"_index":1425,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13009,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13009,12]]}},"keywords":{}}],["concern",{"_index":758,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16596,9]]},"template:docs/getting-started/overview":{"position":[[1044,9]]},"template:templates/docs/data-layer/factories":{"position":[[16596,9]]},"template:templates/docs/getting-started/overview":{"position":[[1044,9]]}},"keywords":{}}],["concis",{"_index":765,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17303,7]]},"template:docs/getting-started/overview":{"position":[[9795,8]]},"template:templates/docs/data-layer/factories":{"position":[[17303,7]]},"template:templates/docs/getting-started/overview":{"position":[[9795,8]]}},"keywords":{}}],["confid",{"_index":1676,"title":{},"text":{"template:docs/testing/assertions":{"position":[[520,10],[821,10],[1448,10]]},"template:templates/docs/testing/assertions":{"position":[[520,10],[821,10],[1448,10]]}},"keywords":{}}],["config",{"_index":116,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[439,7],[1102,10]]},"template:docs/advanced/server-configuration":{"position":[[965,7],[1240,6],[1657,6],[2268,7],[3165,10],[3543,10],[5129,10]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1455,6]]},"template:docs/getting-started/overview":{"position":[[8809,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1088,8],[1119,10]]},"template:docs/testing/setup-mirage":{"position":[[1080,6],[1498,10]]},"template:templates/docs/advanced/environment-options":{"position":[[439,7],[1102,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[965,7],[1240,6],[1657,6],[2268,7],[3165,10],[3543,10],[5129,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1455,6]]},"template:templates/docs/getting-started/overview":{"position":[[8809,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1088,8],[1119,10]]},"template:templates/docs/testing/setup-mirage":{"position":[[1080,6],[1498,10]]}},"keywords":{}}],["config.j",{"_index":247,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[179,10]]},"template:docs/testing/acceptance-tests":{"position":[[4668,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[179,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4668,9]]}},"keywords":{}}],["config.model",{"_index":137,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1174,16]]},"template:docs/advanced/server-configuration":{"position":[[3216,16],[3594,16],[5180,16]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1170,16]]},"template:docs/testing/setup-mirage":{"position":[[1549,16]]},"template:templates/docs/advanced/environment-options":{"position":[[1174,16]]},"template:templates/docs/advanced/server-configuration":{"position":[[3216,16],[3594,16],[5180,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1170,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[1549,16]]}},"keywords":{}}],["config/environ",{"_index":430,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1546,27]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1546,27]]}},"keywords":{}}],["config/environment.j",{"_index":100,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[88,21],[119,21],[552,21],[691,21],[2275,21],[2873,21]]},"template:docs/testing/assertions":{"position":[[2581,21]]},"template:templates/docs/advanced/environment-options":{"position":[[88,21],[119,21],[552,21],[691,21],[2275,21],[2873,21]]},"template:templates/docs/testing/assertions":{"position":[[2581,21]]}},"keywords":{}}],["configur",{"_index":56,"title":{"template:docs/advanced/server-configuration":{"position":[[7,13]]},"template:templates/docs/advanced/server-configuration":{"position":[[7,13]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[762,9],[842,9]]},"template:docs/advanced/environment-options":{"position":[[2077,9]]},"template:docs/advanced/server-configuration":{"position":[[8,13],[45,10],[3874,13]]},"template:docs/advanced/switching-between-scenarios":{"position":[[626,9],[952,9]]},"template:docs/data-layer/fixtures":{"position":[[1590,13]]},"template:docs/data-layer/orm":{"position":[[8843,11]]},"template:docs/getting-started/installation":{"position":[[414,13],[505,14],[635,14]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10750,12]]},"template:docs/getting-started/what-is-mirage":{"position":[[401,9]]},"template:docs/route-handlers/functions":{"position":[[7168,9]]},"template:docs/testing/assertions":{"position":[[3960,13]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5169,13]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[762,9],[842,9]]},"template:templates/docs/advanced/environment-options":{"position":[[2077,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[8,13],[45,10],[3874,13]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[626,9],[952,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1590,13]]},"template:templates/docs/data-layer/orm":{"position":[[8843,11]]},"template:templates/docs/getting-started/installation":{"position":[[414,13],[505,14],[635,14]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10750,12]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[401,9]]},"template:templates/docs/route-handlers/functions":{"position":[[7168,9]]},"template:templates/docs/testing/assertions":{"position":[[3960,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5169,13]]}},"keywords":{}}],["conflict",{"_index":299,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1997,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[1997,8]]}},"keywords":{}}],["confus",{"_index":1721,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[1804,9]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1804,9]]}},"keywords":{}}],["consid",{"_index":921,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[401,8]]},"template:docs/testing/assertions":{"position":[[3683,10]]},"template:templates/docs/data-layer/orm":{"position":[[401,8]]},"template:templates/docs/testing/assertions":{"position":[[3683,10]]}},"keywords":{}}],["consist",{"_index":1674,"title":{},"text":{"template:docs/testing/assertions":{"position":[[264,11]]},"template:templates/docs/testing/assertions":{"position":[[264,11]]}},"keywords":{}}],["const",{"_index":71,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1077,5]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1268,5],[1350,5],[1691,5],[1748,5],[1839,5]]},"template:docs/data-layer/factories":{"position":[[14443,5]]},"template:docs/testing/setup-mirage":{"position":[[1440,5]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1077,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1268,5],[1350,5],[1691,5],[1748,5],[1839,5]]},"template:templates/docs/data-layer/factories":{"position":[[14443,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[1440,5]]}},"keywords":{}}],["constructor",{"_index":230,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[854,13]]},"template:templates/docs/advanced/mocking-guids":{"position":[[854,13]]}},"keywords":{}}],["consum",{"_index":1730,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[3601,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3601,8]]}},"keywords":{}}],["consumpt",{"_index":1096,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[365,11]]},"template:templates/docs/data-layer/serializers/index":{"position":[[365,11]]}},"keywords":{}}],["contact",{"_index":1379,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7809,8],[7934,11]]},"template:docs/route-handlers/shorthands":{"position":[[2087,8],[3909,11],[3979,8],[4037,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7809,8],[7934,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2087,8],[3909,11],[3979,8],[4037,7]]}},"keywords":{}}],["contact.addresses.destroy",{"_index":1611,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[4066,28]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4066,28]]}},"keywords":{}}],["contact.destroy",{"_index":1612,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[4095,18]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4095,18]]}},"keywords":{}}],["contacts.find(id",{"_index":1602,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[2155,19],[4047,18]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2155,19],[4047,18]]}},"keywords":{}}],["contacts?ids=1,3",{"_index":1599,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[1920,19]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1920,19]]}},"keywords":{}}],["contain",{"_index":172,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2103,8]]},"template:docs/advanced/server-configuration":{"position":[[228,8],[979,8],[1339,7]]},"template:docs/data-layer/factories":{"position":[[13848,8],[15984,7]]},"template:docs/getting-started/overview":{"position":[[36,8],[1005,7],[10906,7]]},"template:docs/route-handlers/functions":{"position":[[2130,8],[2447,8],[2827,8]]},"template:templates/docs/advanced/environment-options":{"position":[[2103,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[228,8],[979,8],[1339,7]]},"template:templates/docs/data-layer/factories":{"position":[[13848,8],[15984,7]]},"template:templates/docs/getting-started/overview":{"position":[[36,8],[1005,7],[10906,7]]},"template:templates/docs/route-handlers/functions":{"position":[[2130,8],[2447,8],[2827,8]]}},"keywords":{}}],["content-typ",{"_index":1577,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[6295,12]]},"template:templates/docs/route-handlers/functions":{"position":[[6295,12]]}},"keywords":{}}],["context",{"_index":1561,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5456,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5464,7]]},"template:templates/docs/route-handlers/functions":{"position":[[5456,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5464,7]]}},"keywords":{}}],["context.owner.lookup('service:stor",{"_index":1746,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5500,38]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5500,38]]}},"keywords":{}}],["context.server.schema[key].al",{"_index":1748,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5589,30]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5589,30]]}},"keywords":{}}],["context.server.schema[resource].al",{"_index":1751,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5692,38]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5692,38]]}},"keywords":{}}],["context.server.serializerorregistry.serializerfor(modelnam",{"_index":1753,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5782,61]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5782,61]]}},"keywords":{}}],["continu",{"_index":712,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13331,8]]},"template:templates/docs/data-layer/factories":{"position":[[13331,8]]}},"keywords":{}}],["control",{"_index":125,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[831,8]]},"template:docs/advanced/server-configuration":{"position":[[606,7]]},"template:docs/data-layer/serializers/index":{"position":[[5199,11]]},"template:docs/getting-started/overview":{"position":[[9969,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4852,8],[8094,10]]},"template:templates/docs/advanced/environment-options":{"position":[[831,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[606,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5199,11]]},"template:templates/docs/getting-started/overview":{"position":[[9969,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4852,8],[8094,10]]}},"keywords":{}}],["conveni",{"_index":1142,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5475,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5475,10]]}},"keywords":{}}],["convent",{"_index":34,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[390,12],[543,12]]},"template:docs/data-layer/fixtures":{"position":[[302,12],[1570,10],[3477,10],[4767,10]]},"template:docs/data-layer/serializers/index":{"position":[[6909,12]]},"template:docs/getting-started/overview":{"position":[[9317,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14442,11],[15346,12]]},"template:docs/getting-started/what-is-mirage":{"position":[[475,11]]},"template:docs/route-handlers/functions":{"position":[[5690,12],[7540,12]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5246,11]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[390,12],[543,12]]},"template:templates/docs/data-layer/fixtures":{"position":[[302,12],[1570,10],[3477,10],[4767,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6909,12]]},"template:templates/docs/getting-started/overview":{"position":[[9317,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14442,11],[15346,12]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[475,11]]},"template:templates/docs/route-handlers/functions":{"position":[[5690,12],[7540,12]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5246,11]]}},"keywords":{}}],["cooki",{"_index":364,"title":{"template:docs/advanced/simulating-cookie-responses":{"position":[[11,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[11,6]]}},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[12,6],[212,7],[269,7],[720,7]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[12,6],[212,7],[269,7],[720,7]]}},"keywords":{}}],["cookieexpir",{"_index":382,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[448,16]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[448,16]]}},"keywords":{}}],["cool",{"_index":1463,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15149,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15149,4]]}},"keywords":{}}],["core",{"_index":444,"title":{},"text":{"template:docs/data-layer/database":{"position":[[21,4]]},"template:templates/docs/data-layer/database":{"position":[[21,4]]}},"keywords":{}}],["correct",{"_index":480,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1566,7]]},"template:docs/data-layer/serializers/index":{"position":[[5695,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6245,7],[7016,7]]},"template:docs/testing/assertions":{"position":[[571,7],[704,7],[780,7],[888,8],[2310,8]]},"template:templates/docs/data-layer/database":{"position":[[1566,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5695,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6245,7],[7016,7]]},"template:templates/docs/testing/assertions":{"position":[[571,7],[704,7],[780,7],[888,8],[2310,8]]}},"keywords":{}}],["correctli",{"_index":90,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1647,9],[1685,9]]},"template:docs/data-layer/factories":{"position":[[7014,9]]},"template:docs/data-layer/relationships":{"position":[[4380,9]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1647,9],[1685,9]]},"template:templates/docs/data-layer/factories":{"position":[[7014,9]]},"template:templates/docs/data-layer/relationships":{"position":[[4380,9]]}},"keywords":{}}],["correspond",{"_index":1273,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10198,13]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17634,13]]},"template:docs/route-handlers/shorthands":{"position":[[582,13]]},"template:templates/docs/getting-started/overview":{"position":[[10198,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17634,13]]},"template:templates/docs/route-handlers/shorthands":{"position":[[582,13]]}},"keywords":{}}],["count",{"_index":1226,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5338,6],[6984,6]]},"template:docs/testing/acceptance-tests":{"position":[[1829,6],[3186,6],[3832,6],[5611,6]]},"template:docs/testing/assertions":{"position":[[3322,6],[3375,5]]},"template:templates/docs/getting-started/overview":{"position":[[5338,6],[6984,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1829,6],[3186,6],[3832,6],[5611,6]]},"template:templates/docs/testing/assertions":{"position":[[3322,6],[3375,5]]}},"keywords":{}}],["countri",{"_index":782,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[445,10],[667,7],[705,9],[2311,9],[2511,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3975,11],[4318,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[445,10],[667,7],[705,9],[2311,9],[2511,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3975,11],[4318,9]]}},"keywords":{}}],["countries(i",{"_index":1338,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4218,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4218,12]]}},"keywords":{}}],["countries.length",{"_index":1340,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4407,18]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4407,18]]}},"keywords":{}}],["countries[i",{"_index":1339,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4393,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4393,11]]}},"keywords":{}}],["cours",{"_index":1250,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[7617,7]]},"template:docs/testing/acceptance-tests":{"position":[[3863,6]]},"template:templates/docs/getting-started/overview":{"position":[[7617,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3863,6]]}},"keywords":{}}],["cover",{"_index":456,"title":{},"text":{"template:docs/data-layer/database":{"position":[[487,5]]},"template:docs/data-layer/relationships":{"position":[[6079,5]]},"template:docs/data-layer/serializers/index":{"position":[[7175,7]]},"template:docs/route-handlers/shorthands":{"position":[[5972,5]]},"template:templates/docs/data-layer/database":{"position":[[487,5]]},"template:templates/docs/data-layer/relationships":{"position":[[6079,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[7175,7]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5972,5]]}},"keywords":{}}],["creat",{"_index":245,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[141,8],[492,6],[714,8],[826,8],[870,7],[3790,6],[4107,7],[4469,7],[4505,6],[4746,7],[4797,7]]},"template:docs/data-layer/database":{"position":[[1615,6]]},"template:docs/data-layer/factories":{"position":[[1332,6],[2279,7],[4565,6],[5924,6],[5973,8],[6179,6],[6454,8],[6643,6],[7350,7],[7497,6],[7784,6],[8078,7],[8326,8],[8417,6],[8929,8],[8996,8],[9056,7],[9181,7],[9260,6],[9735,6],[10416,6],[10521,7],[10942,6],[11466,7],[11497,7],[12029,8],[12160,8],[13807,6],[15170,6],[16835,6]]},"template:docs/data-layer/fixtures":{"position":[[2704,8],[3023,6]]},"template:docs/data-layer/models":{"position":[[845,7],[968,8],[987,6],[1525,7],[1609,6],[1781,6],[1833,8]]},"template:docs/data-layer/orm":{"position":[[5379,6],[6502,8],[6555,8],[6668,6],[7218,6],[7510,8]]},"template:docs/data-layer/relationships":{"position":[[1501,6],[1763,8],[6348,6]]},"template:docs/data-layer/serializers/index":{"position":[[2655,6],[2719,7]]},"template:docs/getting-started/overview":{"position":[[69,6],[130,7],[1491,8],[1886,6],[3222,6],[3733,7],[5409,6],[6581,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5302,7],[16344,8],[16529,6],[16590,6]]},"template:docs/route-handlers/functions":{"position":[[4111,8]]},"template:docs/route-handlers/shorthands":{"position":[[711,8],[779,7],[965,7],[2223,8],[5666,6]]},"template:docs/testing/acceptance-tests":{"position":[[2865,6],[5240,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1723,8],[1911,6],[3166,6],[3365,6]]},"template:docs/testing/setup-mirage":{"position":[[215,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[141,8],[492,6],[714,8],[826,8],[870,7],[3790,6],[4107,7],[4469,7],[4505,6],[4746,7],[4797,7]]},"template:templates/docs/data-layer/database":{"position":[[1615,6]]},"template:templates/docs/data-layer/factories":{"position":[[1332,6],[2279,7],[4565,6],[5924,6],[5973,8],[6179,6],[6454,8],[6643,6],[7350,7],[7497,6],[7784,6],[8078,7],[8326,8],[8417,6],[8929,8],[8996,8],[9056,7],[9181,7],[9260,6],[9735,6],[10416,6],[10521,7],[10942,6],[11466,7],[11497,7],[12029,8],[12160,8],[13807,6],[15170,6],[16835,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[2704,8],[3023,6]]},"template:templates/docs/data-layer/models":{"position":[[845,7],[968,8],[987,6],[1525,7],[1609,6],[1781,6],[1833,8]]},"template:templates/docs/data-layer/orm":{"position":[[5379,6],[6502,8],[6555,8],[6668,6],[7218,6],[7510,8]]},"template:templates/docs/data-layer/relationships":{"position":[[1501,6],[1763,8],[6348,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2655,6],[2719,7]]},"template:templates/docs/getting-started/overview":{"position":[[69,6],[130,7],[1491,8],[1886,6],[3222,6],[3733,7],[5409,6],[6581,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5302,7],[16344,8],[16529,6],[16590,6]]},"template:templates/docs/route-handlers/functions":{"position":[[4111,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[711,8],[779,7],[965,7],[2223,8],[5666,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2865,6],[5240,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1723,8],[1911,6],[3166,6],[3365,6]]},"template:templates/docs/testing/setup-mirage":{"position":[[215,7]]}},"keywords":{}}],["createlist",{"_index":583,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[4576,10],[6514,11],[7508,11],[10426,11],[10952,10],[15181,10]]},"template:docs/getting-started/overview":{"position":[[5419,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5310,10]]},"template:docs/testing/acceptance-tests":{"position":[[2876,10]]},"template:templates/docs/data-layer/factories":{"position":[[4576,10],[6514,11],[7508,11],[10426,11],[10952,10],[15181,10]]},"template:templates/docs/getting-started/overview":{"position":[[5419,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5310,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2876,10]]}},"keywords":{}}],["createserv",{"_index":333,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3079,12],[3457,12],[5043,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1032,12]]},"template:docs/testing/setup-mirage":{"position":[[1408,12]]},"template:templates/docs/advanced/server-configuration":{"position":[[3079,12],[3457,12],[5043,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1032,12]]},"template:templates/docs/testing/setup-mirage":{"position":[[1408,12]]}},"keywords":{}}],["createserver(finalconfig",{"_index":140,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1212,26]]},"template:docs/advanced/server-configuration":{"position":[[3312,26],[3632,26],[5278,26]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1208,26]]},"template:docs/testing/setup-mirage":{"position":[[1713,26]]},"template:templates/docs/advanced/environment-options":{"position":[[1212,26]]},"template:templates/docs/advanced/server-configuration":{"position":[[3312,26],[3632,26],[5278,26]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1208,26]]},"template:templates/docs/testing/setup-mirage":{"position":[[1713,26]]}},"keywords":{}}],["creation",{"_index":675,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9800,8]]},"template:docs/data-layer/fixtures":{"position":[[5284,9]]},"template:templates/docs/data-layer/factories":{"position":[[9800,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[5284,9]]}},"keywords":{}}],["crew",{"_index":1256,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8879,4]]},"template:templates/docs/getting-started/overview":{"position":[[8879,4]]}},"keywords":{}}],["crew-memb",{"_index":1257,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8936,15]]},"template:templates/docs/getting-started/overview":{"position":[[8936,15]]}},"keywords":{}}],["crewmemb",{"_index":1255,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8635,13]]},"template:templates/docs/getting-started/overview":{"position":[[8635,13]]}},"keywords":{}}],["critic",{"_index":1500,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[18783,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18783,8]]}},"keywords":{}}],["crystal",{"_index":598,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5757,8]]},"template:templates/docs/data-layer/factories":{"position":[[5757,8]]}},"keywords":{}}],["crystalschaef",{"_index":600,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5787,17]]},"template:templates/docs/data-layer/factories":{"position":[[5787,17]]}},"keywords":{}}],["cumbersom",{"_index":540,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1955,10]]},"template:docs/route-handlers/functions":{"position":[[7459,10]]},"template:templates/docs/data-layer/factories":{"position":[[1955,10]]},"template:templates/docs/route-handlers/functions":{"position":[[7459,10]]}},"keywords":{}}],["current",{"_index":166,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1958,9]]},"template:docs/advanced/server-configuration":{"position":[[749,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[519,9]]},"template:docs/getting-started/installation":{"position":[[1213,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9121,7],[10675,7],[13777,7],[17110,9],[17522,10]]},"template:templates/docs/advanced/environment-options":{"position":[[1958,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[749,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[519,9]]},"template:templates/docs/getting-started/installation":{"position":[[1213,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9121,7],[10675,7],[13777,7],[17110,9],[17522,10]]}},"keywords":{}}],["custom",{"_index":11,"title":{"template:docs/advanced/customizing-the-inflector":{"position":[[0,11]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[0,11]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1,11],[92,9],[1459,6]]},"template:docs/advanced/mocking-guids":{"position":[[316,9],[473,6]]},"template:docs/advanced/server-configuration":{"position":[[109,9]]},"template:docs/data-layer/factories":{"position":[[8255,9]]},"template:docs/data-layer/fixtures":{"position":[[1729,9]]},"template:docs/data-layer/relationships":{"position":[[6140,9]]},"template:docs/data-layer/serializers/index":{"position":[[1983,9],[2474,9],[2955,9],[3040,11],[3081,11],[3594,13],[7127,9]]},"template:docs/getting-started/overview":{"position":[[101,9],[7837,9],[9192,6]]},"template:docs/route-handlers/functions":{"position":[[5791,6],[6344,9]]},"template:docs/route-handlers/shorthands":{"position":[[155,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1,11],[92,9],[1459,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[316,9],[473,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[109,9]]},"template:templates/docs/data-layer/factories":{"position":[[8255,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1729,9]]},"template:templates/docs/data-layer/relationships":{"position":[[6140,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1983,9],[2474,9],[2955,9],[3040,11],[3081,11],[3594,13],[7127,9]]},"template:templates/docs/getting-started/overview":{"position":[[101,9],[7837,9],[9192,6]]},"template:templates/docs/route-handlers/functions":{"position":[[5791,6],[6344,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[155,6]]}},"keywords":{}}],["custom-inflector-rul",{"_index":76,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1236,25]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1236,25]]}},"keywords":{}}],["customiz",{"_index":1446,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13931,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13931,12]]}},"keywords":{}}],["d",{"_index":1285,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[122,2],[170,2],[3084,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[122,2],[170,2],[3084,2]]}},"keywords":{}}],["dark",{"_index":488,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1713,4],[1853,4]]},"template:templates/docs/data-layer/database":{"position":[[1713,4],[1853,4]]}},"keywords":{}}],["dasher",{"_index":790,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[747,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6724,10],[14092,11],[14457,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[747,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6724,10],[14092,11],[14457,10]]}},"keywords":{}}],["dasherize(attr",{"_index":1251,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8308,16],[8362,16]]},"template:templates/docs/getting-started/overview":{"position":[[8308,16],[8362,16]]}},"keywords":{}}],["data",{"_index":15,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[44,5],[328,4]]},"template:docs/advanced/environment-options":{"position":[[2469,4],[2527,4],[2607,4]]},"template:docs/advanced/server-configuration":{"position":[[1414,4],[1770,4],[2046,5],[2126,5],[3838,4],[3963,4],[4408,4],[4935,4]]},"template:docs/data-layer/database":{"position":[[38,4],[695,4],[1086,4],[1574,5]]},"template:docs/data-layer/factories":{"position":[[721,4],[1905,5],[3862,5],[4344,5],[5669,5],[5942,5],[6002,4],[6197,4],[6671,5],[12069,4],[16238,4],[17464,4]]},"template:docs/data-layer/fixtures":{"position":[[81,5],[183,4],[251,4],[810,4],[1434,4],[2436,4],[3254,5],[5279,4]]},"template:docs/data-layer/models":{"position":[[273,5],[621,4],[1842,4]]},"template:docs/data-layer/orm":{"position":[[67,4],[672,4],[927,5],[1203,5],[1679,5],[2236,5],[2338,5],[3197,5],[3566,5],[3624,4],[4554,5],[4909,4],[5287,5],[5490,4],[5615,5],[5766,5],[6531,4],[6584,4],[7094,4]]},"template:docs/data-layer/relationships":{"position":[[227,4],[6376,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[355,4],[567,4],[905,4],[1357,4],[1901,4]]},"template:docs/data-layer/serializers/index":{"position":[[276,5],[480,4],[839,4],[1045,5],[1798,4],[4278,5],[4386,5],[4642,5],[4991,5],[5223,4],[7212,4]]},"template:docs/getting-started/overview":{"position":[[478,5],[778,5],[792,4],[965,4],[1100,4],[1359,4],[1479,4],[1599,4],[1734,4],[1838,5],[2259,4],[2622,4],[2952,5],[3045,5],[3142,4],[3434,5],[4025,4],[4493,5],[5711,5],[6608,5],[7469,5],[7569,4],[8513,5],[10945,4],[10990,4],[11049,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7920,5],[8011,5],[9058,4],[9160,4],[9370,5],[9476,4],[9577,5],[9657,5],[9759,4],[9982,4],[10206,5],[10230,5],[10517,6],[10621,4],[10928,5],[11297,5],[11556,4],[17444,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[1486,4],[1554,5],[1905,4],[1965,4]]},"template:docs/route-handlers/functions":{"position":[[373,5],[1828,4],[1927,4],[2056,4],[2456,4],[2730,5],[4191,4],[4213,5],[4348,5]]},"template:docs/route-handlers/shorthands":{"position":[[732,5],[2713,4],[3404,4],[4219,4],[5906,4]]},"template:docs/testing/acceptance-tests":{"position":[[1505,4]]},"template:docs/testing/assertions":{"position":[[332,4],[579,4],[712,4],[788,4],[1304,4],[1499,4],[2116,4],[2302,4],[3847,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1738,4],[1861,4],[3007,4],[3215,4],[5120,4],[6246,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[44,5],[328,4]]},"template:templates/docs/advanced/environment-options":{"position":[[2469,4],[2527,4],[2607,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[1414,4],[1770,4],[2046,5],[2126,5],[3838,4],[3963,4],[4408,4],[4935,4]]},"template:templates/docs/data-layer/database":{"position":[[38,4],[695,4],[1086,4],[1574,5]]},"template:templates/docs/data-layer/factories":{"position":[[721,4],[1905,5],[3862,5],[4344,5],[5669,5],[5942,5],[6002,4],[6197,4],[6671,5],[12069,4],[16238,4],[17464,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[81,5],[183,4],[251,4],[810,4],[1434,4],[2436,4],[3254,5],[5279,4]]},"template:templates/docs/data-layer/models":{"position":[[273,5],[621,4],[1842,4]]},"template:templates/docs/data-layer/orm":{"position":[[67,4],[672,4],[927,5],[1203,5],[1679,5],[2236,5],[2338,5],[3197,5],[3566,5],[3624,4],[4554,5],[4909,4],[5287,5],[5490,4],[5615,5],[5766,5],[6531,4],[6584,4],[7094,4]]},"template:templates/docs/data-layer/relationships":{"position":[[227,4],[6376,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[355,4],[567,4],[905,4],[1357,4],[1901,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[276,5],[480,4],[839,4],[1045,5],[1798,4],[4278,5],[4386,5],[4642,5],[4991,5],[5223,4],[7212,4]]},"template:templates/docs/getting-started/overview":{"position":[[478,5],[778,5],[792,4],[965,4],[1100,4],[1359,4],[1479,4],[1599,4],[1734,4],[1838,5],[2259,4],[2622,4],[2952,5],[3045,5],[3142,4],[3434,5],[4025,4],[4493,5],[5711,5],[6608,5],[7469,5],[7569,4],[8513,5],[10945,4],[10990,4],[11049,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7920,5],[8011,5],[9058,4],[9160,4],[9370,5],[9476,4],[9577,5],[9657,5],[9759,4],[9982,4],[10206,5],[10230,5],[10517,6],[10621,4],[10928,5],[11297,5],[11556,4],[17444,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1486,4],[1554,5],[1905,4],[1965,4]]},"template:templates/docs/route-handlers/functions":{"position":[[373,5],[1828,4],[1927,4],[2056,4],[2456,4],[2730,5],[4191,4],[4213,5],[4348,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[732,5],[2713,4],[3404,4],[4219,4],[5906,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1505,4]]},"template:templates/docs/testing/assertions":{"position":[[332,4],[579,4],[712,4],[788,4],[1304,4],[1499,4],[2116,4],[2302,4],[3847,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1738,4],[1861,4],[3007,4],[3215,4],[5120,4],[6246,4]]}},"keywords":{}}],["data'",{"_index":1732,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[3798,6],[4101,6],[6173,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3798,6],[4101,6],[6173,6]]}},"keywords":{}}],["data-cr",{"_index":510,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[472,13]]},"template:templates/docs/data-layer/factories":{"position":[[472,13]]}},"keywords":{}}],["data-driven",{"_index":542,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2036,11]]},"template:templates/docs/data-layer/factories":{"position":[[2036,11]]}},"keywords":{}}],["data-fetch",{"_index":1705,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[171,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[171,13]]}},"keywords":{}}],["data-load",{"_index":1406,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[10032,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10032,12]]}},"keywords":{}}],["databas",{"_index":50,"title":{"template:docs/data-layer/database":{"position":[[4,8]]},"template:templates/docs/data-layer/database":{"position":[[4,8]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[710,8]]},"template:docs/advanced/mocking-guids":{"position":[[174,8],[335,8],[649,9],[685,8]]},"template:docs/advanced/switching-between-scenarios":{"position":[[286,9]]},"template:docs/data-layer/database":{"position":[[5,8],[71,9],[86,8],[224,8],[407,8],[635,8],[1255,8],[1350,8],[1487,8],[1901,8]]},"template:docs/data-layer/factories":{"position":[[934,8],[1378,9],[1722,8],[3155,8],[7036,9],[13475,9],[14852,9],[15116,8],[15576,8],[17650,9]]},"template:docs/data-layer/fixtures":{"position":[[67,8],[1475,9],[1822,8],[3218,8],[3800,8]]},"template:docs/data-layer/orm":{"position":[[51,8],[412,8],[6633,8],[6729,9],[7085,8],[7658,8],[8055,8],[8298,9]]},"template:docs/data-layer/relationships":{"position":[[1448,9]]},"template:docs/getting-started/overview":{"position":[[2181,9],[2195,8],[2557,8],[2698,9],[2821,8],[2986,8],[3026,8],[3931,8],[3951,8],[4182,9],[4766,9],[4880,8],[7204,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7626,8],[12764,9],[12947,9],[14121,8],[14850,8],[15047,8],[16318,8],[16516,9],[16993,9]]},"template:docs/getting-started/what-is-mirage":{"position":[[1278,8],[1454,8]]},"template:docs/route-handlers/shorthands":{"position":[[2727,9],[3418,9]]},"template:docs/testing/acceptance-tests":{"position":[[1589,8],[4303,8],[4472,8]]},"template:docs/testing/assertions":{"position":[[628,8],[763,9],[2107,8],[2293,8],[3606,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4989,8],[5064,8]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[710,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[174,8],[335,8],[649,9],[685,8]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[286,9]]},"template:templates/docs/data-layer/database":{"position":[[5,8],[71,9],[86,8],[224,8],[407,8],[635,8],[1255,8],[1350,8],[1487,8],[1901,8]]},"template:templates/docs/data-layer/factories":{"position":[[934,8],[1378,9],[1722,8],[3155,8],[7036,9],[13475,9],[14852,9],[15116,8],[15576,8],[17650,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[67,8],[1475,9],[1822,8],[3218,8],[3800,8]]},"template:templates/docs/data-layer/orm":{"position":[[51,8],[412,8],[6633,8],[6729,9],[7085,8],[7658,8],[8055,8],[8298,9]]},"template:templates/docs/data-layer/relationships":{"position":[[1448,9]]},"template:templates/docs/getting-started/overview":{"position":[[2181,9],[2195,8],[2557,8],[2698,9],[2821,8],[2986,8],[3026,8],[3931,8],[3951,8],[4182,9],[4766,9],[4880,8],[7204,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7626,8],[12764,9],[12947,9],[14121,8],[14850,8],[15047,8],[16318,8],[16516,9],[16993,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1278,8],[1454,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2727,9],[3418,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1589,8],[4303,8],[4472,8]]},"template:templates/docs/testing/assertions":{"position":[[628,8],[763,9],[2107,8],[2293,8],[3606,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4989,8],[5064,8]]}},"keywords":{}}],["date",{"_index":381,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[436,7]]},"template:docs/data-layer/factories":{"position":[[3807,6]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[436,7]]},"template:templates/docs/data-layer/factories":{"position":[[3807,6]]}},"keywords":{}}],["date(now.gettim",{"_index":383,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[471,18]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[471,18]]}},"keywords":{}}],["db",{"_index":1020,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[1342,3],[1548,3],[1643,2]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16389,2],[17610,2],[17943,2],[18056,2],[18153,2],[18395,2],[18425,2]]},"template:templates/docs/data-layer/relationships":{"position":[[1342,3],[1548,3],[1643,2]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16389,2],[17610,2],[17943,2],[18056,2],[18153,2],[18395,2],[18425,2]]}},"keywords":{}}],["db.blog_post",{"_index":1461,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15071,14]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15071,14]]}},"keywords":{}}],["db.blog_posts.filter(p",{"_index":1468,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15521,22]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15521,22]]}},"keywords":{}}],["db.blogpost",{"_index":1483,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16713,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16713,12]]}},"keywords":{}}],["db.blogposts.filter(p",{"_index":1470,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15582,21]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15582,21]]}},"keywords":{}}],["db.dump",{"_index":922,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[443,10]]},"template:templates/docs/data-layer/orm":{"position":[[443,10]]}},"keywords":{}}],["deal",{"_index":914,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[193,7],[1013,4]]},"template:docs/data-layer/serializers/index":{"position":[[3738,7],[6670,7]]},"template:docs/getting-started/overview":{"position":[[1240,4],[5779,7],[5849,4]]},"template:docs/route-handlers/shorthands":{"position":[[91,4]]},"template:templates/docs/data-layer/orm":{"position":[[193,7],[1013,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3738,7],[6670,7]]},"template:templates/docs/getting-started/overview":{"position":[[1240,4],[5779,7],[5849,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[91,4]]}},"keywords":{}}],["declar",{"_index":770,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17493,7]]},"template:docs/getting-started/overview":{"position":[[6019,7]]},"template:templates/docs/data-layer/factories":{"position":[[17493,7]]},"template:templates/docs/getting-started/overview":{"position":[[6019,7]]}},"keywords":{}}],["default",{"_index":26,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[189,8],[1220,7]]},"template:docs/advanced/environment-options":{"position":[[239,8],[373,7],[897,7],[1029,8],[1055,7],[1439,8],[1461,8],[1867,8],[1915,7],[2147,7],[2500,8]]},"template:docs/advanced/mocking-guids":{"position":[[838,7]]},"template:docs/advanced/server-configuration":{"position":[[246,7],[757,7],[841,7],[908,7],[1221,7],[1496,8],[3118,7],[3496,7],[4646,7],[5082,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[657,7],[967,7],[1812,7],[1936,7],[2054,7],[2167,8]]},"template:docs/data-layer/database":{"position":[[755,7]]},"template:docs/data-layer/factories":{"position":[[890,7],[1099,7],[1590,7],[2370,7],[2534,7],[2860,7],[3515,7],[5459,7],[7619,7],[7678,7],[7911,7],[9341,7],[10135,7],[10744,7],[11589,7],[12392,7],[12658,7],[12920,7],[13166,7],[13599,7],[13912,7],[14183,7],[14505,7]]},"template:docs/data-layer/fixtures":{"position":[[397,7],[875,7],[1955,7],[2223,7],[2890,7],[2949,7],[3979,7],[4062,7],[4340,7],[4418,7],[4584,7],[4685,7]]},"template:docs/data-layer/models":{"position":[[953,7],[1317,7],[1688,7]]},"template:docs/data-layer/orm":{"position":[[3298,7],[4449,7],[5059,7],[5231,7],[6127,7]]},"template:docs/data-layer/relationships":{"position":[[641,7],[1942,7],[2738,7],[3090,7],[3158,7],[3717,7],[3788,7],[4107,7],[4178,7],[4679,7],[4786,7],[4865,7],[5535,7],[5629,7],[5686,7]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[375,7],[1220,7],[1651,7]]},"template:docs/data-layer/serializers/index":{"position":[[1008,7],[2154,7],[2337,7],[2794,7],[3160,9],[3448,7],[4141,7],[4785,7],[6024,7]]},"template:docs/getting-started/installation":{"position":[[449,8]]},"template:docs/getting-started/overview":{"position":[[2055,7],[3512,7],[4281,7],[6136,7],[6270,7],[7345,7],[8249,7],[8596,7],[10112,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[586,7],[802,7],[1071,7],[1263,7],[7352,8],[7671,7],[8271,8],[10568,8],[10850,8],[11048,7],[11727,7],[11838,7],[12302,7],[12431,7],[13545,7],[13587,7],[13679,7],[15729,7],[15882,7],[16658,7]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[97,7]]},"template:docs/route-handlers/functions":{"position":[[1037,7],[1270,7],[3679,7],[6055,8],[6523,7],[6876,8]]},"template:docs/route-handlers/shorthands":{"position":[[1146,7]]},"template:docs/testing/acceptance-tests":{"position":[[2544,7],[5288,7],[5403,7]]},"template:docs/testing/assertions":{"position":[[2757,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5439,7]]},"template:docs/testing/setup-mirage":{"position":[[1072,7]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[189,8],[1220,7]]},"template:templates/docs/advanced/environment-options":{"position":[[239,8],[373,7],[897,7],[1029,8],[1055,7],[1439,8],[1461,8],[1867,8],[1915,7],[2147,7],[2500,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[838,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[246,7],[757,7],[841,7],[908,7],[1221,7],[1496,8],[3118,7],[3496,7],[4646,7],[5082,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[657,7],[967,7],[1812,7],[1936,7],[2054,7],[2167,8]]},"template:templates/docs/data-layer/database":{"position":[[755,7]]},"template:templates/docs/data-layer/factories":{"position":[[890,7],[1099,7],[1590,7],[2370,7],[2534,7],[2860,7],[3515,7],[5459,7],[7619,7],[7678,7],[7911,7],[9341,7],[10135,7],[10744,7],[11589,7],[12392,7],[12658,7],[12920,7],[13166,7],[13599,7],[13912,7],[14183,7],[14505,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[397,7],[875,7],[1955,7],[2223,7],[2890,7],[2949,7],[3979,7],[4062,7],[4340,7],[4418,7],[4584,7],[4685,7]]},"template:templates/docs/data-layer/models":{"position":[[953,7],[1317,7],[1688,7]]},"template:templates/docs/data-layer/orm":{"position":[[3298,7],[4449,7],[5059,7],[5231,7],[6127,7]]},"template:templates/docs/data-layer/relationships":{"position":[[641,7],[1942,7],[2738,7],[3090,7],[3158,7],[3717,7],[3788,7],[4107,7],[4178,7],[4679,7],[4786,7],[4865,7],[5535,7],[5629,7],[5686,7]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[375,7],[1220,7],[1651,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1008,7],[2154,7],[2337,7],[2794,7],[3160,9],[3448,7],[4141,7],[4785,7],[6024,7]]},"template:templates/docs/getting-started/installation":{"position":[[449,8]]},"template:templates/docs/getting-started/overview":{"position":[[2055,7],[3512,7],[4281,7],[6136,7],[6270,7],[7345,7],[8249,7],[8596,7],[10112,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[586,7],[802,7],[1071,7],[1263,7],[7352,8],[7671,7],[8271,8],[10568,8],[10850,8],[11048,7],[11727,7],[11838,7],[12302,7],[12431,7],[13545,7],[13587,7],[13679,7],[15729,7],[15882,7],[16658,7]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[97,7]]},"template:templates/docs/route-handlers/functions":{"position":[[1037,7],[1270,7],[3679,7],[6055,8],[6523,7],[6876,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1146,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2544,7],[5288,7],[5403,7]]},"template:templates/docs/testing/assertions":{"position":[[2757,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5439,7]]},"template:templates/docs/testing/setup-mirage":{"position":[[1072,7]]}},"keywords":{}}],["default.j",{"_index":396,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[101,10]]},"template:docs/data-layer/factories":{"position":[[14272,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[101,10]]},"template:templates/docs/data-layer/factories":{"position":[[14272,11]]}},"keywords":{}}],["defin",{"_index":249,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[281,8],[404,7],[1898,7],[2154,6],[4012,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[895,7]]},"template:docs/data-layer/factories":{"position":[[513,6],[605,8],[669,7],[1278,7],[1978,6],[2437,6],[4394,8],[6956,7],[9915,6],[10005,6],[11433,6],[15781,6],[15952,6]]},"template:docs/data-layer/fixtures":{"position":[[2036,8]]},"template:docs/data-layer/models":{"position":[[151,6],[372,6],[747,8],[766,6],[2780,8],[2809,6]]},"template:docs/data-layer/orm":{"position":[[3092,8],[3209,6],[3403,6],[3748,8],[4320,7],[8916,6]]},"template:docs/data-layer/relationships":{"position":[[27,7],[56,6],[266,7],[299,6],[426,6],[488,6],[693,7],[1799,6]]},"template:docs/data-layer/serializers/index":{"position":[[1763,7],[2072,8],[2142,6],[2534,6],[3968,8]]},"template:docs/getting-started/overview":{"position":[[1639,8],[3302,6],[10226,8],[10520,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[608,7],[10375,7],[12178,6],[12666,6],[16251,6],[16805,6],[17585,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1495,8]]},"template:docs/route-handlers/functions":{"position":[[93,6],[2884,6]]},"template:docs/route-handlers/shorthands":{"position":[[4203,7],[4276,6],[4391,7],[4610,7],[4713,7],[4808,7],[4904,7],[5075,6],[5196,7]]},"template:docs/testing/acceptance-tests":{"position":[[1653,6],[4629,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[954,6],[1040,7],[2494,8]]},"template:docs/testing/setup-mirage":{"position":[[588,8],[1188,6]]},"template:index":{"position":[[116,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[281,8],[404,7],[1898,7],[2154,6],[4012,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[895,7]]},"template:templates/docs/data-layer/factories":{"position":[[513,6],[605,8],[669,7],[1278,7],[1978,6],[2437,6],[4394,8],[6956,7],[9915,6],[10005,6],[11433,6],[15781,6],[15952,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[2036,8]]},"template:templates/docs/data-layer/models":{"position":[[151,6],[372,6],[747,8],[766,6],[2780,8],[2809,6]]},"template:templates/docs/data-layer/orm":{"position":[[3092,8],[3209,6],[3403,6],[3748,8],[4320,7],[8916,6]]},"template:templates/docs/data-layer/relationships":{"position":[[27,7],[56,6],[266,7],[299,6],[426,6],[488,6],[693,7],[1799,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1763,7],[2072,8],[2142,6],[2534,6],[3968,8]]},"template:templates/docs/getting-started/overview":{"position":[[1639,8],[3302,6],[10226,8],[10520,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[608,7],[10375,7],[12178,6],[12666,6],[16251,6],[16805,6],[17585,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1495,8]]},"template:templates/docs/route-handlers/functions":{"position":[[93,6],[2884,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4203,7],[4276,6],[4391,7],[4610,7],[4713,7],[4808,7],[4904,7],[5075,6],[5196,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1653,6],[4629,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[954,6],[1040,7],[2494,8]]},"template:templates/docs/testing/setup-mirage":{"position":[[588,8],[1188,6]]},"template:templates/index":{"position":[[116,6]]}},"keywords":{}}],["definit",{"_index":173,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2131,11],[2242,10]]},"template:docs/advanced/server-configuration":{"position":[[1378,11],[1955,11]]},"template:docs/data-layer/factories":{"position":[[770,10],[3139,11],[12771,12]]},"template:docs/data-layer/models":{"position":[[1503,10]]},"template:docs/data-layer/orm":{"position":[[3475,10],[6490,11]]},"template:docs/data-layer/relationships":{"position":[[4623,11],[6317,11]]},"template:docs/getting-started/overview":{"position":[[1739,12],[4085,11],[9784,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2128,12],[11639,11],[17392,11],[17707,11]]},"template:docs/route-handlers/shorthands":{"position":[[215,11]]},"template:docs/testing/acceptance-tests":{"position":[[4524,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3190,11],[3884,12]]},"template:templates/docs/advanced/environment-options":{"position":[[2131,11],[2242,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1378,11],[1955,11]]},"template:templates/docs/data-layer/factories":{"position":[[770,10],[3139,11],[12771,12]]},"template:templates/docs/data-layer/models":{"position":[[1503,10]]},"template:templates/docs/data-layer/orm":{"position":[[3475,10],[6490,11]]},"template:templates/docs/data-layer/relationships":{"position":[[4623,11],[6317,11]]},"template:templates/docs/getting-started/overview":{"position":[[1739,12],[4085,11],[9784,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2128,12],[11639,11],[17392,11],[17707,11]]},"template:templates/docs/route-handlers/shorthands":{"position":[[215,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4524,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3190,11],[3884,12]]}},"keywords":{}}],["del",{"_index":1264,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[9546,3]]},"template:docs/route-handlers/functions":{"position":[[161,3],[6195,3]]},"template:docs/route-handlers/shorthands":{"position":[[1210,3]]},"template:templates/docs/getting-started/overview":{"position":[[9546,3]]},"template:templates/docs/route-handlers/functions":{"position":[[161,3],[6195,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1210,3]]}},"keywords":{}}],["delay",{"_index":1525,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[796,5],[1045,5],[1520,6],[1662,7]]},"template:templates/docs/route-handlers/functions":{"position":[[796,5],[1045,5],[1520,6],[1662,7]]}},"keywords":{}}],["deleg",{"_index":889,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1751,9]]},"template:docs/data-layer/orm":{"position":[[4741,10]]},"template:templates/docs/data-layer/models":{"position":[[1751,9]]},"template:templates/docs/data-layer/orm":{"position":[[4741,10]]}},"keywords":{}}],["delet",{"_index":903,"title":{},"text":{"template:docs/data-layer/models":{"position":[[2374,8],[2614,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13753,6]]},"template:docs/route-handlers/shorthands":{"position":[[3499,6],[5748,6]]},"template:templates/docs/data-layer/models":{"position":[[2374,8],[2614,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13753,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[3499,6],[5748,6]]}},"keywords":{}}],["depend",{"_index":310,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2436,12]]},"template:docs/data-layer/factories":{"position":[[5175,9],[5211,6]]},"template:docs/data-layer/serializers/index":{"position":[[784,7]]},"template:docs/getting-started/installation":{"position":[[173,7],[203,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2446,12],[2730,13]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5155,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[2436,12]]},"template:templates/docs/data-layer/factories":{"position":[[5175,9],[5211,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[784,7]]},"template:templates/docs/getting-started/installation":{"position":[[173,7],[203,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2446,12],[2730,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5155,6]]}},"keywords":{}}],["deprec",{"_index":1353,"title":{"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[0,12]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[0,12]]}},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5282,10],[6023,11]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[1,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5282,10],[6023,11]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[1,12]]}},"keywords":{}}],["deprecated/unintent",{"_index":1357,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5709,24]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5709,24]]}},"keywords":{}}],["deriv",{"_index":283,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1390,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[1390,7]]}},"keywords":{}}],["design",{"_index":1248,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[7236,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8759,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[56,8]]},"template:templates/docs/getting-started/overview":{"position":[[7236,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8759,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[56,8]]}},"keywords":{}}],["desir",{"_index":1384,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8318,7]]},"template:docs/testing/setup-mirage":{"position":[[1051,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8318,7]]},"template:templates/docs/testing/setup-mirage":{"position":[[1051,9]]}},"keywords":{}}],["destroy",{"_index":1608,"title":{},"text":{"template:docs/route-handlers/shorthands":{"position":[[3517,10],[3828,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[3517,10],[3828,10]]}},"keywords":{}}],["destructur",{"_index":1496,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[18315,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18315,13]]}},"keywords":{}}],["detail",{"_index":670,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9588,7],[16204,7],[16907,7]]},"template:docs/data-layer/serializers/index":{"position":[[5289,8]]},"template:docs/getting-started/overview":{"position":[[7128,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[18668,8]]},"template:docs/testing/acceptance-tests":{"position":[[2309,7],[3242,6]]},"template:docs/testing/assertions":{"position":[[3709,7]]},"template:templates/docs/data-layer/factories":{"position":[[9588,7],[16204,7],[16907,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5289,8]]},"template:templates/docs/getting-started/overview":{"position":[[7128,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18668,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2309,7],[3242,6]]},"template:templates/docs/testing/assertions":{"position":[[3709,7]]}},"keywords":{}}],["detect",{"_index":1566,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[5636,6]]},"template:templates/docs/route-handlers/functions":{"position":[[5636,6]]}},"keywords":{}}],["develop",{"_index":108,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[297,11],[675,12],[737,14],[955,11],[1684,11]]},"template:docs/advanced/server-configuration":{"position":[[547,11]]},"template:docs/advanced/switching-between-scenarios":{"position":[[156,11],[189,12],[695,11]]},"template:docs/data-layer/factories":{"position":[[143,10],[551,11],[977,10],[1872,7],[5103,11],[13416,11],[13463,11],[13711,12],[14316,11],[14584,10],[14955,11],[15077,11],[16794,9]]},"template:docs/data-layer/fixtures":{"position":[[1838,12]]},"template:docs/getting-started/installation":{"position":[[677,11],[1378,7],[1592,7]]},"template:docs/getting-started/overview":{"position":[[4170,11],[5729,11],[10354,7],[10636,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9211,7],[15185,10]]},"template:docs/getting-started/what-is-mirage":{"position":[[67,10],[297,9],[608,10],[729,11],[825,10],[1109,7]]},"template:docs/route-handlers/functions":{"position":[[1066,12]]},"template:docs/testing/acceptance-tests":{"position":[[4793,12],[4981,11],[5124,11]]},"template:docs/testing/assertions":{"position":[[2800,11]]},"template:index":{"position":[[66,10]]},"template:templates/docs/advanced/environment-options":{"position":[[297,11],[675,12],[737,14],[955,11],[1684,11]]},"template:templates/docs/advanced/server-configuration":{"position":[[547,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[156,11],[189,12],[695,11]]},"template:templates/docs/data-layer/factories":{"position":[[143,10],[551,11],[977,10],[1872,7],[5103,11],[13416,11],[13463,11],[13711,12],[14316,11],[14584,10],[14955,11],[15077,11],[16794,9]]},"template:templates/docs/data-layer/fixtures":{"position":[[1838,12]]},"template:templates/docs/getting-started/installation":{"position":[[677,11],[1378,7],[1592,7]]},"template:templates/docs/getting-started/overview":{"position":[[4170,11],[5729,11],[10354,7],[10636,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9211,7],[15185,10]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[67,10],[297,9],[608,10],[729,11],[825,10],[1109,7]]},"template:templates/docs/route-handlers/functions":{"position":[[1066,12]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4793,12],[4981,11],[5124,11]]},"template:templates/docs/testing/assertions":{"position":[[2800,11]]},"template:templates/index":{"position":[[66,10]]}},"keywords":{}}],["development-tim",{"_index":407,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[478,16]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[478,16]]}},"keywords":{}}],["dhaka",{"_index":810,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1301,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[1301,7]]}},"keywords":{}}],["didn't",{"_index":1378,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7724,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7724,6]]}},"keywords":{}}],["differ",{"_index":351,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4285,9]]},"template:docs/data-layer/factories":{"position":[[99,9],[520,9],[4301,9],[12038,9],[14619,9]]},"template:docs/data-layer/relationships":{"position":[[2532,9],[3471,9],[5078,9]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[428,9]]},"template:docs/data-layer/serializers/index":{"position":[[1923,9],[3720,9]]},"template:docs/getting-started/overview":{"position":[[2737,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7516,11],[9275,11]]},"template:docs/route-handlers/functions":{"position":[[6993,9]]},"template:docs/testing/acceptance-tests":{"position":[[1047,10],[2725,9],[2753,9]]},"template:templates/docs/advanced/server-configuration":{"position":[[4285,9]]},"template:templates/docs/data-layer/factories":{"position":[[99,9],[520,9],[4301,9],[12038,9],[14619,9]]},"template:templates/docs/data-layer/relationships":{"position":[[2532,9],[3471,9],[5078,9]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[428,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1923,9],[3720,9]]},"template:templates/docs/getting-started/overview":{"position":[[2737,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7516,11],[9275,11]]},"template:templates/docs/route-handlers/functions":{"position":[[6993,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1047,10],[2725,9],[2753,9]]}},"keywords":{}}],["differenti",{"_index":952,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2480,13]]},"template:templates/docs/data-layer/orm":{"position":[[2480,13]]}},"keywords":{}}],["difficult",{"_index":1300,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[1796,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1796,10]]}},"keywords":{}}],["directli",{"_index":312,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2504,8],[2819,8],[4848,9]]},"template:docs/data-layer/database":{"position":[[416,9],[644,9],[1359,8]]},"template:docs/data-layer/fixtures":{"position":[[1452,8]]},"template:docs/data-layer/models":{"position":[[515,8],[556,8],[1241,8]]},"template:docs/data-layer/orm":{"position":[[1062,8]]},"template:docs/data-layer/serializers/index":{"position":[[5528,8]]},"template:docs/getting-started/overview":{"position":[[5397,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2459,8],[2534,8],[3056,8],[3191,8],[18162,8]]},"template:docs/testing/acceptance-tests":{"position":[[2237,8],[5175,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[307,8],[3422,8],[3496,8],[3610,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2504,8],[2819,8],[4848,9]]},"template:templates/docs/data-layer/database":{"position":[[416,9],[644,9],[1359,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[1452,8]]},"template:templates/docs/data-layer/models":{"position":[[515,8],[556,8],[1241,8]]},"template:templates/docs/data-layer/orm":{"position":[[1062,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5528,8]]},"template:templates/docs/getting-started/overview":{"position":[[5397,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2459,8],[2534,8],[3056,8],[3191,8],[18162,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2237,8],[5175,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[307,8],[3422,8],[3496,8],[3610,8]]}},"keywords":{}}],["director",{"_index":611,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6122,9],[6318,9]]},"template:docs/data-layer/orm":{"position":[[1995,9],[2325,10],[4971,9],[5082,9],[5120,8],[5754,9],[7350,9],[7486,8],[7864,8],[7986,9]]},"template:templates/docs/data-layer/factories":{"position":[[6122,9],[6318,9]]},"template:templates/docs/data-layer/orm":{"position":[[1995,9],[2325,10],[4971,9],[5082,9],[5120,8],[5754,9],[7350,9],[7486,8],[7864,8],[7986,9]]}},"keywords":{}}],["directori",{"_index":171,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2067,9],[2093,9],[2155,9],[2329,10]]},"template:docs/advanced/server-configuration":{"position":[[1074,10],[1306,9],[1929,10]]},"template:docs/advanced/switching-between-scenarios":{"position":[[54,9]]},"template:docs/getting-started/installation":{"position":[[117,9]]},"template:docs/getting-started/overview":{"position":[[1801,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[436,10],[13560,9],[13602,9],[13718,9],[13913,9],[13987,9]]},"template:docs/testing/setup-mirage":{"position":[[1103,9]]},"template:templates/docs/advanced/environment-options":{"position":[[2067,9],[2093,9],[2155,9],[2329,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1074,10],[1306,9],[1929,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[54,9]]},"template:templates/docs/getting-started/installation":{"position":[[117,9]]},"template:templates/docs/getting-started/overview":{"position":[[1801,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[436,10],[13560,9],[13602,9],[13718,9],[13913,9],[13987,9]]},"template:templates/docs/testing/setup-mirage":{"position":[[1103,9]]}},"keywords":{}}],["directorid",{"_index":949,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2045,10],[2153,11],[2568,12],[6944,11],[6977,10],[7733,11],[8152,11],[8268,10]]},"template:templates/docs/data-layer/orm":{"position":[[2045,10],[2153,11],[2568,12],[6944,11],[6977,10],[7733,11],[8152,11],[8268,10]]}},"keywords":{}}],["disabl",{"_index":122,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[664,7],[911,8],[2659,7]]},"template:docs/getting-started/installation":{"position":[[1223,8]]},"template:docs/testing/assertions":{"position":[[2745,8]]},"template:templates/docs/advanced/environment-options":{"position":[[664,7],[911,8],[2659,7]]},"template:templates/docs/getting-started/installation":{"position":[[1223,8]]},"template:templates/docs/testing/assertions":{"position":[[2745,8]]}},"keywords":{}}],["discov",{"_index":342,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3942,9]]},"template:docs/data-layer/models":{"position":[[305,8]]},"template:docs/data-layer/relationships":{"position":[[382,10]]},"template:docs/data-layer/serializers/index":{"position":[[1847,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1432,8],[5555,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[3942,9]]},"template:templates/docs/data-layer/models":{"position":[[305,8]]},"template:templates/docs/data-layer/relationships":{"position":[[382,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1847,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1432,8],[5555,10]]}},"keywords":{}}],["discoveremberdatamodel",{"_index":136,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1144,29],[2356,23],[2927,24]]},"template:docs/advanced/server-configuration":{"position":[[1566,23],[3019,23],[3186,29],[3397,23],[3564,29],[4956,24],[5150,29]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[971,24],[1140,29],[1342,23],[1469,29]]},"template:docs/testing/setup-mirage":{"position":[[1348,23],[1519,29]]},"template:templates/docs/advanced/environment-options":{"position":[[1144,29],[2356,23],[2927,24]]},"template:templates/docs/advanced/server-configuration":{"position":[[1566,23],[3019,23],[3186,29],[3397,23],[3564,29],[4956,24],[5150,29]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[971,24],[1140,29],[1342,23],[1469,29]]},"template:templates/docs/testing/setup-mirage":{"position":[[1348,23],[1519,29]]}},"keywords":{"module:ember-cli-mirage/ember-data":{"position":[null]}}}],["discuss",{"_index":867,"title":{},"text":{"template:docs/data-layer/models":{"position":[[203,7]]},"template:docs/route-handlers/functions":{"position":[[7652,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[7376,7]]},"template:templates/docs/data-layer/models":{"position":[[203,7]]},"template:templates/docs/route-handlers/functions":{"position":[[7652,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[7376,7]]}},"keywords":{}}],["disk",{"_index":518,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[754,5]]},"template:templates/docs/data-layer/factories":{"position":[[754,5]]}},"keywords":{}}],["doc",{"_index":1079,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[6017,4]]},"template:docs/data-layer/serializers/index":{"position":[[3541,4],[5272,4],[7080,4]]},"template:docs/getting-started/overview":{"position":[[10837,4]]},"template:docs/route-handlers/shorthands":{"position":[[2781,4],[3472,4],[6023,5]]},"template:docs/testing/assertions":{"position":[[4007,4]]},"template:index":{"position":[[338,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6017,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3541,4],[5272,4],[7080,4]]},"template:templates/docs/getting-started/overview":{"position":[[10837,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2781,4],[3472,4],[6023,5]]},"template:templates/docs/testing/assertions":{"position":[[4007,4]]},"template:templates/index":{"position":[[338,4]]}},"keywords":{}}],["document",{"_index":53,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[737,8]]},"template:docs/getting-started/overview":{"position":[[167,13]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7561,10],[7578,9],[8922,9],[9129,9],[10722,10]]},"template:docs/route-handlers/functions":{"position":[[2662,11],[5244,8]]},"template:docs/testing/acceptance-tests":{"position":[[1294,13]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[737,8]]},"template:templates/docs/getting-started/overview":{"position":[[167,13]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7561,10],[7578,9],[8922,9],[9129,9],[10722,10]]},"template:templates/docs/route-handlers/functions":{"position":[[2662,11],[5244,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1294,13]]}},"keywords":{}}],["document.cooki",{"_index":392,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[738,16]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[738,16]]}},"keywords":{}}],["document.cookie=`remember_me=cookie-content-her",{"_index":386,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[513,49]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[513,49]]}},"keywords":{}}],["doesn't",{"_index":665,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9244,7]]},"template:docs/data-layer/fixtures":{"position":[[1689,7]]},"template:docs/data-layer/orm":{"position":[[6041,7]]},"template:docs/data-layer/relationships":{"position":[[3891,7],[4934,7]]},"template:docs/data-layer/serializers/index":{"position":[[6724,7]]},"template:docs/getting-started/overview":{"position":[[10183,7]]},"template:docs/testing/acceptance-tests":{"position":[[4883,7]]},"template:not-found":{"position":[[21,7]]},"template:templates/docs/data-layer/factories":{"position":[[9244,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[1689,7]]},"template:templates/docs/data-layer/orm":{"position":[[6041,7]]},"template:templates/docs/data-layer/relationships":{"position":[[3891,7],[4934,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6724,7]]},"template:templates/docs/getting-started/overview":{"position":[[10183,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4883,7]]},"template:templates/not-found":{"position":[[21,7]]}},"keywords":{}}],["domain",{"_index":958,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2817,7],[3693,6]]},"template:docs/route-handlers/functions":{"position":[[7033,6],[7182,6]]},"template:docs/route-handlers/shorthands":{"position":[[5952,6]]},"template:templates/docs/data-layer/orm":{"position":[[2817,7],[3693,6]]},"template:templates/docs/route-handlers/functions":{"position":[[7033,6],[7182,6]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5952,6]]}},"keywords":{}}],["domain=.dev-domain",{"_index":387,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[563,19]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[563,19]]}},"keywords":{}}],["don't",{"_index":728,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[15015,5],[16121,5]]},"template:docs/data-layer/fixtures":{"position":[[1647,5]]},"template:docs/data-layer/orm":{"position":[[3382,5],[3664,5]]},"template:docs/data-layer/relationships":{"position":[[285,5]]},"template:docs/data-layer/serializers/index":{"position":[[1385,5]]},"template:docs/getting-started/overview":{"position":[[7080,5],[10073,5],[10469,5]]},"template:docs/testing/acceptance-tests":{"position":[[4823,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2678,5],[3034,5],[3536,5]]},"template:templates/docs/data-layer/factories":{"position":[[15015,5],[16121,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[1647,5]]},"template:templates/docs/data-layer/orm":{"position":[[3382,5],[3664,5]]},"template:templates/docs/data-layer/relationships":{"position":[[285,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1385,5]]},"template:templates/docs/getting-started/overview":{"position":[[7080,5],[10073,5],[10469,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4823,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2678,5],[3034,5],[3536,5]]}},"keywords":{}}],["done",{"_index":1056,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[4977,4]]},"template:templates/docs/data-layer/relationships":{"position":[[4977,4]]}},"keywords":{}}],["donnelli",{"_index":596,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5701,10]]},"template:templates/docs/data-layer/factories":{"position":[[5701,10]]}},"keywords":{}}],["don’t",{"_index":868,"title":{},"text":{"template:docs/data-layer/models":{"position":[[358,5]]},"template:templates/docs/data-layer/models":{"position":[[358,5]]}},"keywords":{}}],["down",{"_index":751,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16185,4]]},"template:docs/getting-started/overview":{"position":[[1335,5],[9917,4]]},"template:docs/testing/assertions":{"position":[[3818,4]]},"template:templates/docs/data-layer/factories":{"position":[[16185,4]]},"template:templates/docs/getting-started/overview":{"position":[[1335,5],[9917,4]]},"template:templates/docs/testing/assertions":{"position":[[3818,4]]}},"keywords":{}}],["drama",{"_index":563,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3677,8],[4016,7],[4236,7]]},"template:docs/testing/assertions":{"position":[[3201,7]]},"template:templates/docs/data-layer/factories":{"position":[[3677,8],[4016,7],[4236,7]]},"template:templates/docs/testing/assertions":{"position":[[3201,7]]}},"keywords":{}}],["dramat",{"_index":698,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[11992,12]]},"template:docs/route-handlers/shorthands":{"position":[[178,12]]},"template:templates/docs/data-layer/factories":{"position":[[11992,12]]},"template:templates/docs/route-handlers/shorthands":{"position":[[178,12]]}},"keywords":{}}],["drop",{"_index":1271,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[9912,4]]},"template:docs/testing/assertions":{"position":[[3813,4]]},"template:templates/docs/getting-started/overview":{"position":[[9912,4]]},"template:templates/docs/testing/assertions":{"position":[[3813,4]]}},"keywords":{}}],["dump",{"_index":845,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3809,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[3809,4]]}},"keywords":{}}],["dunkirk",{"_index":466,"title":{},"text":{"template:docs/data-layer/database":{"position":[[873,9],[1192,9]]},"template:docs/data-layer/orm":{"position":[[563,9]]},"template:docs/getting-started/overview":{"position":[[658,9]]},"template:docs/route-handlers/functions":{"position":[[279,9],[998,9],[1401,9]]},"template:docs/testing/setup-mirage":{"position":[[1687,10]]},"template:templates/docs/data-layer/database":{"position":[[873,9],[1192,9]]},"template:templates/docs/data-layer/orm":{"position":[[563,9]]},"template:templates/docs/getting-started/overview":{"position":[[658,9]]},"template:templates/docs/route-handlers/functions":{"position":[[279,9],[998,9],[1401,9]]},"template:templates/docs/testing/setup-mirage":{"position":[[1687,10]]}},"keywords":{}}],["duplic",{"_index":967,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[3678,9]]},"template:docs/getting-started/overview":{"position":[[1133,10]]},"template:templates/docs/data-layer/orm":{"position":[[3678,9]]},"template:templates/docs/getting-started/overview":{"position":[[1133,10]]}},"keywords":{}}],["durat",{"_index":1663,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4561,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4561,8]]}},"keywords":{}}],["dure",{"_index":132,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[943,6],[1314,6]]},"template:docs/data-layer/factories":{"position":[[544,6]]},"template:docs/data-layer/fixtures":{"position":[[1831,6],[2394,6]]},"template:docs/getting-started/overview":{"position":[[5722,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5566,6]]},"template:docs/route-handlers/functions":{"position":[[1059,6],[1085,6]]},"template:docs/testing/acceptance-tests":{"position":[[4912,6]]},"template:docs/testing/assertions":{"position":[[2449,6],[2788,6]]},"template:templates/docs/advanced/environment-options":{"position":[[943,6],[1314,6]]},"template:templates/docs/data-layer/factories":{"position":[[544,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[1831,6],[2394,6]]},"template:templates/docs/getting-started/overview":{"position":[[5722,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5566,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1059,6],[1085,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4912,6]]},"template:templates/docs/testing/assertions":{"position":[[2449,6],[2788,6]]}},"keywords":{}}],["dynam",{"_index":451,"title":{},"text":{"template:docs/data-layer/database":{"position":[[326,7]]},"template:docs/data-layer/factories":{"position":[[2098,11],[2996,8],[4329,7]]},"template:docs/data-layer/relationships":{"position":[[153,7]]},"template:docs/getting-started/overview":{"position":[[784,7],[1556,7],[2092,7],[2229,8],[2356,8],[3426,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[167,7],[1338,7]]},"template:docs/route-handlers/functions":{"position":[[2218,7],[2736,7],[2840,7],[2910,7],[2973,7]]},"template:templates/docs/data-layer/database":{"position":[[326,7]]},"template:templates/docs/data-layer/factories":{"position":[[2098,11],[2996,8],[4329,7]]},"template:templates/docs/data-layer/relationships":{"position":[[153,7]]},"template:templates/docs/getting-started/overview":{"position":[[784,7],[1556,7],[2092,7],[2229,8],[2356,8],[3426,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[167,7],[1338,7]]},"template:templates/docs/route-handlers/functions":{"position":[[2218,7],[2736,7],[2840,7],[2910,7],[2973,7]]}},"keywords":{}}],["e.g",{"_index":117,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[484,5]]},"template:docs/getting-started/overview":{"position":[[1090,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5826,4],[14236,5]]},"template:docs/route-handlers/functions":{"position":[[5378,4]]},"template:templates/docs/advanced/environment-options":{"position":[[484,5]]},"template:templates/docs/getting-started/overview":{"position":[[1090,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5826,4],[14236,5]]},"template:templates/docs/route-handlers/functions":{"position":[[5378,4]]}},"keywords":{}}],["each",{"_index":275,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1122,4]]},"template:docs/advanced/switching-between-scenarios":{"position":[[313,4],[376,4]]},"template:docs/data-layer/database":{"position":[[1216,4]]},"template:docs/data-layer/factories":{"position":[[6862,4],[6894,4],[11801,5],[13829,4],[14818,4]]},"template:docs/data-layer/fixtures":{"position":[[4988,4],[5051,4]]},"template:docs/data-layer/relationships":{"position":[[131,4],[3005,4],[3290,4],[3504,4]]},"template:docs/data-layer/serializers/index":{"position":[[2417,4],[3550,4]]},"template:docs/getting-started/overview":{"position":[[2774,4],[3972,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17723,4]]},"template:docs/route-handlers/functions":{"position":[[379,4],[1751,4]]},"template:docs/testing/acceptance-tests":{"position":[[1555,4],[1612,4],[1853,4]]},"template:docs/testing/setup-mirage":{"position":[[253,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[1122,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[313,4],[376,4]]},"template:templates/docs/data-layer/database":{"position":[[1216,4]]},"template:templates/docs/data-layer/factories":{"position":[[6862,4],[6894,4],[11801,5],[13829,4],[14818,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[4988,4],[5051,4]]},"template:templates/docs/data-layer/relationships":{"position":[[131,4],[3005,4],[3290,4],[3504,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2417,4],[3550,4]]},"template:templates/docs/getting-started/overview":{"position":[[2774,4],[3972,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17723,4]]},"template:templates/docs/route-handlers/functions":{"position":[[379,4],[1751,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1555,4],[1612,4],[1853,4]]},"template:templates/docs/testing/setup-mirage":{"position":[[253,4]]}},"keywords":{}}],["earlier",{"_index":701,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[12204,8]]},"template:templates/docs/data-layer/factories":{"position":[[12204,8]]}},"keywords":{}}],["easi",{"_index":676,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9881,4]]},"template:docs/data-layer/relationships":{"position":[[6340,4]]},"template:docs/getting-started/overview":{"position":[[3107,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4781,4],[9203,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[149,4],[798,4],[1321,4],[1617,4]]},"template:docs/route-handlers/shorthands":{"position":[[650,5]]},"template:templates/docs/data-layer/factories":{"position":[[9881,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6340,4]]},"template:templates/docs/getting-started/overview":{"position":[[3107,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4781,4],[9203,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[149,4],[798,4],[1321,4],[1617,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[650,5]]}},"keywords":{}}],["easier",{"_index":512,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[503,6]]},"template:docs/data-layer/orm":{"position":[[6589,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17768,6]]},"template:index":{"position":[[193,7]]},"template:templates/docs/data-layer/factories":{"position":[[503,6]]},"template:templates/docs/data-layer/orm":{"position":[[6589,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17768,6]]},"template:templates/index":{"position":[[193,7]]}},"keywords":{}}],["easili",{"_index":1314,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2664,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2664,6]]}},"keywords":{}}],["ec-mirag",{"_index":1431,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[13272,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13272,10]]}},"keywords":{}}],["ecosystem",{"_index":1102,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[980,10],[1329,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5111,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[980,10],[1329,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5111,10]]}},"keywords":{}}],["edg",{"_index":187,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2733,4]]},"template:templates/docs/advanced/environment-options":{"position":[[2733,4]]}},"keywords":{}}],["edit",{"_index":605,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5986,7]]},"template:docs/data-layer/orm":{"position":[[6515,7],[6568,7],[7640,7]]},"template:docs/route-handlers/shorthands":{"position":[[724,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2161,4],[2629,4],[4515,4],[6663,4]]},"template:templates/docs/data-layer/factories":{"position":[[5986,7]]},"template:templates/docs/data-layer/orm":{"position":[[6515,7],[6568,7],[7640,7]]},"template:templates/docs/route-handlers/shorthands":{"position":[[724,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2161,4],[2629,4],[4515,4],[6663,4]]}},"keywords":{}}],["editor",{"_index":710,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13244,8]]},"template:templates/docs/data-layer/factories":{"position":[[13244,8]]}},"keywords":{}}],["effect",{"_index":186,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2643,7]]},"template:docs/data-layer/factories":{"position":[[11955,9],[12542,11],[17354,9]]},"template:docs/data-layer/serializers/index":{"position":[[7268,11]]},"template:docs/testing/acceptance-tests":{"position":[[4546,6]]},"template:templates/docs/advanced/environment-options":{"position":[[2643,7]]},"template:templates/docs/data-layer/factories":{"position":[[11955,9],[12542,11],[17354,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[7268,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4546,6]]}},"keywords":{}}],["elsewher",{"_index":651,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[8366,9]]},"template:templates/docs/data-layer/factories":{"position":[[8366,9]]}},"keywords":{}}],["emb",{"_index":1254,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[8499,5]]},"template:templates/docs/getting-started/overview":{"position":[[8499,5]]}},"keywords":{}}],["ember",{"_index":14,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[38,5],[322,5]]},"template:docs/advanced/environment-options":{"position":[[1506,5],[1599,5],[1784,5],[2463,5],[2521,5],[2601,5]]},"template:docs/advanced/mocking-guids":{"position":[[408,5]]},"template:docs/advanced/server-configuration":{"position":[[322,5],[1408,5],[1460,5],[1764,5],[2040,5],[2120,5],[3832,5],[3957,5],[4402,5],[4929,5]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[674,5]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1144,5]]},"template:docs/data-layer/database":{"position":[[351,5],[1516,5]]},"template:docs/data-layer/factories":{"position":[[411,5],[715,5],[2244,5],[15455,5]]},"template:docs/data-layer/fixtures":{"position":[[682,5],[3170,5],[3387,5],[4121,5],[4744,5]]},"template:docs/data-layer/models":{"position":[[244,5],[267,5],[534,5],[736,5],[809,5]]},"template:docs/data-layer/orm":{"position":[[698,5],[3560,5],[3618,5],[5281,5]]},"template:docs/data-layer/relationships":{"position":[[221,5]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[349,5],[561,5],[1351,5],[1895,5]]},"template:docs/data-layer/serializers/index":{"position":[[385,5],[852,5],[974,5],[1039,5],[1323,5],[1359,5],[1792,5],[2682,5],[3191,5],[3896,5],[4495,5],[4593,5],[7032,5],[7289,5]]},"template:docs/getting-started/installation":{"position":[[37,5],[68,5],[397,5],[488,5],[671,5],[758,5],[801,5],[1519,5]]},"template:docs/getting-started/overview":{"position":[[702,5],[1593,5],[1728,5],[1832,5],[1926,5],[3261,5],[4356,5],[7147,5],[7546,5],[7563,5],[10152,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1777,5],[2393,5],[2957,5],[3007,5],[9219,5],[9379,5],[9753,5],[11550,5],[14430,5],[16549,5],[17438,5]]},"template:docs/getting-started/what-is-mirage":{"position":[[358,5],[819,5],[1004,5],[1899,5],[1937,5],[1959,5]]},"template:docs/route-handlers/functions":{"position":[[310,5],[854,5],[2174,5],[2478,5],[4150,5],[6970,5],[7104,5]]},"template:docs/route-handlers/shorthands":{"position":[[2635,5],[3326,5]]},"template:docs/testing/acceptance-tests":{"position":[[42,5],[584,5],[1347,5],[1375,5],[4087,5]]},"template:docs/testing/assertions":{"position":[[56,5],[541,5],[674,5],[874,5],[1469,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1732,5],[1855,5],[3001,5],[3074,5],[3245,5],[3439,5],[3513,5],[3622,5],[3792,5],[4095,5],[4161,5],[5114,5],[6167,5],[6240,5]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[38,5],[322,5]]},"template:templates/docs/advanced/environment-options":{"position":[[1506,5],[1599,5],[1784,5],[2463,5],[2521,5],[2601,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[408,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[322,5],[1408,5],[1460,5],[1764,5],[2040,5],[2120,5],[3832,5],[3957,5],[4402,5],[4929,5]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[674,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1144,5]]},"template:templates/docs/data-layer/database":{"position":[[351,5],[1516,5]]},"template:templates/docs/data-layer/factories":{"position":[[411,5],[715,5],[2244,5],[15455,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[682,5],[3170,5],[3387,5],[4121,5],[4744,5]]},"template:templates/docs/data-layer/models":{"position":[[244,5],[267,5],[534,5],[736,5],[809,5]]},"template:templates/docs/data-layer/orm":{"position":[[698,5],[3560,5],[3618,5],[5281,5]]},"template:templates/docs/data-layer/relationships":{"position":[[221,5]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[349,5],[561,5],[1351,5],[1895,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[385,5],[852,5],[974,5],[1039,5],[1323,5],[1359,5],[1792,5],[2682,5],[3191,5],[3896,5],[4495,5],[4593,5],[7032,5],[7289,5]]},"template:templates/docs/getting-started/installation":{"position":[[37,5],[68,5],[397,5],[488,5],[671,5],[758,5],[801,5],[1519,5]]},"template:templates/docs/getting-started/overview":{"position":[[702,5],[1593,5],[1728,5],[1832,5],[1926,5],[3261,5],[4356,5],[7147,5],[7546,5],[7563,5],[10152,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1777,5],[2393,5],[2957,5],[3007,5],[9219,5],[9379,5],[9753,5],[11550,5],[14430,5],[16549,5],[17438,5]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[358,5],[819,5],[1004,5],[1899,5],[1937,5],[1959,5]]},"template:templates/docs/route-handlers/functions":{"position":[[310,5],[854,5],[2174,5],[2478,5],[4150,5],[6970,5],[7104,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2635,5],[3326,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[42,5],[584,5],[1347,5],[1375,5],[4087,5]]},"template:templates/docs/testing/assertions":{"position":[[56,5],[541,5],[674,5],[874,5],[1469,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1732,5],[1855,5],[3001,5],[3074,5],[3245,5],[3439,5],[3513,5],[3622,5],[3792,5],[4095,5],[4161,5],[5114,5],[6167,5],[6240,5]]}},"keywords":{}}],["ember'",{"_index":27,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[198,7]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[198,7]]}},"keywords":{}}],["ember-auto-import",{"_index":1315,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3021,17]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3021,17]]}},"keywords":{}}],["ember-cli-mirag",{"_index":78,"title":{"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[30,16]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[30,16]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1270,19],[1329,18]]},"template:docs/advanced/server-configuration":{"position":[[67,17],[1599,16],[2616,17],[2683,16],[2915,16],[3050,19],[3428,19],[5014,19]]},"template:docs/data-layer/relationships":{"position":[[614,19],[1915,19],[2711,19]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1193,19],[1624,19]]},"template:docs/getting-started/installation":{"position":[[51,16],[156,16]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[477,19],[1003,19],[1410,16],[11021,19],[11700,19],[11811,19],[12275,19],[12404,19],[16631,19]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[31,16]]},"template:docs/testing/setup-mirage":{"position":[[1379,19]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1270,19],[1329,18]]},"template:templates/docs/advanced/server-configuration":{"position":[[67,17],[1599,16],[2616,17],[2683,16],[2915,16],[3050,19],[3428,19],[5014,19]]},"template:templates/docs/data-layer/relationships":{"position":[[614,19],[1915,19],[2711,19]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1193,19],[1624,19]]},"template:templates/docs/getting-started/installation":{"position":[[51,16],[156,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[477,19],[1003,19],[1410,16],[11021,19],[11700,19],[11811,19],[12275,19],[12404,19],[16631,19]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[31,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[1379,19]]}},"keywords":{}}],["ember-cli-mirage/ember-data",{"_index":1158,"title":{"module:ember-cli-mirage/ember-data":{"position":[[0,27]]}},"text":{},"keywords":{}}],["ember-cli-mirage/serializers/ember-data-seri",{"_index":1159,"title":{"module:ember-cli-mirage/serializers/ember-data-serializer":{"position":[[0,50]]}},"text":{},"keywords":{}}],["ember-cli-mirage/test-support",{"_index":1217,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5038,32]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5239,32]]},"template:docs/testing/acceptance-tests":{"position":[[733,32]]},"template:docs/testing/integration-and-unit-tests":{"position":[[508,32],[1234,32],[4303,32],[6370,32]]},"template:docs/testing/setup-mirage":{"position":[[344,32],[729,32],[1306,32]]},"template:templates/docs/getting-started/overview":{"position":[[5038,32]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5239,32]]},"template:templates/docs/testing/acceptance-tests":{"position":[[733,32]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[508,32],[1234,32],[4303,32],[6370,32]]},"template:templates/docs/testing/setup-mirage":{"position":[[344,32],[729,32],[1306,32]]}},"keywords":{}}],["ember-cli-mirage/test-support/setup-mirag",{"_index":1352,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[5156,45]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5156,45]]}},"keywords":{}}],["ember-cli-mirage@x.x.x",{"_index":1286,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[125,22],[173,22]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[125,22],[173,22]]}},"keywords":{}}],["ember-cli-packg",{"_index":1317,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3164,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3164,16]]}},"keywords":{}}],["ember-inflector",{"_index":30,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[271,18],[1010,18]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[271,18],[1010,18]]}},"keywords":{}}],["ember-qunit",{"_index":1215,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[4995,14]]},"template:docs/testing/acceptance-tests":{"position":[[688,14]]},"template:docs/testing/integration-and-unit-tests":{"position":[[465,14],[1191,14],[4260,14],[6327,14]]},"template:docs/testing/setup-mirage":{"position":[[301,14],[686,14],[1263,14]]},"template:templates/docs/getting-started/overview":{"position":[[4995,14]]},"template:templates/docs/testing/acceptance-tests":{"position":[[688,14]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[465,14],[1191,14],[4260,14],[6327,14]]},"template:templates/docs/testing/setup-mirage":{"position":[[301,14],[686,14],[1263,14]]}},"keywords":{}}],["ember-uuid",{"_index":229,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[817,13]]},"template:templates/docs/advanced/mocking-guids":{"position":[[817,13]]}},"keywords":{}}],["ember/runloop",{"_index":1745,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5414,17]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5414,17]]}},"keywords":{}}],["ember/str",{"_index":1123,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[3424,16]]},"template:templates/docs/data-layer/serializers/index":{"position":[[3424,16]]}},"keywords":{}}],["ember/test-help",{"_index":1736,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4366,22],[5371,22],[6433,22]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4366,22],[5371,22],[6433,22]]}},"keywords":{}}],["emberdataseri",{"_index":357,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4619,19],[4828,19]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[4,19],[803,19],[1166,19],[1568,19],[1597,19]]},"template:docs/data-layer/serializers/index":{"position":[[1654,19]]},"template:templates/docs/advanced/server-configuration":{"position":[[4619,19],[4828,19]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[4,19],[803,19],[1166,19],[1568,19],[1597,19]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1654,19]]}},"keywords":{"module:ember-cli-mirage/serializers/ember-data-serializer":{"position":[null]}}}],["emberdataserializer.extend",{"_index":1086,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1228,28],[1659,28]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1228,28],[1659,28]]}},"keywords":{}}],["embroid",{"_index":1162,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[340,9],[356,9]]},"template:templates/docs/getting-started/installation":{"position":[[340,9],[356,9]]}},"keywords":{}}],["embroider_rebuild_addon",{"_index":1165,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[559,24]]},"template:templates/docs/getting-started/installation":{"position":[[559,24]]}},"keywords":{}}],["embroider_rebuild_addons=ember-cli-mirag",{"_index":1166,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[716,41]]},"template:templates/docs/getting-started/installation":{"position":[[716,41]]}},"keywords":{}}],["empti",{"_index":527,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1342,5],[2424,6],[15600,5]]},"template:docs/getting-started/overview":{"position":[[2998,6]]},"template:templates/docs/data-layer/factories":{"position":[[1342,5],[2424,6],[15600,5]]},"template:templates/docs/getting-started/overview":{"position":[[2998,6]]}},"keywords":{}}],["enabl",{"_index":103,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[209,8],[228,7],[395,7],[463,6],[642,8],[782,8],[885,8]]},"template:docs/advanced/server-configuration":{"position":[[1485,7]]},"template:docs/data-layer/serializers/index":{"position":[[4074,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[591,7]]},"template:docs/testing/assertions":{"position":[[2485,6],[2531,8]]},"template:templates/docs/advanced/environment-options":{"position":[[209,8],[228,7],[395,7],[463,6],[642,8],[782,8],[885,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[1485,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4074,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[591,7]]},"template:templates/docs/testing/assertions":{"position":[[2485,6],[2531,8]]}},"keywords":{}}],["encount",{"_index":923,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[604,9]]},"template:templates/docs/data-layer/orm":{"position":[[604,9]]}},"keywords":{}}],["end",{"_index":673,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9675,3]]},"template:docs/data-layer/orm":{"position":[[1529,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[929,3]]},"template:docs/getting-started/what-is-mirage":{"position":[[554,5]]},"template:docs/testing/assertions":{"position":[[3026,3]]},"template:templates/docs/data-layer/factories":{"position":[[9675,3]]},"template:templates/docs/data-layer/orm":{"position":[[1529,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[929,3]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[554,5]]},"template:templates/docs/testing/assertions":{"position":[[3026,3]]}},"keywords":{}}],["endpoint",{"_index":1234,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5834,9],[8472,9]]},"template:docs/route-handlers/functions":{"position":[[7493,9]]},"template:templates/docs/getting-started/overview":{"position":[[5834,9],[8472,9]]},"template:templates/docs/route-handlers/functions":{"position":[[7493,9]]}},"keywords":{}}],["enforc",{"_index":643,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7853,7]]},"template:templates/docs/data-layer/factories":{"position":[[7853,7]]}},"keywords":{}}],["engin",{"_index":193,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[2854,7]]},"template:templates/docs/advanced/environment-options":{"position":[[2854,7]]}},"keywords":{}}],["enough",{"_index":955,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[2627,6],[7532,6],[8599,6]]},"template:docs/getting-started/overview":{"position":[[10794,6]]},"template:docs/route-handlers/functions":{"position":[[7553,7]]},"template:templates/docs/data-layer/orm":{"position":[[2627,6],[7532,6],[8599,6]]},"template:templates/docs/getting-started/overview":{"position":[[10794,6]]},"template:templates/docs/route-handlers/functions":{"position":[[7553,7]]}},"keywords":{}}],["ensur",{"_index":356,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4571,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[294,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[4571,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[294,6]]}},"keywords":{}}],["enter",{"_index":630,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7282,5]]},"template:templates/docs/data-layer/factories":{"position":[[7282,5]]}},"keywords":{}}],["entir",{"_index":723,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[14732,6]]},"template:docs/getting-started/overview":{"position":[[10097,6]]},"template:docs/route-handlers/functions":{"position":[[7097,6]]},"template:index":{"position":[[262,8]]},"template:templates/docs/data-layer/factories":{"position":[[14732,6]]},"template:templates/docs/getting-started/overview":{"position":[[10097,6]]},"template:templates/docs/route-handlers/functions":{"position":[[7097,6]]},"template:templates/index":{"position":[[262,8]]}},"keywords":{}}],["env",{"_index":115,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[435,3]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1224,3],[1356,3],[1427,4],[1537,3]]},"template:templates/docs/advanced/environment-options":{"position":[[435,3]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1224,3],[1356,3],[1427,4],[1537,3]]}},"keywords":{}}],["env.mirage_scenario",{"_index":435,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1771,19]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1771,19]]}},"keywords":{}}],["env['ember-cli-mirag",{"_index":98,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[47,23],[181,23],[614,23],[754,23],[2301,23],[2899,23]]},"template:docs/testing/assertions":{"position":[[2674,23]]},"template:templates/docs/advanced/environment-options":{"position":[[47,23],[181,23],[614,23],[754,23],[2301,23],[2899,23]]},"template:templates/docs/testing/assertions":{"position":[[2674,23]]}},"keywords":{}}],["environ",{"_index":94,"title":{"template:docs/advanced/environment-options":{"position":[[0,11]]},"template:templates/docs/advanced/environment-options":{"position":[[0,11]]}},"text":{"template:docs/advanced/environment-options":{"position":[[1,11],[148,12],[581,12],[720,12],[1542,13],[1669,11],[1711,11],[2806,11]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1028,12]]},"template:docs/data-layer/factories":{"position":[[14714,12]]},"template:docs/getting-started/installation":{"position":[[584,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1321,11]]},"template:docs/testing/acceptance-tests":{"position":[[1399,12]]},"template:docs/testing/assertions":{"position":[[2558,11],[2647,12]]},"template:templates/docs/advanced/environment-options":{"position":[[1,11],[148,12],[581,12],[720,12],[1542,13],[1669,11],[1711,11],[2806,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1028,12]]},"template:templates/docs/data-layer/factories":{"position":[[14714,12]]},"template:templates/docs/getting-started/installation":{"position":[[584,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1321,11]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1399,12]]},"template:templates/docs/testing/assertions":{"position":[[2558,11],[2647,12]]}},"keywords":{}}],["environment/config.j",{"_index":425,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1245,22]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1245,22]]}},"keywords":{}}],["episode9",{"_index":996,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7888,8]]},"template:templates/docs/data-layer/orm":{"position":[[7888,8]]}},"keywords":{}}],["episode9.upd",{"_index":998,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7968,17]]},"template:templates/docs/data-layer/orm":{"position":[[7968,17]]}},"keywords":{}}],["equip",{"_index":1503,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[255,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[255,8]]}},"keywords":{}}],["equival",{"_index":711,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13275,10]]},"template:docs/route-handlers/shorthands":{"position":[[1036,10],[1431,10],[1718,10],[2051,10],[2398,10],[3046,10],[3700,10],[3939,10]]},"template:templates/docs/data-layer/factories":{"position":[[13275,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1036,10],[1431,10],[1718,10],[2051,10],[2398,10],[3046,10],[3700,10],[3939,10]]}},"keywords":{}}],["error",{"_index":1272,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10138,5]]},"template:docs/route-handlers/functions":{"position":[[6757,7]]},"template:docs/testing/acceptance-tests":{"position":[[4063,6],[4118,6],[4189,5],[4288,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1399,5],[1479,7],[1593,5],[1613,7]]},"template:templates/docs/getting-started/overview":{"position":[[10138,5]]},"template:templates/docs/route-handlers/functions":{"position":[[6757,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4063,6],[4118,6],[4189,5],[4288,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1399,5],[1479,7],[1593,5],[1613,7]]}},"keywords":{}}],["error(`id",{"_index":241,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[1175,9]]},"template:templates/docs/advanced/mocking-guids":{"position":[[1175,9]]}},"keywords":{}}],["es6",{"_index":1312,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2553,3]]},"template:docs/route-handlers/functions":{"position":[[5359,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2553,3]]},"template:templates/docs/route-handlers/functions":{"position":[[5359,3]]}},"keywords":{}}],["eslint-plugin-pretti",{"_index":1172,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[977,22]]},"template:templates/docs/getting-started/installation":{"position":[[977,22]]}},"keywords":{}}],["eslintignor",{"_index":1174,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1034,14]]},"template:templates/docs/getting-started/installation":{"position":[[1034,14]]}},"keywords":{}}],["especi",{"_index":986,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[7132,10]]},"template:templates/docs/data-layer/orm":{"position":[[7132,10]]}},"keywords":{}}],["etc",{"_index":1201,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[3590,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14588,4],[16069,4]]},"template:templates/docs/getting-started/overview":{"position":[[3590,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14588,4],[16069,4]]}},"keywords":{}}],["even",{"_index":841,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3581,4]]},"template:docs/data-layer/orm":{"position":[[2420,4],[4835,4],[8308,4],[8577,4]]},"template:docs/data-layer/serializers/index":{"position":[[6703,4]]},"template:docs/getting-started/overview":{"position":[[10020,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[4727,4],[8653,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[328,4]]},"template:docs/testing/acceptance-tests":{"position":[[5671,4]]},"template:docs/testing/assertions":{"position":[[242,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2947,4]]},"template:docs/testing/setup-mirage":{"position":[[1183,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[3581,4]]},"template:templates/docs/data-layer/orm":{"position":[[2420,4],[4835,4],[8308,4],[8577,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6703,4]]},"template:templates/docs/getting-started/overview":{"position":[[10020,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4727,4],[8653,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[328,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5671,4]]},"template:templates/docs/testing/assertions":{"position":[[242,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2947,4]]},"template:templates/docs/testing/setup-mirage":{"position":[[1183,4]]}},"keywords":{}}],["event",{"_index":298,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1986,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[1986,5]]}},"keywords":{}}],["eventu",{"_index":326,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2845,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17655,11]]},"template:templates/docs/advanced/server-configuration":{"position":[[2845,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17655,11]]}},"keywords":{}}],["everyon",{"_index":1383,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[8309,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8309,8]]}},"keywords":{}}],["everyth",{"_index":279,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1272,10]]},"template:docs/data-layer/factories":{"position":[[10581,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[15636,10],[18723,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1272,10]]},"template:templates/docs/data-layer/factories":{"position":[[10581,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15636,10],[18723,10]]}},"keywords":{}}],["exactli",{"_index":264,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[619,7],[1261,7]]},"template:docs/data-layer/factories":{"position":[[2165,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2035,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[619,7],[1261,7]]},"template:templates/docs/data-layer/factories":{"position":[[2165,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2035,7]]}},"keywords":{}}],["exampl",{"_index":24,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[148,8],[413,8],[560,8]]},"template:docs/advanced/environment-options":{"position":[[451,8],[2213,8],[2823,8]]},"template:docs/advanced/mocking-guids":{"position":[[722,7]]},"template:docs/advanced/server-configuration":{"position":[[702,8],[2766,8],[2983,7],[3344,7],[4861,7]]},"template:docs/advanced/switching-between-scenarios":{"position":[[787,8],[1045,8]]},"template:docs/data-layer/database":{"position":[[658,8]]},"template:docs/data-layer/factories":{"position":[[121,8],[5956,7],[8300,7],[9988,8],[13788,8]]},"template:docs/data-layer/models":{"position":[[1989,8],[2505,8]]},"template:docs/data-layer/orm":{"position":[[2968,8],[6365,7]]},"template:docs/data-layer/relationships":{"position":[[2630,8],[3021,8],[3653,8],[4526,8]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1522,7]]},"template:docs/data-layer/serializers/index":{"position":[[892,7],[3174,8],[3770,8]]},"template:docs/getting-started/overview":{"position":[[312,7],[7662,8],[9346,8],[10389,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9519,8],[12832,8]]},"template:docs/route-handlers/functions":{"position":[[184,8],[2194,8],[2400,7],[4133,8],[4996,7],[5714,8],[5804,8]]},"template:docs/route-handlers/shorthands":{"position":[[231,8],[742,8],[1907,8]]},"template:docs/testing/acceptance-tests":{"position":[[95,8],[2076,7],[3921,7]]},"template:docs/testing/assertions":{"position":[[971,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1928,8]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[148,8],[413,8],[560,8]]},"template:templates/docs/advanced/environment-options":{"position":[[451,8],[2213,8],[2823,8]]},"template:templates/docs/advanced/mocking-guids":{"position":[[722,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[702,8],[2766,8],[2983,7],[3344,7],[4861,7]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[787,8],[1045,8]]},"template:templates/docs/data-layer/database":{"position":[[658,8]]},"template:templates/docs/data-layer/factories":{"position":[[121,8],[5956,7],[8300,7],[9988,8],[13788,8]]},"template:templates/docs/data-layer/models":{"position":[[1989,8],[2505,8]]},"template:templates/docs/data-layer/orm":{"position":[[2968,8],[6365,7]]},"template:templates/docs/data-layer/relationships":{"position":[[2630,8],[3021,8],[3653,8],[4526,8]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1522,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[892,7],[3174,8],[3770,8]]},"template:templates/docs/getting-started/overview":{"position":[[312,7],[7662,8],[9346,8],[10389,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9519,8],[12832,8]]},"template:templates/docs/route-handlers/functions":{"position":[[184,8],[2194,8],[2400,7],[4133,8],[4996,7],[5714,8],[5804,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[231,8],[742,8],[1907,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[95,8],[2076,7],[3921,7]]},"template:templates/docs/testing/assertions":{"position":[[971,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1928,8]]}},"keywords":{}}],["except",{"_index":724,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[14764,6]]},"template:docs/getting-started/overview":{"position":[[5878,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[18256,9]]},"template:docs/route-handlers/shorthands":{"position":[[4822,6],[4865,7],[5503,6]]},"template:templates/docs/data-layer/factories":{"position":[[14764,6]]},"template:templates/docs/getting-started/overview":{"position":[[5878,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18256,9]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4822,6],[4865,7],[5503,6]]}},"keywords":{}}],["exclud",{"_index":162,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1751,7]]},"template:templates/docs/advanced/environment-options":{"position":[[1751,7]]}},"keywords":{}}],["excludefilesfrombuild",{"_index":149,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1417,21],[1813,21]]},"template:templates/docs/advanced/environment-options":{"position":[[1417,21],[1813,21]]}},"keywords":{}}],["exist",{"_index":272,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1042,5]]},"template:docs/data-layer/models":{"position":[[464,5],[585,5]]},"template:docs/data-layer/relationships":{"position":[[5011,5]]},"template:docs/data-layer/serializers/index":{"position":[[1089,5]]},"template:docs/getting-started/overview":{"position":[[7810,6],[10049,8],[10408,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[43,8],[13075,8],[17120,7]]},"template:docs/testing/acceptance-tests":{"position":[[304,5],[2166,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3099,5]]},"template:not-found":{"position":[[29,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[1042,5]]},"template:templates/docs/data-layer/models":{"position":[[464,5],[585,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5011,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1089,5]]},"template:templates/docs/getting-started/overview":{"position":[[7810,6],[10049,8],[10408,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[43,8],[13075,8],[17120,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[304,5],[2166,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3099,5]]},"template:templates/not-found":{"position":[[29,6]]}},"keywords":{}}],["expect",{"_index":660,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[8865,7]]},"template:docs/data-layer/fixtures":{"position":[[4246,9]]},"template:docs/data-layer/orm":{"position":[[708,7],[2176,8],[4544,7]]},"template:docs/data-layer/serializers/index":{"position":[[1027,8],[3201,7],[3907,6],[4603,7]]},"template:docs/getting-started/installation":{"position":[[1098,6],[1570,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[6638,6]]},"template:docs/testing/assertions":{"position":[[211,6],[953,7],[1508,7],[2214,9]]},"template:templates/docs/data-layer/factories":{"position":[[8865,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[4246,9]]},"template:templates/docs/data-layer/orm":{"position":[[708,7],[2176,8],[4544,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1027,8],[3201,7],[3907,6],[4603,7]]},"template:templates/docs/getting-started/installation":{"position":[[1098,6],[1570,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6638,6]]},"template:templates/docs/testing/assertions":{"position":[[211,6],[953,7],[1508,7],[2214,9]]}},"keywords":{}}],["experi",{"_index":1105,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[1291,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1291,10]]}},"keywords":{}}],["expires=${cookieexpiration.toutcstr",{"_index":389,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[591,44]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[591,44]]}},"keywords":{}}],["explicilti",{"_index":161,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1740,10]]},"template:templates/docs/advanced/environment-options":{"position":[[1740,10]]}},"keywords":{}}],["explicit",{"_index":713,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[13671,8]]},"template:docs/data-layer/relationships":{"position":[[3548,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13107,9]]},"template:templates/docs/data-layer/factories":{"position":[[13671,8]]},"template:templates/docs/data-layer/relationships":{"position":[[3548,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13107,9]]}},"keywords":{}}],["explicitli",{"_index":276,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[1134,10]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[107,10]]},"template:docs/getting-started/installation":{"position":[[545,10]]},"template:templates/docs/advanced/server-configuration":{"position":[[1134,10]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[107,10]]},"template:templates/docs/getting-started/installation":{"position":[[545,10]]}},"keywords":{}}],["export",{"_index":67,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1029,6],[1213,6]]},"template:docs/advanced/environment-options":{"position":[[1048,6]]},"template:docs/advanced/mocking-guids":{"position":[[831,6]]},"template:docs/advanced/server-configuration":{"position":[[254,6],[765,6],[849,6],[916,6],[3111,6],[3489,6],[5075,6]]},"template:docs/advanced/switching-between-scenarios":{"position":[[1805,6],[2020,6],[2047,6]]},"template:docs/data-layer/database":{"position":[[748,6]]},"template:docs/data-layer/factories":{"position":[[883,6],[1092,6],[1583,6],[2363,6],[2527,6],[2853,6],[3508,6],[5452,6],[7612,6],[7671,6],[7904,6],[9334,6],[10128,6],[10737,6],[11582,6],[12385,6],[12651,6],[12913,6],[13159,6],[13592,6],[13905,6],[13983,9],[14176,6],[14498,6]]},"template:docs/data-layer/fixtures":{"position":[[390,6],[868,6],[1948,6],[2216,6],[2883,6],[2942,6],[3972,6],[4055,6],[4333,6],[4411,6],[4577,6],[4678,6]]},"template:docs/data-layer/models":{"position":[[946,6],[1310,6],[1681,6]]},"template:docs/data-layer/orm":{"position":[[3291,6],[4442,6],[5052,6],[5224,6]]},"template:docs/data-layer/relationships":{"position":[[634,6],[1935,6],[2731,6],[3083,6],[3151,6],[3710,6],[3781,6],[4100,6],[4171,6],[4672,6],[4779,6],[4858,6],[5528,6],[5622,6],[5679,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1213,6],[1644,6]]},"template:docs/data-layer/serializers/index":{"position":[[2193,9],[2330,6],[2787,6],[3441,6],[4134,6],[4778,6]]},"template:docs/getting-started/overview":{"position":[[2048,6],[3505,6],[4274,6],[6129,6],[6263,6],[8242,6],[8589,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[577,8],[786,8],[1064,6],[1271,6],[5062,6],[11041,6],[11720,6],[11831,6],[12295,6],[12424,6],[15722,6],[15875,6],[16651,6]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[73,9]]},"template:docs/route-handlers/functions":{"position":[[1263,6],[6516,6]]},"template:docs/testing/acceptance-tests":{"position":[[2537,6],[5281,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5432,6]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1029,6],[1213,6]]},"template:templates/docs/advanced/environment-options":{"position":[[1048,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[831,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[254,6],[765,6],[849,6],[916,6],[3111,6],[3489,6],[5075,6]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1805,6],[2020,6],[2047,6]]},"template:templates/docs/data-layer/database":{"position":[[748,6]]},"template:templates/docs/data-layer/factories":{"position":[[883,6],[1092,6],[1583,6],[2363,6],[2527,6],[2853,6],[3508,6],[5452,6],[7612,6],[7671,6],[7904,6],[9334,6],[10128,6],[10737,6],[11582,6],[12385,6],[12651,6],[12913,6],[13159,6],[13592,6],[13905,6],[13983,9],[14176,6],[14498,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[390,6],[868,6],[1948,6],[2216,6],[2883,6],[2942,6],[3972,6],[4055,6],[4333,6],[4411,6],[4577,6],[4678,6]]},"template:templates/docs/data-layer/models":{"position":[[946,6],[1310,6],[1681,6]]},"template:templates/docs/data-layer/orm":{"position":[[3291,6],[4442,6],[5052,6],[5224,6]]},"template:templates/docs/data-layer/relationships":{"position":[[634,6],[1935,6],[2731,6],[3083,6],[3151,6],[3710,6],[3781,6],[4100,6],[4171,6],[4672,6],[4779,6],[4858,6],[5528,6],[5622,6],[5679,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1213,6],[1644,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2193,9],[2330,6],[2787,6],[3441,6],[4134,6],[4778,6]]},"template:templates/docs/getting-started/overview":{"position":[[2048,6],[3505,6],[4274,6],[6129,6],[6263,6],[8242,6],[8589,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[577,8],[786,8],[1064,6],[1271,6],[5062,6],[11041,6],[11720,6],[11831,6],[12295,6],[12424,6],[15722,6],[15875,6],[16651,6]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[73,9]]},"template:templates/docs/route-handlers/functions":{"position":[[1263,6],[6516,6]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2537,6],[5281,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5432,6]]}},"keywords":{}}],["expos",{"_index":1169,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[820,7]]},"template:templates/docs/getting-started/installation":{"position":[[820,7]]}},"keywords":{}}],["extend",{"_index":355,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[4520,6],[4606,7],[4821,6]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[24,7],[1553,9]]},"template:docs/data-layer/serializers/index":{"position":[[2899,9]]},"template:docs/getting-started/overview":{"position":[[8087,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[4520,6],[4606,7],[4821,6]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[24,7],[1553,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2899,9]]},"template:templates/docs/getting-started/overview":{"position":[[8087,6]]}},"keywords":{}}],["extern",{"_index":337,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[3370,8]]},"template:docs/route-handlers/functions":{"position":[[6802,8],[7122,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[3370,8]]},"template:templates/docs/route-handlers/functions":{"position":[[6802,8],[7122,8]]}},"keywords":{}}],["externalag",{"_index":1090,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1782,15]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1782,15]]}},"keywords":{}}],["externalnam",{"_index":1088,"title":{},"text":{"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[1708,15]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[1708,15]]}},"keywords":{}}],["extra",{"_index":1648,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[3941,5]]},"template:docs/testing/assertions":{"position":[[1442,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[3941,5]]},"template:templates/docs/testing/assertions":{"position":[[1442,5]]}},"keywords":{}}],["extract",{"_index":1292,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[658,9]]},"template:docs/route-handlers/functions":{"position":[[4734,10],[4913,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[658,9]]},"template:templates/docs/route-handlers/functions":{"position":[[4734,10],[4913,10]]}},"keywords":{}}],["facilit",{"_index":412,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[727,10]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[727,10]]}},"keywords":{}}],["fact",{"_index":982,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[6075,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8935,5]]},"template:templates/docs/data-layer/orm":{"position":[[6075,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8935,5]]}},"keywords":{}}],["factori",{"_index":494,"title":{"template:docs/data-layer/factories":{"position":[[0,9]]},"template:templates/docs/data-layer/factories":{"position":[[0,9]]}},"text":{"template:docs/data-layer/factories":{"position":[[1,9],[422,9],[614,9],[635,7],[1270,7],[2178,9],[2216,7],[2336,7],[2413,7],[2500,7],[2645,8],[2826,7],[2972,7],[3131,7],[3393,8],[3440,7],[4267,9],[4370,9],[4514,7],[4654,8],[4686,7],[5013,7],[5384,7],[5641,7],[6212,10],[6613,9],[8201,9],[9858,9],[9975,8],[10048,8],[10094,8],[10322,8],[10703,8],[11548,8],[11944,10],[12358,7],[12611,8],[12763,7],[12866,8],[13066,8],[13112,8],[13403,9],[13440,9],[15733,7],[15803,7]]},"template:docs/data-layer/fixtures":{"position":[[118,9],[2358,10],[5252,9]]},"template:docs/data-layer/models":{"position":[[1629,9],[1853,9]]},"template:docs/data-layer/relationships":{"position":[[6259,10]]},"template:docs/getting-started/overview":{"position":[[3061,10],[3072,9],[3231,7],[3332,8],[3478,7],[3725,7],[4077,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2120,7],[3223,8],[3268,7],[12909,9],[14827,7],[15095,7],[15697,9],[16267,7],[16812,9],[16872,9],[16948,7],[17132,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1518,9],[1910,7],[1923,9]]},"template:docs/testing/acceptance-tests":{"position":[[1640,9],[1968,9],[2456,7],[2510,7],[2784,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2484,9],[3876,7]]},"template:index":{"position":[[103,9]]},"template:templates/docs/data-layer/factories":{"position":[[1,9],[422,9],[614,9],[635,7],[1270,7],[2178,9],[2216,7],[2336,7],[2413,7],[2500,7],[2645,8],[2826,7],[2972,7],[3131,7],[3393,8],[3440,7],[4267,9],[4370,9],[4514,7],[4654,8],[4686,7],[5013,7],[5384,7],[5641,7],[6212,10],[6613,9],[8201,9],[9858,9],[9975,8],[10048,8],[10094,8],[10322,8],[10703,8],[11548,8],[11944,10],[12358,7],[12611,8],[12763,7],[12866,8],[13066,8],[13112,8],[13403,9],[13440,9],[15733,7],[15803,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[118,9],[2358,10],[5252,9]]},"template:templates/docs/data-layer/models":{"position":[[1629,9],[1853,9]]},"template:templates/docs/data-layer/relationships":{"position":[[6259,10]]},"template:templates/docs/getting-started/overview":{"position":[[3061,10],[3072,9],[3231,7],[3332,8],[3478,7],[3725,7],[4077,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2120,7],[3223,8],[3268,7],[12909,9],[14827,7],[15095,7],[15697,9],[16267,7],[16812,9],[16872,9],[16948,7],[17132,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1518,9],[1910,7],[1923,9]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1640,9],[1968,9],[2456,7],[2510,7],[2784,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2484,9],[3876,7]]},"template:templates/index":{"position":[[103,9]]}},"keywords":{}}],["factory'",{"_index":631,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7368,9]]},"template:templates/docs/data-layer/factories":{"position":[[7368,9]]}},"keywords":{}}],["factory.extend",{"_index":548,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2378,16],[2542,16],[2868,16],[3523,16],[5467,16],[7919,16],[9349,16],[10143,16],[10752,16],[11597,16],[12400,16],[12666,16],[12928,16],[13174,16]]},"template:docs/getting-started/overview":{"position":[[3520,16]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[15737,16],[15890,16]]},"template:docs/testing/acceptance-tests":{"position":[[2552,16]]},"template:templates/docs/data-layer/factories":{"position":[[2378,16],[2542,16],[2868,16],[3523,16],[5467,16],[7919,16],[9349,16],[10143,16],[10752,16],[11597,16],[12400,16],[12666,16],[12928,16],[13174,16]]},"template:templates/docs/getting-started/overview":{"position":[[3520,16]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15737,16],[15890,16]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2552,16]]}},"keywords":{}}],["factory/fixtur",{"_index":1489,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[17561,15]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17561,15]]}},"keywords":{}}],["factory/fixture/serializer/model",{"_index":271,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[996,32]]},"template:templates/docs/advanced/server-configuration":{"position":[[996,32]]}},"keywords":{}}],["fail",{"_index":1653,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4215,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4215,7]]}},"keywords":{}}],["faith",{"_index":1412,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[11367,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[11367,8]]}},"keywords":{}}],["fake",{"_index":872,"title":{},"text":{"template:docs/data-layer/models":{"position":[[652,4]]},"template:docs/getting-started/overview":{"position":[[3040,4],[5827,6],[8465,6],[10087,4],[10700,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14937,6]]},"template:templates/docs/data-layer/models":{"position":[[652,4]]},"template:templates/docs/getting-started/overview":{"position":[[3040,4],[5827,6],[8465,6],[10087,4],[10700,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14937,6]]}},"keywords":{}}],["faker",{"_index":559,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3476,5],[5420,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2225,5],[2320,5],[2705,5],[3087,5],[3121,5],[3149,5],[3205,6],[3232,5],[3304,5],[3315,8],[3454,6],[3869,6],[4669,6]]},"template:templates/docs/data-layer/factories":{"position":[[3476,5],[5420,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2225,5],[2320,5],[2705,5],[3087,5],[3121,5],[3149,5],[3205,6],[3232,5],[3304,5],[3315,8],[3454,6],[3869,6],[4669,6]]}},"keywords":{}}],["faker-js/fak",{"_index":560,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3489,18],[5433,18]]},"template:templates/docs/data-layer/factories":{"position":[[3489,18],[5433,18]]}},"keywords":{}}],["faker.date.past().tolocaledatestr",{"_index":561,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3598,39]]},"template:templates/docs/data-layer/factories":{"position":[[3598,39]]}},"keywords":{}}],["faker.j",{"_index":569,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3763,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1707,8],[2063,9],[2848,8],[3047,8]]},"template:templates/docs/data-layer/factories":{"position":[[3763,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1707,8],[2063,9],[2848,8],[3047,8]]}},"keywords":{}}],["faker.list.cycl",{"_index":1329,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3687,16],[4163,17],[4242,18]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3687,16],[4163,17],[4242,18]]}},"keywords":{}}],["faker.list.random",{"_index":1328,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3668,18],[3925,18],[3998,19]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3668,18],[3925,18],[3998,19]]}},"keywords":{}}],["faker.name.findnam",{"_index":591,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[5500,22]]},"template:templates/docs/data-layer/factories":{"position":[[5500,22]]}},"keywords":{}}],["faker.name.firstnam",{"_index":1473,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15776,23],[15824,23],[15928,23],[15975,23]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15776,23],[15824,23],[15928,23],[15975,23]]}},"keywords":{}}],["faker.random.arrayel",{"_index":1333,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3948,26],[4078,27]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3948,26],[4078,27]]}},"keywords":{}}],["faker.random.numb",{"_index":1341,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4463,19],[4570,21]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4463,19],[4570,21]]}},"keywords":{}}],["faker.random.number.rang",{"_index":1330,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3708,25],[4432,26]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3708,25],[4432,26]]}},"keywords":{}}],["faker.random.number.range(18",{"_index":1342,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[4526,29]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[4526,29]]}},"keywords":{}}],["fall",{"_index":1151,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[6007,4]]},"template:templates/docs/data-layer/serializers/index":{"position":[[6007,4]]}},"keywords":{}}],["fals",{"_index":114,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[421,5],[791,5],[1041,6],[1451,6],[2681,6],[2952,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10841,5]]},"template:templates/docs/advanced/environment-options":{"position":[[421,5],[791,5],[1041,6],[1451,6],[2681,6],[2952,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10841,5]]}},"keywords":{}}],["far",{"_index":654,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[8607,4]]},"template:docs/getting-started/overview":{"position":[[7315,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10460,3]]},"template:templates/docs/data-layer/factories":{"position":[[8607,4]]},"template:templates/docs/getting-started/overview":{"position":[[7315,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10460,3]]}},"keywords":{}}],["fast",{"_index":947,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1906,5]]},"template:docs/route-handlers/functions":{"position":[[1119,6]]},"template:templates/docs/data-layer/orm":{"position":[[1906,5]]},"template:templates/docs/route-handlers/functions":{"position":[[1119,6]]}},"keywords":{}}],["fastboot",{"_index":1176,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1073,8],[1151,8],[1270,9],[1280,8],[1391,8],[1452,8]]},"template:templates/docs/getting-started/installation":{"position":[[1073,8],[1151,8],[1270,9],[1280,8],[1391,8],[1452,8]]}},"keywords":{}}],["fastboot_disabled=tru",{"_index":1183,"title":{},"text":{"template:docs/getting-started/installation":{"position":[[1496,22]]},"template:templates/docs/getting-started/installation":{"position":[[1496,22]]}},"keywords":{}}],["fat",{"_index":1144,"title":{},"text":{"template:docs/data-layer/serializers/index":{"position":[[5659,3]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5659,3]]}},"keywords":{}}],["featur",{"_index":128,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[874,7],[1246,7]]},"template:docs/advanced/server-configuration":{"position":[[1449,7]]},"template:docs/data-layer/database":{"position":[[334,8]]},"template:docs/data-layer/factories":{"position":[[156,7],[9847,7],[11925,8],[14645,7]]},"template:docs/getting-started/installation":{"position":[[1319,7]]},"template:docs/getting-started/overview":{"position":[[10456,8],[10657,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2326,8],[8064,7],[8205,7],[17165,7]]},"template:docs/testing/assertions":{"position":[[2520,7],[2734,7]]},"template:templates/docs/advanced/environment-options":{"position":[[874,7],[1246,7]]},"template:templates/docs/advanced/server-configuration":{"position":[[1449,7]]},"template:templates/docs/data-layer/database":{"position":[[334,8]]},"template:templates/docs/data-layer/factories":{"position":[[156,7],[9847,7],[11925,8],[14645,7]]},"template:templates/docs/getting-started/installation":{"position":[[1319,7]]},"template:templates/docs/getting-started/overview":{"position":[[10456,8],[10657,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2326,8],[8064,7],[8205,7],[17165,7]]},"template:templates/docs/testing/assertions":{"position":[[2520,7],[2734,7]]}},"keywords":{}}],["fetch",{"_index":221,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[527,6],[937,7]]},"template:docs/data-layer/orm":{"position":[[4892,8],[5473,5]]},"template:docs/data-layer/relationships":{"position":[[1615,5]]},"template:docs/data-layer/serializers/index":{"position":[[4545,5],[4628,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9420,5],[9820,5],[10500,8]]},"template:docs/route-handlers/shorthands":{"position":[[1249,8],[1540,8],[1871,8]]},"template:docs/testing/integration-and-unit-tests":{"position":[[666,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[527,6],[937,7]]},"template:templates/docs/data-layer/orm":{"position":[[4892,8],[5473,5]]},"template:templates/docs/data-layer/relationships":{"position":[[1615,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[4545,5],[4628,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9420,5],[9820,5],[10500,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1249,8],[1540,8],[1871,8]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[666,5]]}},"keywords":{}}],["few",{"_index":933,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1333,3]]},"template:docs/getting-started/overview":{"position":[[900,3],[8016,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1530,3],[1651,3],[2151,3]]},"template:docs/route-handlers/shorthands":{"position":[[6003,3]]},"template:templates/docs/data-layer/orm":{"position":[[1333,3]]},"template:templates/docs/getting-started/overview":{"position":[[900,3],[8016,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1530,3],[1651,3],[2151,3]]},"template:templates/docs/route-handlers/shorthands":{"position":[[6003,3]]}},"keywords":{}}],["fewer",{"_index":1593,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[7589,5]]},"template:templates/docs/route-handlers/functions":{"position":[[7589,5]]}},"keywords":{}}],["field",{"_index":473,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1238,6]]},"template:docs/data-layer/models":{"position":[[2713,6]]},"template:templates/docs/data-layer/database":{"position":[[1238,6]]},"template:templates/docs/data-layer/models":{"position":[[2713,6]]}},"keywords":{}}],["file",{"_index":101,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[110,5],[1479,5],[1768,5]]},"template:docs/advanced/server-configuration":{"position":[[223,4],[2470,5]]},"template:docs/advanced/switching-between-scenarios":{"position":[[112,5],[139,4],[559,4],[984,4],[1098,4],[1500,5],[2009,5]]},"template:docs/data-layer/factories":{"position":[[746,4],[1055,5],[2292,5],[13555,5],[13820,4],[14037,4],[14801,5]]},"template:docs/data-layer/fixtures":{"position":[[48,5],[654,4],[830,5],[1808,4],[1911,5],[2083,5],[2102,5],[3894,6],[3906,5],[5185,5]]},"template:docs/data-layer/models":{"position":[[383,5],[855,4]]},"template:docs/data-layer/orm":{"position":[[5391,5]]},"template:docs/data-layer/serializers/index":{"position":[[2731,4]]},"template:docs/getting-started/overview":{"position":[[14,4],[1774,5],[1982,5],[4237,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[416,5],[549,4],[5037,4],[12721,6],[13792,5],[14274,4],[16288,4],[16599,4],[16696,4],[16967,5],[17577,4]]},"template:docs/testing/acceptance-tests":{"position":[[645,5],[4678,4],[4784,4]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1073,5]]},"template:docs/testing/setup-mirage":{"position":[[1140,4]]},"template:templates/docs/advanced/environment-options":{"position":[[110,5],[1479,5],[1768,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[223,4],[2470,5]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[112,5],[139,4],[559,4],[984,4],[1098,4],[1500,5],[2009,5]]},"template:templates/docs/data-layer/factories":{"position":[[746,4],[1055,5],[2292,5],[13555,5],[13820,4],[14037,4],[14801,5]]},"template:templates/docs/data-layer/fixtures":{"position":[[48,5],[654,4],[830,5],[1808,4],[1911,5],[2083,5],[2102,5],[3894,6],[3906,5],[5185,5]]},"template:templates/docs/data-layer/models":{"position":[[383,5],[855,4]]},"template:templates/docs/data-layer/orm":{"position":[[5391,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2731,4]]},"template:templates/docs/getting-started/overview":{"position":[[14,4],[1774,5],[1982,5],[4237,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[416,5],[549,4],[5037,4],[12721,6],[13792,5],[14274,4],[16288,4],[16599,4],[16696,4],[16967,5],[17577,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[645,5],[4678,4],[4784,4]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1073,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[1140,4]]}},"keywords":{}}],["file-bas",{"_index":780,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[315,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[315,10]]}},"keywords":{}}],["filenam",{"_index":789,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[723,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[14078,9],[14163,10],[14468,10]]},"template:templates/docs/data-layer/fixtures":{"position":[[723,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14078,9],[14163,10],[14468,10]]}},"keywords":{}}],["fillin",{"_index":1735,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4352,6],[6419,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4352,6],[6419,6]]}},"keywords":{}}],["fillin('.titl",{"_index":487,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1691,16]]},"template:templates/docs/data-layer/database":{"position":[[1691,16]]}},"keywords":{}}],["fillin('input",{"_index":1659,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[4387,15]]},"template:docs/testing/assertions":{"position":[[1149,15]]},"template:docs/testing/integration-and-unit-tests":{"position":[[2286,15],[2830,15],[4865,15],[7030,15]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4387,15]]},"template:templates/docs/testing/assertions":{"position":[[1149,15]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[2286,15],[2830,15],[4865,15],[7030,15]]}},"keywords":{}}],["filter",{"_index":1695,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3056,6]]},"template:templates/docs/testing/assertions":{"position":[[3056,6]]}},"keywords":{}}],["filter(key",{"_index":941,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1757,11]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5574,11]]},"template:templates/docs/data-layer/orm":{"position":[[1757,11]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5574,11]]}},"keywords":{}}],["filter[genr",{"_index":1701,"title":{},"text":{"template:docs/testing/assertions":{"position":[[3521,16]]},"template:templates/docs/testing/assertions":{"position":[[3521,16]]}},"keywords":{}}],["final",{"_index":304,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2181,8]]},"template:docs/data-layer/factories":{"position":[[15492,7]]},"template:docs/data-layer/serializers/index":{"position":[[5502,5],[6578,7]]},"template:docs/route-handlers/functions":{"position":[[3467,5]]},"template:templates/docs/advanced/server-configuration":{"position":[[2181,8]]},"template:templates/docs/data-layer/factories":{"position":[[15492,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5502,5],[6578,7]]},"template:templates/docs/route-handlers/functions":{"position":[[3467,5]]}},"keywords":{}}],["finalconfig",{"_index":135,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1086,11]]},"template:docs/advanced/server-configuration":{"position":[[3149,11],[3527,11],[5113,11]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1103,11]]},"template:docs/testing/setup-mirage":{"position":[[1482,11]]},"template:templates/docs/advanced/environment-options":{"position":[[1086,11]]},"template:templates/docs/advanced/server-configuration":{"position":[[3149,11],[3527,11],[5113,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1103,11]]},"template:templates/docs/testing/setup-mirage":{"position":[[1482,11]]}},"keywords":{}}],["find",{"_index":18,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[67,4]]},"template:docs/advanced/switching-between-scenarios":{"position":[[94,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[13128,4],[15420,4],[16141,4]]},"template:docs/route-handlers/shorthands":{"position":[[1311,5],[1601,5],[2284,5],[2927,5],[3583,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4129,4],[4590,4],[6738,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[67,4]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[94,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[13128,4],[15420,4],[16141,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1311,5],[1601,5],[2284,5],[2927,5],[3583,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4129,4],[4590,4],[6738,4]]}},"keywords":{}}],["findal",{"_index":1733,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[4055,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4055,7]]}},"keywords":{}}],["findrecord",{"_index":1709,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[575,12],[781,11],[857,13],[1301,12],[1542,11],[1646,13],[4040,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[575,12],[781,11],[857,13],[1301,12],[1542,11],[1646,13],[4040,10]]}},"keywords":{}}],["fine",{"_index":628,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7164,5]]},"template:templates/docs/data-layer/factories":{"position":[[7164,5]]}},"keywords":{}}],["first",{"_index":515,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[629,5],[1235,5],[8020,5],[9156,5],[11301,5],[16456,5],[16560,5],[17035,5],[17139,5]]},"template:docs/data-layer/orm":{"position":[[583,5]]},"template:docs/data-layer/serializers/index":{"position":[[668,5],[5953,5]]},"template:docs/getting-started/overview":{"position":[[1508,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[1732,5],[17159,5],[17954,5]]},"template:docs/route-handlers/functions":{"position":[[424,5],[1878,5],[5893,5]]},"template:docs/testing/acceptance-tests":{"position":[[881,5]]},"template:docs/testing/assertions":{"position":[[1087,5],[2479,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[4067,5]]},"template:docs/testing/setup-mirage":{"position":[[490,5],[979,5],[1871,5]]},"template:templates/docs/data-layer/factories":{"position":[[629,5],[1235,5],[8020,5],[9156,5],[11301,5],[16456,5],[16560,5],[17035,5],[17139,5]]},"template:templates/docs/data-layer/orm":{"position":[[583,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[668,5],[5953,5]]},"template:templates/docs/getting-started/overview":{"position":[[1508,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[1732,5],[17159,5],[17954,5]]},"template:templates/docs/route-handlers/functions":{"position":[[424,5],[1878,5],[5893,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[881,5]]},"template:templates/docs/testing/assertions":{"position":[[1087,5],[2479,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[4067,5]]},"template:templates/docs/testing/setup-mirage":{"position":[[490,5],[979,5],[1871,5]]}},"keywords":{}}],["first-class",{"_index":406,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[454,11]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3920,11]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[454,11]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3920,11]]}},"keywords":{}}],["first-nam",{"_index":1550,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[4250,13]]},"template:templates/docs/route-handlers/functions":{"position":[[4250,13]]}},"keywords":{}}],["first_nam",{"_index":1462,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15117,12],[15754,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15117,12],[15754,12]]}},"keywords":{}}],["firstnam",{"_index":1475,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[15907,11]]},"template:docs/route-handlers/functions":{"position":[[4545,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[15907,11]]},"template:templates/docs/route-handlers/functions":{"position":[[4545,10]]}},"keywords":{}}],["fit",{"_index":1515,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1752,3]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1752,3]]}},"keywords":{}}],["five",{"_index":555,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3069,4]]},"template:templates/docs/data-layer/factories":{"position":[[3069,4]]}},"keywords":{}}],["fix",{"_index":663,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9108,3]]},"template:docs/getting-started/installation":{"position":[[879,3]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[2939,3],[9991,3]]},"template:templates/docs/data-layer/factories":{"position":[[9108,3]]},"template:templates/docs/getting-started/installation":{"position":[[879,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2939,3],[9991,3]]}},"keywords":{}}],["fixtur",{"_index":323,"title":{"template:docs/data-layer/fixtures":{"position":[[0,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[0,8]]}},"text":{"template:docs/advanced/server-configuration":{"position":[[2745,9]]},"template:docs/data-layer/factories":{"position":[[17606,8]]},"template:docs/data-layer/fixtures":{"position":[[1,8],[40,7],[243,7],[269,8],[596,9],[646,7],[715,7],[822,7],[1800,7],[2027,8],[2154,7],[2332,8],[2369,8],[2428,7],[2733,8],[3886,7],[4151,8],[5177,7],[5301,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[12713,7],[16280,7],[16826,8],[16886,8],[16959,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1532,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[2745,9]]},"template:templates/docs/data-layer/factories":{"position":[[17606,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[1,8],[40,7],[243,7],[269,8],[596,9],[646,7],[715,7],[822,7],[1800,7],[2027,8],[2154,7],[2332,8],[2369,8],[2428,7],[2733,8],[3886,7],[4151,8],[5177,7],[5301,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[12713,7],[16280,7],[16826,8],[16886,8],[16959,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1532,8]]}},"keywords":{}}],["fixtures/blog_posts.j",{"_index":1450,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14279,23]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14279,23]]}},"keywords":{}}],["flat",{"_index":774,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[35,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[35,4]]}},"keywords":{}}],["flexib",{"_index":1452,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[14349,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[14349,8]]}},"keywords":{}}],["flexibl",{"_index":1520,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[42,8],[7440,9]]},"template:templates/docs/route-handlers/functions":{"position":[[42,8],[7440,9]]}},"keywords":{}}],["flip",{"_index":507,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[356,8]]},"template:templates/docs/data-layer/factories":{"position":[[356,8]]}},"keywords":{}}],["focus",{"_index":766,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[17315,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[774,7]]},"template:docs/testing/acceptance-tests":{"position":[[1960,7]]},"template:templates/docs/data-layer/factories":{"position":[[17315,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[774,7]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1960,7]]}},"keywords":{}}],["folder",{"_index":1008,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[343,7]]},"template:docs/getting-started/installation":{"position":[[439,6]]},"template:templates/docs/data-layer/relationships":{"position":[[343,7]]},"template:templates/docs/getting-started/installation":{"position":[[439,6]]}},"keywords":{}}],["follow",{"_index":84,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1410,6]]},"template:docs/data-layer/fixtures":{"position":[[348,10]]},"template:docs/data-layer/orm":{"position":[[5527,9]]},"template:docs/data-layer/relationships":{"position":[[3045,9],[3681,9]]},"template:docs/data-layer/serializers/index":{"position":[[915,7],[2843,7]]},"template:docs/getting-started/installation":{"position":[[705,10],[1021,9]]},"template:docs/getting-started/overview":{"position":[[146,9],[1972,9]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[87,10],[698,6],[11623,9],[14423,6],[14876,8]]},"template:docs/testing/acceptance-tests":{"position":[[4035,6]]},"template:docs/testing/integration-and-unit-tests":{"position":[[5220,9]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1410,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[348,10]]},"template:templates/docs/data-layer/orm":{"position":[[5527,9]]},"template:templates/docs/data-layer/relationships":{"position":[[3045,9],[3681,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[915,7],[2843,7]]},"template:templates/docs/getting-started/installation":{"position":[[705,10],[1021,9]]},"template:templates/docs/getting-started/overview":{"position":[[146,9],[1972,9]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[87,10],[698,6],[11623,9],[14423,6],[14876,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4035,6]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5220,9]]}},"keywords":{}}],["foo",{"_index":1062,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5200,5]]},"template:templates/docs/data-layer/relationships":{"position":[[5200,5]]}},"keywords":{}}],["forbid",{"_index":370,"title":{},"text":{"template:docs/advanced/simulating-cookie-responses":{"position":[[118,7]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[118,7]]}},"keywords":{}}],["foreach(key",{"_index":942,"title":{},"text":{"template:docs/data-layer/orm":{"position":[[1787,12]]},"template:templates/docs/data-layer/orm":{"position":[[1787,12]]}},"keywords":{}}],["foreach(post",{"_index":618,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6761,15]]},"template:templates/docs/data-layer/factories":{"position":[[6761,15]]}},"keywords":{}}],["foreach(resourc",{"_index":1750,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5656,17]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5656,17]]}},"keywords":{}}],["foreign",{"_index":621,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6988,7]]},"template:docs/data-layer/fixtures":{"position":[[1632,7],[2788,7],[3448,7],[3502,7],[4504,7],[4803,7],[5132,7]]},"template:docs/data-layer/orm":{"position":[[2056,7],[6988,7],[7598,7]]},"template:docs/data-layer/relationships":{"position":[[1362,7],[1713,7],[5116,7]]},"template:docs/getting-started/overview":{"position":[[7013,7]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7764,7],[8596,7],[8767,7],[9020,7],[9797,7],[9920,7],[15425,7],[15672,7]]},"template:docs/route-handlers/functions":{"position":[[4718,7],[4782,7],[4877,7]]},"template:templates/docs/data-layer/factories":{"position":[[6988,7]]},"template:templates/docs/data-layer/fixtures":{"position":[[1632,7],[2788,7],[3448,7],[3502,7],[4504,7],[4803,7],[5132,7]]},"template:templates/docs/data-layer/orm":{"position":[[2056,7],[6988,7],[7598,7]]},"template:templates/docs/data-layer/relationships":{"position":[[1362,7],[1713,7],[5116,7]]},"template:templates/docs/getting-started/overview":{"position":[[7013,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7764,7],[8596,7],[8767,7],[9020,7],[9797,7],[9920,7],[15425,7],[15672,7]]},"template:templates/docs/route-handlers/functions":{"position":[[4718,7],[4782,7],[4877,7]]}},"keywords":{}}],["forgiv",{"_index":1478,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[16166,7]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16166,7]]}},"keywords":{}}],["forgot",{"_index":1397,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[9706,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9706,6]]}},"keywords":{}}],["form",{"_index":65,"title":{},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[935,6]]},"template:docs/data-layer/factories":{"position":[[1196,4]]},"template:docs/data-layer/fixtures":{"position":[[765,4]]},"template:docs/data-layer/models":{"position":[[1447,4]]},"template:docs/data-layer/relationships":{"position":[[6165,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[5293,5],[6253,4],[6310,4]]},"template:docs/route-handlers/functions":{"position":[[4075,5]]},"template:docs/route-handlers/shorthands":{"position":[[439,4]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[935,6]]},"template:templates/docs/data-layer/factories":{"position":[[1196,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[765,4]]},"template:templates/docs/data-layer/models":{"position":[[1447,4]]},"template:templates/docs/data-layer/relationships":{"position":[[6165,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[5293,5],[6253,4],[6310,4]]},"template:templates/docs/route-handlers/functions":{"position":[[4075,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[439,4]]}},"keywords":{}}],["format",{"_index":818,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[1682,6],[1752,6]]},"template:docs/data-layer/orm":{"position":[[686,6],[744,6],[1045,10],[3012,10],[4223,9]]},"template:docs/data-layer/serializers/index":{"position":[[234,9],[805,6],[1020,6],[1104,7],[1256,6],[1645,8],[1933,7],[2021,7],[6764,8]]},"template:docs/getting-started/overview":{"position":[[1013,10],[7366,9],[7602,7],[7851,10],[8065,8],[8122,10]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[7528,9],[14718,6],[14889,6],[15304,6],[15388,7]]},"template:docs/getting-started/what-is-mirage":{"position":[[1580,10]]},"template:docs/route-handlers/shorthands":{"position":[[2603,6],[3294,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[1682,6],[1752,6]]},"template:templates/docs/data-layer/orm":{"position":[[686,6],[744,6],[1045,10],[3012,10],[4223,9]]},"template:templates/docs/data-layer/serializers/index":{"position":[[234,9],[805,6],[1020,6],[1104,7],[1256,6],[1645,8],[1933,7],[2021,7],[6764,8]]},"template:templates/docs/getting-started/overview":{"position":[[1013,10],[7366,9],[7602,7],[7851,10],[8065,8],[8122,10]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7528,9],[14718,6],[14889,6],[15304,6],[15388,7]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1580,10]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2603,6],[3294,6]]}},"keywords":{}}],["fortun",{"_index":544,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2145,12]]},"template:docs/getting-started/overview":{"position":[[5889,12]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3806,12],[18136,12]]},"template:templates/docs/data-layer/factories":{"position":[[2145,12]]},"template:templates/docs/getting-started/overview":{"position":[[5889,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3806,12],[18136,12]]}},"keywords":{}}],["found",{"_index":1771,"title":{"template:not-found":{"position":[[4,5]]},"template:templates/not-found":{"position":[[4,5]]}},"text":{"template:not-found":{"position":[[5,5]]},"template:templates/not-found":{"position":[[5,5]]}},"keywords":{}}],["framework",{"_index":1514,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1405,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3400,9]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1405,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3400,9]]}},"keywords":{}}],["frontend",{"_index":1502,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[58,8],[288,8],[599,8]]},"template:docs/route-handlers/shorthands":{"position":[[5839,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[58,8],[288,8],[599,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[5839,8]]}},"keywords":{}}],["frustrat",{"_index":1307,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[2268,11]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[2268,11]]}},"keywords":{}}],["full",{"_index":1265,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[9568,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[196,4],[18701,4]]},"template:docs/route-handlers/functions":{"position":[[5322,4]]},"template:docs/route-handlers/shorthands":{"position":[[1090,4],[5439,4]]},"template:templates/docs/getting-started/overview":{"position":[[9568,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[196,4],[18701,4]]},"template:templates/docs/route-handlers/functions":{"position":[[5322,4]]},"template:templates/docs/route-handlers/shorthands":{"position":[[1090,4],[5439,4]]}},"keywords":{}}],["fulli",{"_index":1278,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[10630,5]]},"template:docs/route-handlers/functions":{"position":[[7017,5]]},"template:templates/docs/getting-started/overview":{"position":[[10630,5]]},"template:templates/docs/route-handlers/functions":{"position":[[7017,5]]}},"keywords":{}}],["function",{"_index":68,"title":{"template:docs/route-handlers/functions":{"position":[[0,9]]},"template:templates/docs/route-handlers/functions":{"position":[[0,9]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[1036,8]]},"template:docs/advanced/server-configuration":{"position":[[163,8],[272,8],[354,9],[811,9],[856,8],[923,8],[2332,9],[2360,8],[3379,8],[3661,8],[5307,8]]},"template:docs/advanced/simulating-cookie-responses":{"position":[[343,8]]},"template:docs/advanced/switching-between-scenarios":{"position":[[122,8],[2029,8]]},"template:docs/data-layer/factories":{"position":[[2778,9],[5261,9]]},"template:docs/data-layer/serializers/ember-data-serializer":{"position":[[66,13],[655,9],[757,9],[1325,8]]},"template:docs/data-layer/serializers/index":{"position":[[5637,8]]},"template:docs/getting-started/overview":{"position":[[344,8],[397,8],[3404,9],[4200,8],[8675,8],[9927,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[594,8],[761,8],[810,8],[1079,8],[1278,8],[1295,8],[18343,8],[18384,10]]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[105,8]]},"template:docs/getting-started/what-is-mirage":{"position":[[1298,9]]},"template:docs/route-handlers/functions":{"position":[[1,9],[11,8],[104,8],[486,8],[1278,10],[1670,10],[3287,8],[3545,8],[3847,8],[5327,8],[5369,8],[5473,8],[5504,8],[6531,10],[7387,8],[7412,8],[7595,8]]},"template:docs/route-handlers/shorthands":{"position":[[245,8],[756,8]]},"template:docs/testing/acceptance-tests":{"position":[[5696,10]]},"template:docs/testing/integration-and-unit-tests":{"position":[[298,8],[5447,10]]},"template:docs/testing/setup-mirage":{"position":[[1170,9],[1199,8]]},"template:index":{"position":[[219,10]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[1036,8]]},"template:templates/docs/advanced/server-configuration":{"position":[[163,8],[272,8],[354,9],[811,9],[856,8],[923,8],[2332,9],[2360,8],[3379,8],[3661,8],[5307,8]]},"template:templates/docs/advanced/simulating-cookie-responses":{"position":[[343,8]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[122,8],[2029,8]]},"template:templates/docs/data-layer/factories":{"position":[[2778,9],[5261,9]]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"position":[[66,13],[655,9],[757,9],[1325,8]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5637,8]]},"template:templates/docs/getting-started/overview":{"position":[[344,8],[397,8],[3404,9],[4200,8],[8675,8],[9927,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[594,8],[761,8],[810,8],[1079,8],[1278,8],[1295,8],[18343,8],[18384,10]]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"position":[[105,8]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1298,9]]},"template:templates/docs/route-handlers/functions":{"position":[[1,9],[11,8],[104,8],[486,8],[1278,10],[1670,10],[3287,8],[3545,8],[3847,8],[5327,8],[5369,8],[5473,8],[5504,8],[6531,10],[7387,8],[7412,8],[7595,8]]},"template:templates/docs/route-handlers/shorthands":{"position":[[245,8],[756,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5696,10]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[298,8],[5447,10]]},"template:templates/docs/testing/setup-mirage":{"position":[[1170,9],[1199,8]]},"template:templates/index":{"position":[[219,10]]}},"keywords":{}}],["function(assert",{"_index":484,"title":{},"text":{"template:docs/data-layer/database":{"position":[[1638,16]]},"template:docs/data-layer/factories":{"position":[[15252,16],[16309,16],[16981,16]]},"template:docs/data-layer/fixtures":{"position":[[2529,16]]},"template:docs/getting-started/overview":{"position":[[5211,16],[5472,16],[6661,16]]},"template:docs/testing/acceptance-tests":{"position":[[900,16],[1723,16],[3080,16],[3263,16],[3698,16],[4229,16],[5517,16],[5804,16]]},"template:docs/testing/assertions":{"position":[[1026,16],[1710,16],[3081,16]]},"template:docs/testing/integration-and-unit-tests":{"position":[[688,16],[1419,16],[2185,16],[2653,16],[4539,16],[6687,16]]},"template:docs/testing/setup-mirage":{"position":[[509,16],[998,16],[1890,16]]},"template:templates/docs/data-layer/database":{"position":[[1638,16]]},"template:templates/docs/data-layer/factories":{"position":[[15252,16],[16309,16],[16981,16]]},"template:templates/docs/data-layer/fixtures":{"position":[[2529,16]]},"template:templates/docs/getting-started/overview":{"position":[[5211,16],[5472,16],[6661,16]]},"template:templates/docs/testing/acceptance-tests":{"position":[[900,16],[1723,16],[3080,16],[3263,16],[3698,16],[4229,16],[5517,16],[5804,16]]},"template:templates/docs/testing/assertions":{"position":[[1026,16],[1710,16],[3081,16]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[688,16],[1419,16],[2185,16],[2653,16],[4539,16],[6687,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[509,16],[998,16],[1890,16]]}},"keywords":{}}],["function(config",{"_index":134,"title":{},"text":{"template:docs/advanced/environment-options":{"position":[[1063,16]]},"template:docs/advanced/server-configuration":{"position":[[3126,16],[3504,16],[5090,16]]},"template:docs/testing/setup-mirage":{"position":[[1459,16]]},"template:templates/docs/advanced/environment-options":{"position":[[1063,16]]},"template:templates/docs/advanced/server-configuration":{"position":[[3126,16],[3504,16],[5090,16]]},"template:templates/docs/testing/setup-mirage":{"position":[[1459,16]]}},"keywords":{}}],["function(db",{"_index":1493,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[18019,12]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[18019,12]]}},"keywords":{}}],["function(environ",{"_index":428,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1326,21]]},"template:docs/testing/assertions":{"position":[[2620,21]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1326,21]]},"template:templates/docs/testing/assertions":{"position":[[2620,21]]}},"keywords":{}}],["function(hook",{"_index":1219,"title":{},"text":{"template:docs/getting-started/overview":{"position":[[5108,15]]},"template:docs/testing/acceptance-tests":{"position":[[803,15]]},"template:docs/testing/integration-and-unit-tests":{"position":[[588,15],[1314,15],[2083,15],[2551,15],[4437,15],[6585,15]]},"template:docs/testing/setup-mirage":{"position":[[414,15],[887,15],[1779,15]]},"template:templates/docs/getting-started/overview":{"position":[[5108,15]]},"template:templates/docs/testing/acceptance-tests":{"position":[[803,15]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[588,15],[1314,15],[2083,15],[2551,15],[4437,15],[6585,15]]},"template:templates/docs/testing/setup-mirage":{"position":[[414,15],[887,15],[1779,15]]}},"keywords":{}}],["function(schema",{"_index":880,"title":{},"text":{"template:docs/data-layer/models":{"position":[[1123,16]]},"template:docs/data-layer/serializers/index":{"position":[[5749,16],[6224,16]]},"template:docs/route-handlers/functions":{"position":[[4461,16],[5939,16],[6566,16]]},"template:docs/route-handlers/shorthands":{"position":[[2432,16],[3085,16]]},"template:templates/docs/data-layer/models":{"position":[[1123,16]]},"template:templates/docs/data-layer/serializers/index":{"position":[[5749,16],[6224,16]]},"template:templates/docs/route-handlers/functions":{"position":[[4461,16],[5939,16],[6566,16]]},"template:templates/docs/route-handlers/shorthands":{"position":[[2432,16],[3085,16]]}},"keywords":{}}],["function(serv",{"_index":436,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[1820,16],[2062,16]]},"template:docs/data-layer/database":{"position":[[763,16]]},"template:docs/data-layer/factories":{"position":[[1107,16],[1598,16],[13607,16],[13920,16],[14513,16]]},"template:docs/data-layer/fixtures":{"position":[[405,16],[1963,16],[2231,16]]},"template:docs/data-layer/models":{"position":[[1325,16],[1696,16]]},"template:docs/getting-started/overview":{"position":[[4289,16]]},"template:docs/testing/acceptance-tests":{"position":[[5296,16]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[1820,16],[2062,16]]},"template:templates/docs/data-layer/database":{"position":[[763,16]]},"template:templates/docs/data-layer/factories":{"position":[[1107,16],[1598,16],[13607,16],[13920,16],[14513,16]]},"template:templates/docs/data-layer/fixtures":{"position":[[405,16],[1963,16],[2231,16]]},"template:templates/docs/data-layer/models":{"position":[[1325,16],[1696,16]]},"template:templates/docs/getting-started/overview":{"position":[[4289,16]]},"template:templates/docs/testing/acceptance-tests":{"position":[[5296,16]]}},"keywords":{}}],["further",{"_index":637,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[7729,7]]},"template:templates/docs/data-layer/factories":{"position":[[7729,7]]}},"keywords":{}}],["futur",{"_index":325,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2795,6]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[17505,6]]},"template:templates/docs/advanced/server-configuration":{"position":[[2795,6]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[17505,6]]}},"keywords":{}}],["g",{"_index":545,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[2250,1]]},"template:docs/data-layer/fixtures":{"position":[[688,1]]},"template:docs/data-layer/models":{"position":[[815,1]]},"template:docs/data-layer/serializers/index":{"position":[[2688,1]]},"template:docs/getting-started/overview":{"position":[[1932,1],[3267,1]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[16555,1]]},"template:templates/docs/data-layer/factories":{"position":[[2250,1]]},"template:templates/docs/data-layer/fixtures":{"position":[[688,1]]},"template:templates/docs/data-layer/models":{"position":[[815,1]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2688,1]]},"template:templates/docs/getting-started/overview":{"position":[[1932,1],[3267,1]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[16555,1]]}},"keywords":{}}],["gain",{"_index":1683,"title":{},"text":{"template:docs/testing/assertions":{"position":[[1432,4]]},"template:templates/docs/testing/assertions":{"position":[[1432,4]]}},"keywords":{}}],["gap",{"_index":1377,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[7660,3]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[7660,3]]}},"keywords":{}}],["garrett",{"_index":834,"title":{},"text":{"template:docs/data-layer/fixtures":{"position":[[3097,8],[3315,8],[4013,8],[4636,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[3097,8],[3315,8],[4013,8],[4636,8]]}},"keywords":{}}],["gener",{"_index":210,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[249,8],[356,8],[414,8]]},"template:docs/data-layer/factories":{"position":[[803,9],[2110,8],[2205,8],[3060,8],[3791,8],[4292,8],[5302,10],[5655,8],[6843,9],[15759,8]]},"template:docs/data-layer/fixtures":{"position":[[90,8],[633,10]]},"template:docs/data-layer/models":{"position":[[798,10]]},"template:docs/data-layer/orm":{"position":[[2657,10],[5349,9],[5589,8],[8736,10]]},"template:docs/data-layer/serializers/index":{"position":[[2642,9],[6622,8]]},"template:docs/getting-started/installation":{"position":[[1466,10]]},"template:docs/getting-started/overview":{"position":[[1698,8],[1873,9],[1958,9],[3115,8]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[387,9],[1821,8],[11896,9],[12050,9],[12901,7],[17803,10]]},"template:docs/testing/acceptance-tests":{"position":[[4006,7]]},"template:docs/testing/assertions":{"position":[[3558,7]]},"template:templates/docs/advanced/mocking-guids":{"position":[[249,8],[356,8],[414,8]]},"template:templates/docs/data-layer/factories":{"position":[[803,9],[2110,8],[2205,8],[3060,8],[3791,8],[4292,8],[5302,10],[5655,8],[6843,9],[15759,8]]},"template:templates/docs/data-layer/fixtures":{"position":[[90,8],[633,10]]},"template:templates/docs/data-layer/models":{"position":[[798,10]]},"template:templates/docs/data-layer/orm":{"position":[[2657,10],[5349,9],[5589,8],[8736,10]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2642,9],[6622,8]]},"template:templates/docs/getting-started/installation":{"position":[[1466,10]]},"template:templates/docs/getting-started/overview":{"position":[[1698,8],[1873,9],[1958,9],[3115,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[387,9],[1821,8],[11896,9],[12050,9],[12901,7],[17803,10]]},"template:templates/docs/testing/acceptance-tests":{"position":[[4006,7]]},"template:templates/docs/testing/assertions":{"position":[[3558,7]]}},"keywords":{}}],["genr",{"_index":535,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1692,6],[1820,6],[3656,6],[3935,6],[4009,6],[4081,6],[4155,6],[4229,6]]},"template:docs/data-layer/orm":{"position":[[1421,6],[2136,6],[4657,6],[5718,6],[6927,6],[7423,6]]},"template:docs/testing/assertions":{"position":[[3137,6],[3194,6]]},"template:templates/docs/data-layer/factories":{"position":[[1692,6],[1820,6],[3656,6],[3935,6],[4009,6],[4081,6],[4155,6],[4229,6]]},"template:templates/docs/data-layer/orm":{"position":[[1421,6],[2136,6],[4657,6],[5718,6],[6927,6],[7423,6]]},"template:templates/docs/testing/assertions":{"position":[[3137,6],[3194,6]]}},"keywords":{}}],["genre(i",{"_index":562,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3641,8]]},"template:templates/docs/data-layer/factories":{"position":[[3641,8]]}},"keywords":{}}],["genres.length",{"_index":566,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3716,15]]},"template:templates/docs/data-layer/factories":{"position":[[3716,15]]}},"keywords":{}}],["genres[i",{"_index":565,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[3705,8]]},"template:templates/docs/data-layer/factories":{"position":[[3705,8]]}},"keywords":{}}],["get",{"_index":759,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16641,4]]},"template:docs/data-layer/fixtures":{"position":[[3563,4]]},"template:docs/data-layer/orm":{"position":[[4830,4],[7117,4]]},"template:docs/getting-started/what-is-mirage":{"position":[[533,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[3220,4]]},"template:templates/docs/data-layer/factories":{"position":[[16641,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[3563,4]]},"template:templates/docs/data-layer/orm":{"position":[[4830,4],[7117,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[533,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[3220,4]]}},"keywords":{}}],["getcontext",{"_index":1744,"title":{},"text":{"template:docs/testing/integration-and-unit-tests":{"position":[[5353,10],[5474,13]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[5353,10],[5474,13]]}},"keywords":{}}],["getter",{"_index":1065,"title":{},"text":{"template:docs/data-layer/relationships":{"position":[[5334,6],[5838,6]]},"template:templates/docs/data-layer/relationships":{"position":[[5334,6],[5838,6]]}},"keywords":{}}],["getuuid",{"_index":228,"title":{},"text":{"template:docs/advanced/mocking-guids":{"position":[[802,7],[958,10],[1005,10]]},"template:templates/docs/advanced/mocking-guids":{"position":[[802,7],[958,10],[1005,10]]}},"keywords":{}}],["github",{"_index":8,"title":{},"text":{"template:blog/detail":{"position":[[69,7]]},"template:templates/blog/detail":{"position":[[69,7]]}},"keywords":{}}],["give",{"_index":313,"title":{},"text":{"template:docs/advanced/server-configuration":{"position":[[2537,5]]},"template:docs/data-layer/database":{"position":[[285,6]]},"template:docs/data-layer/factories":{"position":[[3848,5],[4721,5],[4915,5],[14862,6]]},"template:docs/data-layer/orm":{"position":[[8582,5]]},"template:docs/data-layer/serializers/index":{"position":[[1268,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[823,4],[11349,4]]},"template:docs/testing/assertions":{"position":[[506,4]]},"template:templates/docs/advanced/server-configuration":{"position":[[2537,5]]},"template:templates/docs/data-layer/database":{"position":[[285,6]]},"template:templates/docs/data-layer/factories":{"position":[[3848,5],[4721,5],[4915,5],[14862,6]]},"template:templates/docs/data-layer/orm":{"position":[[8582,5]]},"template:templates/docs/data-layer/serializers/index":{"position":[[1268,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[823,4],[11349,4]]},"template:templates/docs/testing/assertions":{"position":[[506,4]]}},"keywords":{}}],["given",{"_index":702,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[12213,5]]},"template:docs/data-layer/orm":{"position":[[7648,5]]},"template:docs/route-handlers/functions":{"position":[[3359,5],[3733,5]]},"template:docs/route-handlers/shorthands":{"position":[[4309,5]]},"template:docs/testing/acceptance-tests":{"position":[[219,5],[278,5],[2147,5]]},"template:templates/docs/data-layer/factories":{"position":[[12213,5]]},"template:templates/docs/data-layer/orm":{"position":[[7648,5]]},"template:templates/docs/route-handlers/functions":{"position":[[3359,5],[3733,5]]},"template:templates/docs/route-handlers/shorthands":{"position":[[4309,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[219,5],[278,5],[2147,5]]}},"keywords":{}}],["global",{"_index":1530,"title":{},"text":{"template:docs/route-handlers/functions":{"position":[[1145,6],[1227,6],[7159,8]]},"template:docs/testing/acceptance-tests":{"position":[[1099,7]]},"template:docs/testing/integration-and-unit-tests":{"position":[[1028,6]]},"template:templates/docs/route-handlers/functions":{"position":[[1145,6],[1227,6],[7159,8]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1099,7]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[1028,6]]}},"keywords":{}}],["go",{"_index":405,"title":{},"text":{"template:docs/advanced/switching-between-scenarios":{"position":[[441,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[10010,5],[12526,2],[14503,2]]},"template:docs/testing/integration-and-unit-tests":{"position":[[7402,2]]},"template:templates/docs/advanced/switching-between-scenarios":{"position":[[441,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[10010,5],[12526,2],[14503,2]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[7402,2]]}},"keywords":{}}],["goe",{"_index":746,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[16052,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8735,4],[16010,4]]},"template:templates/docs/data-layer/factories":{"position":[[16052,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8735,4],[16010,4]]}},"keywords":{}}],["good",{"_index":458,"title":{},"text":{"template:docs/data-layer/database":{"position":[[552,4]]},"template:docs/data-layer/fixtures":{"position":[[5366,4]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[3564,4]]},"template:templates/docs/data-layer/database":{"position":[[552,4]]},"template:templates/docs/data-layer/fixtures":{"position":[[5366,4]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3564,4]]}},"keywords":{}}],["graciou",{"_index":1319,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[3384,8]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[3384,8]]}},"keywords":{}}],["graph",{"_index":615,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[6650,6],[11417,7],[12048,6]]},"template:docs/data-layer/fixtures":{"position":[[3869,5]]},"template:docs/data-layer/orm":{"position":[[5481,5],[7230,5],[8665,7]]},"template:docs/data-layer/relationships":{"position":[[6355,6]]},"template:docs/data-layer/serializers/index":{"position":[[584,5]]},"template:docs/getting-started/overview":{"position":[[6590,6]]},"template:templates/docs/data-layer/factories":{"position":[[6650,6],[11417,7],[12048,6]]},"template:templates/docs/data-layer/fixtures":{"position":[[3869,5]]},"template:templates/docs/data-layer/orm":{"position":[[5481,5],[7230,5],[8665,7]]},"template:templates/docs/data-layer/relationships":{"position":[[6355,6]]},"template:templates/docs/data-layer/serializers/index":{"position":[[584,5]]},"template:templates/docs/getting-started/overview":{"position":[[6590,6]]}},"keywords":{}}],["great",{"_index":539,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[1921,5],[4384,5]]},"template:docs/getting-started/overview":{"position":[[10002,5]]},"template:docs/testing/assertions":{"position":[[1419,5]]},"template:docs/testing/integration-and-unit-tests":{"position":[[103,5]]},"template:templates/docs/data-layer/factories":{"position":[[1921,5],[4384,5]]},"template:templates/docs/getting-started/overview":{"position":[[10002,5]]},"template:templates/docs/testing/assertions":{"position":[[1419,5]]},"template:templates/docs/testing/integration-and-unit-tests":{"position":[[103,5]]}},"keywords":{}}],["group",{"_index":677,"title":{},"text":{"template:docs/data-layer/factories":{"position":[[9889,5]]},"template:templates/docs/data-layer/factories":{"position":[[9889,5]]}},"keywords":{}}],["guess",{"_index":1364,"title":{},"text":{"template:docs/getting-started/upgrade-guide/index":{"position":[[6513,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[6513,5]]}},"keywords":{}}],["guid",{"_index":52,"title":{"template:docs/advanced/mocking-guids":{"position":[[8,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[8,5]]},"template:templates/docs/advanced/mocking-guids":{"position":[[8,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[8,5]]}},"text":{"template:docs/advanced/customizing-the-inflector":{"position":[[730,6]]},"template:docs/advanced/mocking-guids":{"position":[[9,5],[37,5],[780,6]]},"template:docs/data-layer/database":{"position":[[530,7]]},"template:docs/data-layer/factories":{"position":[[15725,7]]},"template:docs/data-layer/models":{"position":[[1878,7]]},"template:docs/data-layer/relationships":{"position":[[6106,7]]},"template:docs/data-layer/serializers/index":{"position":[[2065,6]]},"template:docs/getting-started/overview":{"position":[[9233,5]]},"template:docs/getting-started/upgrade-guide/index":{"position":[[9,5],[288,5],[1511,5],[1632,5],[8466,5],[11427,5],[13443,5],[17229,5],[17251,5],[18658,5],[18768,5]]},"template:docs/testing/acceptance-tests":{"position":[[1187,5]]},"template:docs/testing/assertions":{"position":[[3909,7]]},"template:templates/docs/advanced/customizing-the-inflector":{"position":[[730,6]]},"template:templates/docs/advanced/mocking-guids":{"position":[[9,5],[37,5],[780,6]]},"template:templates/docs/data-layer/database":{"position":[[530,7]]},"template:templates/docs/data-layer/factories":{"position":[[15725,7]]},"template:templates/docs/data-layer/models":{"position":[[1878,7]]},"template:templates/docs/data-layer/relationships":{"position":[[6106,7]]},"template:templates/docs/data-layer/serializers/index":{"position":[[2065,6]]},"template:templates/docs/getting-started/overview":{"position":[[9233,5]]},"template:templates/docs/getting-started/upgrade-guide/index":{"position":[[9,5],[288,5],[1511,5],[1632,5],[8466,5],[11427,5],[13443,5],[17229,5],[17251,5],[18658,5],[18768,5]]},"template:templates/docs/testing/acceptance-tests":{"position":[[1187,5]]},"template:templates/docs/testing/assertions":{"position":[[3909,7]]}},"keywords":{}}],["guy",{"_index":1519,"title":{},"text":{"template:docs/getting-started/what-is-mirage":{"position":[[1918,4]]},"template:templates/docs/getting-started/what-is-mirage":{"position":[[1918,4]]}},"keywords":{}}],["h1",{"_index":1637,"title":{},"text":{"template:docs/testing/acceptance-tests":{"position":[[2390,4]]},"template:templates/docs/testing/acceptance-tests":{"position":[[2390,4]]}},"keywords":{}}],["h1>whoops!{{model.title}} A custom identity manager must implement these methods: fetch, which must return an identifier not used yet. set, which is called with an id of a record being insert in mirage's database. reset, which should reset database to initial state. Here's an example implementation for an identity manager that mocks GUIDs: import { v4 as getUuid } from \"ember-uuid\"; export default class { constructor() { this.ids = new Set(); } // Returns a new unused unique identifier. fetch() { let uuid = getUuid(); while (this.ids.has(uuid)) { uuid = getUuid(); } this.ids.add(uuid); return uuid; } // Registers an identifier as used. Must throw if identifier is already used. set(id) { if (this.ids.has(id)) { throw new Error(`ID ${id} has already been used.`); } this.ids.add(id); } // Resets all used identifiers to unused. reset() { this.ids.clear(); } } ","route":"docs.advanced.mocking-guids","keywords":[]},"template:docs/advanced/server-configuration":{"id":"template:docs/advanced/server-configuration","type":"template","title":"Server configuration","text":" Server configuration The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. Typically, the /mirage/config.js file contains a single default export which is a function defining all your Mirage route handlers. Ember CLI Mirage then uses this function, along with all the other modules you've defined in mirage/models, mirage/fixtures, mirage/factories, and mirage/serializers, to create your Mirage JS server when your app boots up in development and testing. You can now opt in to having more control over exactly how your Mirage server is instantiated using the same code as the mirageJS examples of creating a server by changing your current default export that represents the routes to a normal function, then creating a new default export function that creates the mirageJS server. This new default export function receives a single argument named config, which contains all the factory/fixture/serializer/model modules that exist in your project's /mirage directory. This saves you from having to import each module explicitly and then pass it into your Mirage server, just like you're used to with the default setup. The config argument maps exactly to everything inside of your /mirage directory - notably, it does not contain the autogenerated Mirage model definitions derived from your Ember Data models, which is an important feature of Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper has been provided named discoverEmberDataModels from the ember-cli-mirage package that you can use to augment your config with these models so that your Mirage schema is automatically inferred from your host application's Ember Data models and relationships. The snippet below shows how to do this. Note that the order here matters if you also have models defined in your /mirage/models directory, as those model definitions would \"win\" in the event of a conflict with the ones autodiscovered from Ember Data. (However, most of time if you are inferring your Mirage schema from Ember Data, you shouldn't need to define additional models.) Finally, your route handlers just need to be passed to the routes() key in your Mirage config. You can do this inline, or you can make them a separate function, and organize that function however you choose. You should also add miragejs to your project's dependencies in your package.json file, since you are now importing directly from it. Note that this gives you the added benefit of being able to upgrade miragejs independently of ember-cli-mirage. All the objects from miragejs are re-exported in ember-cli-mirage such as Model, belongsTo, hasMany as well as Fixtures, Traits for example. These should in the future also be imported directly from miragejs as eventually these re-exports will be removed. This will help align the ember-cli-mirage users with the rest of the Mirage JS community. // Example with inline routes import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { // this.namespace = '/api' // this.resource('user') }, }; return createServer(finalConfig); } // Example with routes in an external function import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } Serializers If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your server configuration to have mirage perform this for you. When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage version of the model. With serializers, you may have created a mirage serializer to override some methods, but would still like Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than the way you merge the models. applyEmberDataSerializers will apply the primaryKey and attrs from your ember data serializers to your mirage serializers. If you have not created a mirage serializer it will create one and extend it from your mirage application serializer. Ensure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand how to use primaryKey and transforms. If you have not created a mirage serializer named application, the created serializer will extend EmberDataSerializer directly. // Example of having Mirage adjust/create your serializers similiar to ember data models import { discoverEmberDataModels, applyEmberDataSerializers } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, serializers: applyEmberDataSerializers(config.serializers), routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } ","route":"docs.advanced.server-configuration","keywords":[]},"template:docs/advanced/simulating-cookie-responses":{"id":"template:docs/advanced/simulating-cookie-responses","type":"template","title":"Simulating cookie responses","text":" Simulating cookie responses Although Mirage allows setting headers in a response, the XMLHttpRequest spec explicitly forbids access to Set-Cookie and Set-Cookie2 headers. As a result Mirage responses cannot set cookies via headers. However, you can simulate receiving cookies from an ajax call at the browser level by setting them in a route function handler: this.post('/users/login', schema => { // log in for 24 hours let now = new Date(); let cookieExpiration = new Date(now.getTime() + (24 * 3600 * 1000)); document.cookie=`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires=${cookieExpiration.toUTCString()};`; return schema.users.find(1); }); Your Ember client code will now have access to any cookies set using document.cookie. ","route":"docs.advanced.simulating-cookie-responses","keywords":[]},"template:docs/advanced/switching-between-scenarios":{"id":"template:docs/advanced/switching-between-scenarios","type":"template","title":"Switching between scenarios","text":" Switching between scenarios Mirage adds a /scenarios directory to your project, where you'll find a default.js file. The function in this file will run in development mode and act as your \"development seeds\". In testing it's ignored, so that your Mirage server starts out with a clean database. You can then use each test to seed Mirage as needed for that test. In this way, each test acts as its own Mirage scenario. Originally Mirage was going to add first-class support for development-time scenario switching, but currently only the scenarios/default.js file is used by Mirage. However, you can use various strategies to configure the behavior of your default scenario, to support multiple development server states or to facilitate things like running user acceptance testing. For example, you might want to test whether a user can complete a set of tasks specific to unique circumstances defined in a scenario. One strategy you could take is to configure your default scenario file to honor options passed to the runtime environment. For example, say you wanted to be able to run a scenario file like this: MIRAGE_SCENARIO=some-scenario ember s To affect the behavior of scenarios/default.js, add the MIRAGE_SCENARIO ENV variable to your environment/config.js: const { MIRAGE_SCENARIO } = process.env; module.exports = function(environment) { const ENV = { // ...other stuff MIRAGE_SCENARIO, // ...other stuff }; return ENV; } Then access this new config variable in your scenarios/default.js file: // scenarios/default.js import ENV from '../../config/environment'; import visitor from './visitor'; import subscriber from './subscriber'; import administrator from './administrator'; const scenarios = { visitor, subscriber, administrator } const activeScenario = ENV.MIRAGE_SCENARIO || 'visitor'; export default function(server) { const scenario = scenarios[activeScenario]; if (scenario) { scenario(server); } // plus whatever default scenario code you want } Like other Mirage objects, all scenario files must export a function like so: export default function(server) { // server.createList('post', 15); } Note that the server parameter is not provided by default. ","route":"docs.advanced.switching-between-scenarios","keywords":[]},"template:docs/data-layer/database":{"id":"template:docs/data-layer/database","type":"template","title":"The Database","text":" The Database At the core of Mirage's data layer is a simple in-memory database. This database stores all of Mirage's initial state, and then your route handlers access and modify that state as you use your application. The database is what allows Mirage to mimic a production server, giving you the ability to write complete dynamic features in your Ember app. Most of your Mirage code will not access the database directly, but rather will interact with it through Mirage's ORM. We'll cover the ORM in the next section of these guides. However, it's good to know that whether or not you use the ORM, you can always interact with the database directly. For example, you could seed it with some data in scenarios/default.js // scenarios/default.js export default function(server) { server.db.loadData({ movies: [ { title: 'Interstellar' }, { title: 'Inception' }, { title: 'Dunkirk' }, ] }); } and then can access it in your route handlers using the schema argument: this.get('/movies', (schema, request) => { return schema.db.movies; }); This route handler would then respond with the data you loaded: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] Note that each record has an id field, since the database assigns all new records an auto-incrementing ID. The most common place you'll use the database directly is in your tests, where you can access it via this.server.db. It can be useful to assert against the state of Mirage's database to verify that your Ember app's network requests are sending over the correct data. // tests/movie-test.js test('I can create a movie', async function(assert) { await visit('/movies/new'); await fillIn('.title', 'The Dark Knight'); await click('.submit'); assert.dom('h2').includesText('New movie saved!'); assert.equal(this.server.db.movies[0].title, 'The Dark Knight'); }); You can view the rest of the Database APIs in the and API reference. Next, we'll learn about Mirage's ORM. ","route":"docs.data-layer.database","keywords":[]},"template:docs/data-layer/factories":{"id":"template:docs/data-layer/factories","type":"template","title":"Factories","text":" Factories One of the main benefits of using Mirage is the ability to quickly put your server into different states. For example, you might be developing a feature and want to see how the UI renders for both a logged-in user and an anonymous user. This is the kind of thing that's a pain when using a real backend server, but with Mirage it's as simple as flipping a JavaScript variable and live-reloading your Ember app. Factories are classes that help you organize your data-creation logic, making it easier to define different server states during development or within tests. Let's see how they work. Defining factories Your first factory Say we have a Movie model defined in Mirage. (Remember, if you're using Ember Data you won't have this file on disk. The Model definition will be automatically generated for you.) // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); To seed Mirage's database with some movies so you can start developing your app, use the server.create method in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.create('movie'); } server.create takes the singular hyphenated form of your model's class name as its first argument. Because we have no Factory defined for a Movie, server.create('movie') will just create an empty record and insert it into the database: // server.db.dump(); { movies: [ { id: '1' } ] } Not a very interesting record. However, we can pass attributes of our own as the second argument to server.create: // mirage/scenarios/default.js export default function(server) { server.create('movie', { title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' }); } Now our database looks like this { movies: [ { id: '1', title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' } ] } and we'll actually be able to develop our UI against realistic data. This is a great way to start, but it can be cumbersome to manually define every attribute (and relationship) when working on data-driven applications. It would be nice if we had a way to dynamically generate some of these attributes. Fortunately, that's exactly what Factories let us do! Let's generate a Factory for our movie using ember g mirage-factory movie which creates this file: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ }); Right now the Factory is empty. Let's define a property on it: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Movie title' }); Now server.create('movie') will use the properties from this factory. The inserted record will look like this: { movies: [ { id: '1', title: 'Movie title' } ] } We can also make this property a function. // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; } }); i is an incrementing index that lets us make our factory attributes more dynamic. If we use the server.createList method, we can quickly generate five movies server.createList('movie', 5); and with the above factory definition, our database will look like this: { movies: [ { id: '1', title: 'Movie 1' }, { id: '2', title: 'Movie 2' }, { id: '3', title: 'Movie 3' }, { id: '4', title: 'Movie 4' }, { id: '5', title: 'Movie 5' } ] } Let's add some more properties to our factory: // mirage/factories/movie.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ title(i) { return `Movie ${i}`; }, releaseDate() { return faker.date.past().toLocaleDateString(); }, genre(i) { let genres = [ 'Sci-Fi', 'Drama', 'Comedy' ]; return genres[i % genres.length]; } }); Here we've installed the Faker.js library to help us generate random dates. Now server.createList('movie', 5) gives us this data: { movies: [ { id: '1', title: 'Movie 1', releaseDate: '5/14/2018', genre: 'Sci-Fi' }, { id: '2', title: 'Movie 2', releaseDate: '2/22/2019', genre: 'Drama' }, { id: '3', title: 'Movie 3', releaseDate: '6/2/2018', genre: 'Comedy' }, { id: '4', title: 'Movie 4', releaseDate: '7/29/2018', genre: 'Sci-Fi' }, { id: '5', title: 'Movie 5', releaseDate: '6/30/2018', genre: 'Drama' }, ] } As you can see, Factories let us rapidly generate different scenarios for our dynamic server data. Attribute overrides Factories are great for defining the \"base case\" of your models, but there's plenty of times where you'll want to override attributes from your factory with specific values. The last argument to create and createList accepts a POJO of attributes that will override anything from your factory. // Using only the base factory server.create('movie'); // gives us this object: { id: '1', title: 'Movie 1', releaseDate: '01/01/2000' } // Passing in specific values to override certain attributes server.create('movie', { title: 'Interstellar' }); // gives us this object: { id: '2', title: 'Interstellar', releaseDate: '01/01/2000' } Think of your factory attributes as a reasonable \"base case\" for your models, and then override them in development and testing scenarios as you have need for specific values. Dependent attributes Attributes can depend on other attributes via this from within a function. This can be useful for quickly generating things like usernames from names: // mirage/factories/user.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ name() { return faker.name.findName(); }, username() { return this.name.replace(' ', '').toLowerCase(); } }); Calling server.createList('user', 3) with this factory would generate this data: [ { id: '1', name: 'Retha Donnelly', username: 'rethadonnelly' } { id: '2', name: 'Crystal Schaefer', username: 'crystalschaefer' } { id: '3', name: 'Jerome Schoen', username: 'jeromeschoen' } ] Relationships In the same way that you use the ORM to create relational data, as this example from the Creating and editing related data section of the illustrates let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', }); you can also create relational data with your factories: let nolan = server.create('director', { name: 'Christopher Nolan' }); server.create('movie', { director: nolan, title: 'Interstellar' }); nolan is a model instance, which is why we can just pass it in as an attribute override when creating the Interstellar movie. This also works when using createList: server.create('actor', { movies: server.createList('movie', 3) }); In this way you use factories to help you quickly create graphs of relational data: server.createList('user', 5).forEach(user => { server.createList('post', 10, { user }).forEach(post => { server.createList('comment', 5, { post }); }); }); This code generates 5 users, each of which has 10 posts with each post having 5 comments. Assuming these relationships are defined in your models, all the foreign keys would be set correctly in Mirage's database. The afterCreate hook In many cases, setting up relationships manually (as shown in the previous section) is perfectly fine. However there are times where it makes more sense to have base case relationships set up for you automatically. Enter afterCreate. It's a hook that's called after a model has been created using the factory's base attributes. This hook lets you perform additional logic on your newly-created models before they're returned from create and createList. Let's see how it works. Say you have these two models in your app: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ post: belongsTo() }); Let's further suppose that in your app, it is never valid to create a post without an associated user. You can use afterCreate to enforce this behavior: // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { post.update({ user: server.create('user') }); } }); The first argument to afterCreate is the object that was just created (in this case the post), and the second is a reference to the Mirage server instance, so that you can invoke other factories or inspect any other server state needed to customize your newly-created object. In this example we're immediately creating a user for this post. That way elsewhere in your app (say a test), you could just create a post server.create('post'); and you'd be working with a valid record, since that post would have an associated user. Now, there's one problem with the way we've implemented this so far. Our afterCreate hook updates the post's user regardless if that post already had a user associated with it. That means that this code let tomster = server.create('user', 'Tomster'); server.createList('post', 10, { user: tomster }); would not work as we expect, since the attribute overrides while the object is being created, but the logic in afterCreate runs after the post has been created. Thus, this post would be associated with the newly created post from the hook, rather than Tomster. To fix this, we can update our afterCreate hook to first check if the newly created post already has a user associated with it. Only if it doesn't will we create a new one and update the relationship. // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); Now callers can pass in specific users server.createList('post', 10, { user: tomster }); or omit specifying a user if the details of that user aren't important server.create('post'); and in both cases they'll end up with a valid record. afterCreate can also be used to create hasMany associations, as well as apply any other relevant creation logic. Traits Traits are an important feature of factories that make it easy to group related attributes. Define them by importing trait and adding a new key to your factory. For example, here we define a trait named published on our post factory: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }) }); You can pass anything into trait that you can into the base factory. We can use our new trait by passing in the name of the trait as a string argument to create or createList: server.create('post', 'published'); server.createList('post', 3, 'published'); The created posts will have all the base attributes, as well as everything under the published trait. You can also compose multiple traits together: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }), official: trait({ isOfficial: true }) }); We can pass our new traits into create or createList in any order: let officialPost = server.create('post', 'official'); let officialPublishedPost = server.create('post', 'official', 'published'); If multiple traits set the same attribute, the last trait wins. As always, you can pass in an object of attribute overrides as the last argument: server.create('post', 'published', { title: 'My first post' }); When combined with the afterCreate() hook, traits simplify the process of setting up related object graphs. Here we define a withComments trait that creates 3 comments for a newly created post: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', withComments: trait({ afterCreate(post, server) { server.createList('comment', 3, { post }); } }) }); We can use this trait to quickly make 10 posts with 3 comments each: server.createList('post', 10, 'withComments'); Combining traits with the afterCreate hook is one of the most powerful features of Mirage factories. Effective use of this technique will dramatically simplify the process of creating different graphs of relational data for your app. The association helper The association() helper provides some sugar for creating belongsTo relationships. As we saw earlier, given a Post that belongsTo a User, we were able to use the afterCreate hook to pre-wire that relationship: // mirage/factories/post.js import { Factory } from 'miragejs'; export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); The association() helper effectively replaces this code: // mirage/factories/post.js import { Factory, association } from 'miragejs'; export default Factory.extend({ user: association() }); This should help reduce some of the boilerplate in your factory definitions. You can also use association() within traits // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association() }) }); and it also accepts additional traits and overrides for the related model's factory: // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association('admin', { role: 'editor' }) }) }); There is no equivalent helper for hasMany relationships, so you can continue to use the afterCreate hook to seed those relationships. Using factories In development To use your factories to seed your development database, call server.create and server.createList in your scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); } There's no explicit API for switching scenarios in development, but you can just use JavaScript modules to split things up. For example, you could create a new file for each scenario that contains some seeding logic // mirage/scenarios/admin.js export default function(server) { server.create('user', { isAdmin: true }); } ...export all scenarios as an object from an index.js file // mirage/scenarios/index.js import anonymous from './anonymous'; import subscriber from './subscriber'; import admin from './admin'; export default scenarios = { anonymous, subscriber, admin } ...and then import that object into default.js. Now you can quickly switch your development state by changing a single variable: // mirage/scenarios/default.js import scenarios from './index'; // Choose one const state = // 'anonymous' // 'subscriber' 'admin' ; export default function(server) { scenarios[state](server); } This can be handy while developing your app or sharing the different states of a new feature with your team. In testing When running your app in the test environment, your entire Mirage server is loaded, except for your scenarios/default.js file. That means each test starts out with a clean database, giving you the opportunity to set up only the state needed for that test. It also keeps your development scenarios isolated from your tests, so that you don't inadvertently break your test suite while tweaking your development scenario. To seed Mirage's database within a test, use this.server to access the create and createList methods: test('I can see the movies on the homepage', async function(assert) { this.server.createList('movie', 5); await visit('/'); assert.dom('li.movie').exists({ length: 5 }); }); In this test, we start our Mirage server out with 5 movies. Then we boot up the Ember app and visit the / route, and finally assert that those movies show up in our UI. When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. You can read more about testing with Mirage in the section of these guides. Factory best practices In general, it's best to define a model's base factory using only the attributes and relationships that comprise the minimal valid state for that model. You can then use afterCreate and traits to define other common states that contain valid, related changes on top of the base case. This advice goes a long way towards keeping your test suite maintainable. If you don't use traits and afterCreate, your tests will become bogged down in irrelevant details related to setting up the data needed for that test. test('I can see the title of a post', async function(assert) { let session = server.create('session'); let user = server.create('user', { session }); server.create('post', { user, title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); This test is only concerned with asserting the title of a post gets rendered to the screen, but it has lots of boilerplate code that's only there to get the post in a valid state. If we used afterCreate instead, the developer writing this test could simply create a post with a specified title and slug, since those are the only details relevant to the test: test('I can see the title of a post', async function(assert) { server.create('post', { title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); afterCreate could take care of setting up the session and user in valid states, and associating the user with the post, so that the test can stay concise and focused on what it's actually testing. Effective use of traits and afterCreate keeps your test suite less brittle and more robust to changes in your data layer, since tests only declare the bare minimum setup logic needed to verify their assertions. Up next, we'll take a look at how to use Fixtures as an alternative way to seed your database. ","route":"docs.data-layer.factories","keywords":[]},"template:docs/data-layer/fixtures":{"id":"template:docs/data-layer/fixtures","type":"template","title":"Fixtures","text":" Fixtures Mirage also lets you use flat fixture files to seed your database with data. In general, we recommend using factories for most situations, since they tend to keep your mock data more maintainable. But there are certainly times where fixture data makes sense. Fixtures are nothing more than a conventional file-based way to accomplish the following: // mirage/scenarios/default.js export default function(server) { server.db.loadData({ countries: [ { id: 1, name: 'China' }, { id: 2, name: 'India' }, { id: 3, name: 'United States' } ] }); } Let's see how we can do the same thing using fixtures. Basic usage We'll start by generating a fixture file for our Country model: ember g mirage-fixture countries Fixture filenames should be the dasherized plural form of the model class. We can now add some data to our fixture file: // mirage/fixtures/countries.js export default [ { id: 1, name: 'China', largestCity: 'Shanghai' }, { id: 2, name: 'India', largestCity: 'Mumbai' }, { id: 3, name: 'United States', largestCity: 'New York City' }, { id: 4, name: 'Indonesia', largestCity: 'Jakarta' }, { id: 5, name: 'Pakistan', largestCity: 'Karachi' }, { id: 6, name: 'Brazil', largestCity: 'São Paulo' }, { id: 7, name: 'Nigeria', largestCity: 'Lagos' }, { id: 8, name: 'Bangladesh', largestCity: 'Dhaka' }, { id: 9, name: 'Russia', largestCity: 'Moscow' }, { id: 10, name: 'Mexico', largestCity: 'Mexico City' }, ]; Because this data will be read directly into Mirage's database, we want to use camelCase for all multi-word attributes. (Mirage uses the camelCasing convention to avoid configuration for things like identifying foreign keys.) Don't worry if your production API format doesn't use camelCase. We'll be able to customize Mirage's API format in the Serializer layer. To load our new fixture file into the database during development, we can call server.loadFixtures in our scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.loadFixtures(); } If we have multiple fixtures defined, server.loadFixtures() will load every file. You can load files selectively by passing in an argument list of fixture names to loadFixtures: // mirage/scenarios/default.js export default function(server) { server.loadFixtures('countries', 'cities'); // only load the countries and cities fixtures } Just like with factories, fixtures will be ignored during tests. If you want to load fixture data in a test, you can call this.server.loadFixtures: test('I can see the countries', async function(assert) { this.server.loadFixtures('countries'); await visit('/'); assert.dom('option.country').exists({ length: 100 }); }); Relationships There's no special API for creating relationships using fixtures – you just need to understand how Mirage uses foreign keys to wire up relationships. Let's say we had these models: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); Using the ORM we can create two related models: let chris = schema.users.create({ name: 'Chris Garrett' }); schema.posts.create({ author: chris, title: 'Coming Soon in Ember Octane' }); If we take a look at Mirage's database after this, we'll see this data: // server.db.dump() { users: [ { id: '1', name: 'Chris Garrett' } ], posts: [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ] } As you can see, Mirage added an authorId foreign key to the post. The convention for belongsTo foreign keys is `${relationshipName}Id` In this case, a post gets an authorId, even though that relationship points to a User model. The relationship name is always used rather than the model name, because models can have multiple relationships that point to the same type of model. Looking at the database dump above, if you wanted to recreate the same relationship graph using only fixture files, your files would look something like this: // mirage/fixtures/users.js export default [ { id: '1', name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; Once these fixtures are loaded into Mirage, all the ORM methods, Shorthands and Serializers would work as expected. If this happens to be a bi-directional relationship // mirage/models/user.js export default Model.extend({ + posts: hasMany() }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); then Mirage will add an array of foreign keys on the new hasMany association: // mirage/fixtures/users.js export default [ { id: '1', postIds: [ '1' ], name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; The convention for hasMany relationship foreign keys is `${singularize(relationshipName)}Ids` All associations have their own keys, because Mirage supports arbitrary one-way relationships. If two associations are inverses of each other, as in the above case, Mirage will keep the keys on each model in sync provided you use the ORM methods. As you can see, maintaining foreign keys and keeping them in sync across fixture files can get a little messy, which is why Mirage recommends using factories for most of your data creation. Still, fixtures can be quite useful in certain situations, so they're a good tool to have in your toolbox. ","route":"docs.data-layer.fixtures","keywords":[]},"template:docs/data-layer/models":{"id":"template:docs/data-layer/models","type":"template","title":"Models","text":" Models To take advantage of the ORM, Mirage needs to know about your application's models and their relationships. This section will teach you how to define and work with your models, and the next will discuss relationships. Note that if your Ember application uses Ember Data, Mirage will automatically discover your models and their relationships, so you don’t need to define any files within Mirage yourself. As a clarifying point, Mirage model instances only exist within Mirage's server, and are never shared directly with your Ember app or rendered directly in components. They exist solely to help you manage the data and relationships in your fake backend, but are serialized as a JSON string before they are sent over to your Ember app. Defining models To define a model, you can use the generator: ember g mirage-model blog-post This creates a file under /mirage/models: // mirage/models/blog-post.js import { Model } from 'miragejs'; export default Model; Creating models To create models, access the model's collection via the schema object, which is available in your route handlers: this.post('/blog-posts', function(schema) { let attrs = this.normalizedRequestAttrs(); schema.blogPosts.create(attrs); }); or as server.schema directly off of your Mirage server instance: // scenarios/default.js export default function(server) { server.schema.blogPosts.create({ title: 'Lorem ipsum' }); } Note that the collection is the pluralized form of the model's model name (the models/blog-post.js definition from above creates a schema.blogPosts collection). Outside of route handlers, you'll typically create models using Factories via server.create // scenarios/default.js export default function(server) { server.create('blog-post'); } which delegates to the collection's create method under the hood. We'll talk more about creating data using Factories later in these guides. Accessing models To access your models, use the various query methods from the model's collection. For example, use all() to return all known models: this.get('/blog-posts', (schema, request) => { return schema.blogPosts.all(); }); Here are some other common query methods: schema.blogPosts.find(1); schema.blogPosts.first(); schema.blogPosts.where({ isPublished: true }); schema.blogPosts.findBy({ title: 'Introduction' }); Check out the to see all available query methods. Updating and deleting models Once you're working with an instance of a model, there are other properties and methods you'll have access to. For example, you can update a model: let post = schema.blogPosts.find(1); post.update({ author: 'Obi-Wan' }); or delete one: let post = schema.blogPosts.find(2); post.destroy(); View the to see all the available fields and methods for model instances. Once your Models have been defined, the next step is to define the relationships between them, so you can really start to leverage the power of Mirage's ORM. Let's talk about how to do that next. ","route":"docs.data-layer.models","keywords":[]},"template:docs/data-layer/orm":{"id":"template:docs/data-layer/orm","type":"template","title":"Why an ORM?","text":" Why an ORM? Mirage originally shipped with just a database as its data layer. While helpful, users still had to write a lot of code to reproduce their modern, complex backends. In particular, dealing with relationships was a big pain point. The solution was to add an Object Relational Mapper, or ORM, to Mirage. Let's see how an ORM allows Mirage to do more of the heavy lifting for you. Motivation Consider a database that looks like this: db.dump(); // Result { movies: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] } The first problem you'll encounter when writing a route handler is how to transform this raw data into the format your Ember app expects – that is, how to match the format of your production API. Let's say your backend uses the JSON:API spec. Your response to a GET request for /api/movies/1 should look something like this: // GET /api/movies/1 { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' } } } Not a huge deal – we could just write this formatting logic directly in our route handler: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); return { data: { id: movie.id, type: 'movies', attributes: { title: movie.title } } }; }); This works. But let's say our Movie model had a few more attributes: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } Now our route handler needs to be more clever, and make sure all properties other than id end up in the attributes hash: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); let movieJSON = { data: { id: movie.id, type: 'movies', attributes: { } } }; Object.keys(movie) .filter(key => key !=== 'id') .forEach(key => { movieJSON[key] = movie[key]; }); return movieJSON; }); As you can see, things get complicated pretty fast. What if we add relationships to the mix? Let's say a Movie has a relationship to a director, and it stores that relationship using a directorId foreign key: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '23' } The expected HTTP response for this model now looks like this { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' }, relationships: { directors: { data: { type: 'people', id: '23' } } } } } meaning our route handlers need to get even more complex. In particular, they need a robust way to differentiate between a model's attributes (like title) and its relationship keys (like directorId). These sorts of problems turn out to be common enough that we can solve them generally, provided Mirage is aware of your application's models and their relationships. Problems solved by the ORM When Mirage knows about your application's domain, it can shoulder the responsibility for the low-level bookkeeping work needed to properly implement your mock server. Let's take a look at some examples of how it does this. Separation of formatting logic To start, we can tell Mirage about our application's schema by defining Mirage models. These models get registered with the ORM and tell Mirage about the shape of your data. Let's define a Movie model. // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Mirage models are schemaless in attributes, in that they don't require you to define plain attributes like title and releaseDate. So, the above model definition works regardless of what attributes your Movie model has. If you're using Ember Data, Mirage's ORM will automatically register your Ember Data models for you at run time, so you don't have to duplicate your domain information in two places. With the Movie model defined, we can update our route handler to use the ORM to respond with a Mirage model instance: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); The schema argument is how you interact with the ORM. By returning an instance of a Mirage model from a route handler instead of a plain JavaScript object, we can now take advantage of Mirage's Serializer layer. Serializers work by turning Models and Collections into formatted JSON responses. Mirage ships with a JSONAPISerializer out of the box, so assuming it's defined as your Application serializer // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); this route handler will now respond with the payload we expect: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } } } The ORM is already helping us keep our route handlers tidy by delegating the work of transforming our models into JSON to the Serializer layer. But it gets even more powerful when we add relationships to the mix. Fetching related data Let's say our Movie has a belongs-to relationship with a director: // mirage/models/movie.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ director: belongsTo('person') }); The director is an instance of a Person model: // mirage/models/person.js import { Model } from 'miragejs'; export default Model.extend({ }); Again, if you're using Ember Data, both the models and relationships will be automatically generated for you. No need to create this file. Without changing anything about our route handler or serializer, we can now fetch a graph of data by using JSON:API includes. The following request GET /api/movies/1?include=director will now generate this response: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }, relationships: { director: { data: { type: 'people', id: '1' } } } }, included: [ { id: '1', type: 'people', attributes: { name: 'Christopher Nolan' } } ] } The JSONAPISerializer is able to inspect the ORM so that it can put all models, attributes and relationships in the right place. Our route handler doesn't need to change at all. In fact, the route handler we wrote is the same as the default behavior of the Shorthand, meaning we can just switch to using that: - this.get('/movies/:id', (schema, request) => { - let id = request.params.id; - return schema.movies.find(id); - }); + this.get('/movies/:id'); This is another example of how the ORM helps various parts of Mirage, like Shorthands and Serializers, work together to simplify your server definition. Creating and editing related data The ORM also makes creating and editing related data easier than if you only worked with the raw database records. For instance, to create a Movie and Person with a relationship using only the database, you'd need to do something like this: server.db.loadData({ people: [ { id: '1', name: 'Christopher Nolan' } ], movies: [ { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '1' } ] }); Note the directorId foreign key on the Movies record must match the id on the associated People record. Managing raw database data like this quickly gets unwieldy, especially as relationships change over time. Using the ORM via server.schema, we can create this graph without managing any IDs: let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }); Passing in the model instance nolan as the director attribute when creating the movie is enough for all the keys to be properly set up. The ORM also keeps foreign keys in sync as relationships are edited. Given the database { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '2' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } we could update the movie's director like this: let episode9 = schema.movies.findBy({ title: 'Star Wars: The Rise of Skywalker' }); episode9.update({ director: schema.people.findBy({ name: 'J.J. Abrams' }); }); The new database would look like this: { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '3' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } Note how the directorId was changed in the database, even though we only ever worked with model instances. Importantly, this also holds true for more complex relationships, like one-to-many or many-to-many relationships that have an inverse. The ORM allows Mirage to abstract all this bookkeeping away from your code, and even gives Shorthands enough power to respect arbitrary updates to complex relationship graphs. These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's schema, it can take on more of the responsibility of configuring your mock server. Next, we'll take a look at how to actually define your models and their relationships in Mirage. ","route":"docs.data-layer.orm","keywords":[]},"template:docs/data-layer/relationships":{"id":"template:docs/data-layer/relationships","type":"template","title":"Relationships","text":" Relationships Once you've defined your models, you can define relationships between them using the belongsTo and hasMany helpers. Each helper adds some dynamic methods to your model. Just as another reminder, if you use Ember Data and have models and relationships defined there, you don't need to define any relationships within your Mirage folder, as those will be automatically discovered and set up for you. belongsTo To define a to-one relationship, import the belongsTo helper and define a new property on a model that points to another model: // mirage/models/blog-post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); This defines a belongsTo relationship to an Author model. The belongsTo helper adds several new properties and methods to your models. In this case, our blog-post model would now have an authorId property, as well as some methods for working with the associated author model: blogPost.authorId; // 1 blogPost.authorId = 2; // updates the relationship blogPost.author; // Author instance blogPost.author = anotherAuthor; blogPost.newAuthor(attrs); // new unsaved author blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) Note that when a child calls child.createParent, the new parent is immediately saved to the db, but the child's foreign key is updated on this instance only, and is not immediately persisted to the database. In other words, blogPost.createAuthor will create a new author record, insert it into the db, and update the blogPost.authorId in memory, but if you were to fetch the blogPost from the db again, the relationship would not be persisted. To persist the new foreign key, you would call blogPost.save() after creating the new author. hasMany To define a to-many relationship, use the hasMany helper: // mirage/models/blog-post.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ comments: hasMany() }); This helper adds a commentIds property to the blogPost model, as well as some methods for working with the associated comments collection: blogPost.commentIds; // [1, 2, 3] blogPost.commentIds = [2, 3]; // updates the relationship blogPost.comments; // array of related comments blogPost.comments = [comment1, comment2]; // updates the relationship blogPost.newComment(attrs); // new unsaved comment blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) Association options modelName If your associations model has a different name than the association itself, you can specify the modelName on the association. For example, // mirage/models/blog-post.js import { Model, belongsTo, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo(\"user\"), comments: hasMany(\"annotation\") }); would add all the named author and comment methods as listed above, but use user and annotation models for the actual relationships. inverse Often, relationships can be inverses of each other. For example, say we had the following two models: // blog-post.js export default Model.extend({ comments: hasMany() }); // comment.js export default Model.extend({ blogPost: belongsTo() }); In this case, blogPost.comments would point to a collection of Comment models, and each one of those Comment models would have a comment.blogPost relationship that pointed back to the original post. Mirage will often be able to infer that two relationships on two different models are inverses of each other, but sometimes you'll need to be explicit. This typically happens if a model has two relationships that point to the same model type. For example, suppose we had the following schema: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\"), reviewer: belongsTo(\"user\") }); In this case, Mirage doesn't know which relationship (blogPost.author or blogPost.reviewer) should by synchronized with the parent's user.blogPosts collection. So, you can specify which one by using the inverse option: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\", { inverse: \"blogPosts\" }), reviewer: belongsTo(\"user\", { inverse: null }) }); Now, if a blog post is added to user.blogPosts, that post's author will be correctly set. polymorphic You can specify whether an association is a polymorphic association by passing { polymorphic: true } as an option. For example, say you have a Comment that can belong to a BlogPost or a Picture. Here's how the model definitions would look: // app/models/comment.js export default Model.extend({ commentable: belongsTo({ polymorphic: true }) }); // app/models/blog-post.js export default Model.extend({ comments: hasMany() }); // app/models/picture.js export default Model.extend({ comments: hasMany() }); Note that commentable doesn't need a type (there's no validation done on which types of models can exist on that association). Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. let comment = schema.comments.create({ text: \"foo\" }); comment.buildCommentable(\"post\", { title: \"Lorem Ipsum\" }); comment.createCommentable(\"post\", { title: \"Lorem Ipsum\" }); // getter comment.commentableId; // { id: 1, type: 'blog-post' } // setter comment.commentableId = { id: 2, type: \"picture\" }; Has-many asssociations can also be polymorphic: // app/models/user.js export default Model.extend({ things: hasMany({ polymorphic: true }) }); // app/models/car.js export default Model.extend({ }); // app/models/watch.js export default Model.extend({ }); let user = schema.users.create({ name: \"Sam\" }); user.buildThing('car', { attrs }); user.createThing('watch', { attrs }); // getter user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] // setter user.thingIds = [ { id: 2, type: 'watch' }, ... ]; Be sure to check out the , and API docs to learn about all the available ORM methods. We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. Next, let's take a look at Factories, which leverage your new Model and Relationship definitions to make it easy to create graphs of relational data. ","route":"docs.data-layer.relationships","keywords":[]},"template:docs/data-layer/serializers/ember-data-serializer":{"id":"template:docs/data-layer/serializers/ember-data-serializer","type":"template","title":null,"text":"The EmberDataSerializer extends the RestSerializer with the added functionality ofprimaryKey and attrs (renamed transforms as attrs was already in use by Mirage) properties. These properties work the same as the properties provided. Primary Key This serializer provides for a property primaryKey that works the same as the primaryKey property on an ember data serializer. By default this property will be id but if you assign a different value, that value will be used in the JSON instead of id. This means that if you are using the primaryKey property on your ember data serializer, using the same property on the mirage serializer will perform the same function. If you were using the RestSerializer you would need to override the serialize and normalize functions to do the transform yourself. Using EmberDataSerializer you can let the serializer perform this transformation for you. To be clear, when data is received by Mirage, this will take the value of addressId from the JSON and use it as the id for the Mirage model. When Mirage serializers it's model into JSON, it will use the value for the id property and assign it to the property addressId. import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ primaryKey: \"addressId\" }); Transforms Transforms provides the same function as attrs for the ember data serializers however this transformation is happening on the server side for Mirage. This allows your mirage models to look more like your actual server models. Example of a Mirage serializer extending from EmberDataSerializer import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ transforms: { name: \"externalName\", address: {key: \"addressId\", serialize: \"ids\"}, age: {key: \"externalAge\"}, blogPosts: {key: \"blogPostIds\"} } }); If you would like Mirage to apply the transforms from your ember data serializers for you see . ","route":"docs.data-layer.serializers.ember-data-serializer","keywords":[]},"template:docs/data-layer/serializers/index":{"id":"template:docs/data-layer/serializers/index","type":"template","title":"Serializers","text":" Serializers A serializer is an object responsible for transforming a Model or Collection that's returned from your route handlers this.get('movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); into a formatted JSON payload // GET /movies/1 { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' } } } suitable for consumption by your Ember app. Serializers are the last main part of Mirage's architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models. Let's see how they work. Choosing which serializer to use The first step in working with Mirage's serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app. The JSON payload above is an example of an API that follows the JSON:API spec. You'll see it used a lot in the Ember ecosystem, because it's the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined. If you are starting a new app, it's recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don't use JSON:API. If your app does use JSON:API, Mirage ships with a JSONAPISerializer that will do the heavy lifting for you. Mirage also ships with two other named serializers, ActiveModelSerializer and RestSerializer, that match two other popular backend formats. EmberDataSerializer is also provided as a variation to the RestSerializer that uses the primaryKey and attrs defined in your applications ember data serializers, similar to how models are auto discovered. See the section on for more information. If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. Defining serializers Once you've selected the appropriate serializer, define your default application-wide serializer by exporting it from /mirage/serializers/application.js: // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); This specifies the serializer to use for each Model and Collection in your system. If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer. Let's use Mirage's generator to create a Movie serializer: ember g mirage-serializer movie This creates the file import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ }); which follows the best practice of model-specific serializers extending from your Application serializer. You can now customize the behavior of how Movie models and collections are serialized into JSON. Customizing serializers When it comes to customizing your application's serializers, you'll mostly be tweaking Mirage's defaults. For example, if your Ember app expects attribute names to be PascalCase // GET /movies/1 { Id: '1', ReleaseDate: 'Interstellar' } you might override the Serializer's keyForAttribute method: import { Serializer } from 'miragejs'; import { classify } from '@ember/string'; export default Serializer.extend({ keyForAttribute(attr) { return classify(attr); } }); See the API docs for each serializer to learn more about all the customization hooks available. Relationships Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships. For example, the JSONAPISerializer respects query param includes GET /movies/1?include=cast-members out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes. There's an option on JSONAPISerializer that enables this: import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); Now, a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { data: [ { type: 'people', id: '1' }, { type: 'people', id: '2' }, { type: 'people', id: '3' }, ] } } } } The Ember app could now use these ids to subsequently fetch the related cast members. Other times, an Ember app expects to get a link to fetch related data. The JSONAPISerializer also has a hook for this: // mirage/serializers/movie.js import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ links(movie) { return { 'cast-members': { related: `/api/movies/${movie.id}/cast-members` } }; } }); Now a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { links: { related: `/api/movies/1/cast-members` } } } } } The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details. Working with serialized JSON While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler. You can use the this.serialize helper method to do this - make sure to use a function instead of a fat arrow so you have access to the correct this: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta.size = movies.length; return json; }); The serialize helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer. You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies, 'movie-with-relationship'); json.meta.size = movies.length; return json; }); This route handler would use the mirage/serializers/movie-with-relationship.js serializer to transform the collection of movies into a json payload, which is then modified and then finally returned from the route handler. In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn't adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models. The more conventional your backend API is, the less code you'll need to write – not only in Mirage, but also in other parts of your Ember application! Be sure to check out the and docs to learn about all the hooks available to customize your serializer layer. Now that we've covered the ins and outs of Mirage's data layer, we're ready to see how we can use Mirage to effectively test our Ember application. ","route":"docs.data-layer.serializers.index","keywords":[]},"module:ember-cli-mirage/ember-data":{"id":"module:ember-cli-mirage/ember-data","type":"module","title":"ember-cli-mirage/ember-data","keywords":["discoverEmberDataModels","applyEmberDataSerializers"],"item":{"type":"module","id":"ember-cli-mirage/ember-data","attributes":{"file":"ember-cli-mirage/ember-data","functions":[{"name":"discoverEmberDataModels","description":"

Get all mirage models for each of the ember-data models

\n
","lineNumber":65,"access":"public","tags":[{"name":"method","value":"discoverEmberDataModels"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"models","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"},{"name":"applyEmberDataSerializers","description":"

Generate mirage serializers for each of the ember-data serializers\nif a mirage serializer already exists, apply the ember-data transforms

\n
","lineNumber":158,"access":"public","tags":[{"name":"method","value":"applyEmberDataSerializers"}],"file":"ember-cli-mirage/ember-data","returns":{"type":"Object","description":"serializers","properties":[]},"params":[],"isAsync":false,"isGenerator":false,"exportType":"named"}],"variables":[]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}}},"module:ember-cli-mirage/serializers/ember-data-serializer":{"id":"module:ember-cli-mirage/serializers/ember-data-serializer","type":"module","title":"ember-cli-mirage/serializers/ember-data-serializer","keywords":["EmberDataSerializer"],"item":{"type":"module","id":"ember-cli-mirage/serializers/ember-data-serializer","attributes":{"file":"ember-cli-mirage/serializers/ember-data-serializer","functions":[],"variables":[{"name":"EmberDataSerializer","description":"

This serializer does not use following mirage properties to control how things are serialized

\n
attrs - see `serialize` on the transform property\nembed - see `serialize` on the transform property\nserializeIds - see serialize on the transform property\n
\n

The above configuration was applied to every property on the serializer, whereas the transforms allows you\nto specify a value for each property or relation.

\n

This serializer uses a property transforms that follows the Ember Data serializer format of attrs to specify the\nserialization (attrs is already in use by mirageJs).

\n

The startMirage has been modified to also generate serializers from the Ember Data serializers supporting\nthe key and the serialize/deserialize properties with the value of (true/ids/records). If a serializer is\nalready present in the mirage directory, the transforms will be added to it. If that serializer is not\na serializer of this type, there will be no effect. Ensure that your serializers and/or the application\nserializer in the mirage directory is a type of this serializer

\n
","lineNumber":32,"access":"public","tags":[{"name":"constructor","value":""}],"file":"ember-cli-mirage/serializers/ember-data-serializer","type":"any","exportType":"default"}]},"relationships":{"classes":{"data":[]},"components":{"data":[]}}}},"template:docs/getting-started/installation":{"id":"template:docs/getting-started/installation","type":"template","title":"Installation","text":" Installation To install Mirage, run ember install ember-cli-mirage Ember should install the addon and add a /mirage directory to the root of your project. Ember-cli-mirage depends on MirageJS as a peer dependency and will add it to your applications package.json. Check out the if you're coming from a previous version of Mirage. Note for Embroider users Embroider does not recognizes changes to Ember CLI Mirage configuration in mirage/ folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in EMBROIDER_REBUILD_ADDONS environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following: EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s Note for Prettier users There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you're using Prettier and install Mirage, you can either pin eslint-plugin-prettier to 2.6.0, or add the following to .eslintignore: /mirage/mirage Note for FastBoot users You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. FastBoot support is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. You can always bypass FastBoot page generation locally by running FASTBOOT_DISABLED=true ember serve Mirage will then run in the browser as expected, and you can develop your client app as normal. ","route":"docs.getting-started.installation","keywords":[]},"template:docs/getting-started/overview":{"id":"template:docs/getting-started/overview","type":"template","title":"Overview","text":" Overview The file mirage/config.js contains the boilerplate code to create a mirage server. You can customize the server that is created here by following the mirage documentation https://miragejs.com/docs/getting-started/overview/ Mirage lets you simulate API responses by writing route handlers. The simplest example of a route handler is a function that returns an object: // mirage/config.js function routes() { this.namespace = 'api'; this.get('/movies', () => { return { data: [ { id: 1, type: 'movies', attributes: { name: 'Interstellar' } }, { id: 2, type: 'movies', attributes: { name: 'Inception' } }, { id: 3, type: 'movies', attributes: { name: 'Dunkirk' } }, ] }; }); } Now whenever your Ember app makes a GET request to /api/movies, Mirage will respond with this data. Dynamic data This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: They're inflexible. What if you want to change the data for this route in your tests? They contain formatting logic. Logic that's concerned with the shape of your JSON payload (e.g. the data and attributes keys) is now duplicated across all your route handlers. They're too basic. Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. Mirage provides a data layer that lets you write more powerful server implementations. Let's see how it works by replacing our basic stub data above. Creating a model First, we'll need to tell Mirage that we have a dynamic Movie model. If you're using Ember Data and you already have a Movie model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won't have any files in the mirage/models directory. If you're not using Ember Data, you can use the mirage-model generator to create a model from the command line: $ ember g mirage-model movie This generates the following file: // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Writing a dynamic route handler Models let our route handlers take advantage of Mirage's in-memory database. The database makes our route handlers dynamic, so we can change the data that's returned without having to rewrite the handler. Let's update our route handler to be dynamic: this.get('/movies', (schema, request) => { return schema.movies.all(); }); The schema argument lets us access our new Movie model. This route will now respond with all the authors in Mirage's database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage's database, instead of having to write a different version of the handler for each scenario we want to simulate. Seeding the database Right now, if we sent a request to our new handler above, the response would look something like this: // GET /api/movies data: [ ] That's because Mirage's database is empty. To actually seed our database with fake data, we'll use factories. Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models. Let's create a factory for our author with $ ember g mirage-factory movie We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; // Movie 1, Movie 2, etc. }, year() { let min = 1950; let max = 2019; return Math.floor(Math.random() * (max - min + 1)) + min; }, rating: \"PG-13\" }); This factory creates objects like [ { title: 'Movie 1', year: 1992, rating: \"PG-13\" }, { title: 'Movie 2', year: 2008, rating: \"PG-13\" }, // ... ] and so on, which will automatically be inserted into the movies database table. The database will assign each record an id, and now we can interact with this data in our route handlers. To actually use our new factory definition, we can call the server.create and server.createList methods. To seed our development database, use the function in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); }; Now when our Ember app makes a GET request to /api/movies using the route handler above, we'll see something that looks like this: // GET /api/movies data: [ { id: 1, type: \"movies\", attributes: { title: \"Movie 1\", year: 1992, rating: \"PG-13\" } }, { id: 2, type: \"movies\", attributes: { title: \"Movie 2\", year: 2008, rating: \"PG-13\" } }, // ... ] As we can see, this response is now influenced by the run-time state of our database. In acceptance tests, scenarios/default.js is ignored, and instead you can use this.server to setup your database in the state needed for the test: // tests/acceptance/movies-test.js import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test(\"I can view the movies\", async function(assert) { this.server.createList(\"movie\", 3); await visit(\"/home\"); assert.dom(\"[data-test-id='movie-row']\").exists({ count: 3 }); }); }); You can also pass attribute overrides directly to create or createList: test(\"I can view the movie title\", async function(assert) { let movie = this.server.create('movie', { title: \"Interstellar\" }); await visit(`/movies/${movie.id}`); assert.dom('h1').includesText(\"Interstellar\"); }); You now have a simple way to set up your Mirage server's initial data, both during development and on a per-test basis. Associations Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean. Let's say your movie has many cast-members. You can declare this relationship in your model: // mirage/models/movie.js import { Model, hasMany } from 'miragejs'; export default Model.extend({ castMembers: hasMany() }); // mirage/models/cast-member.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ movie: belongsTo() }); Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: this.get('/movies/:id/cast-members', (schema, request) => { let movie = schema.movies.find(request.params.id); return movie.castMembers; }); and when creating graphs of related data: test(\"I can see a movie's cast members\", async function(assert) { server.create('movie', { title: 'Interstellar', castMembers: [ server.create('cast-member', { name: 'Matthew McConaughey' }), server.create('cast-member', { name: 'Anne Hathaway' }), server.create('cast-member', { name: 'Jessica Chastain' }) ] }); await visit('/'); assert.dom('li.cast-member').exists({ count: 3 }); }); Mirage uses foreign keys to keep track of these related models for you, so you don't have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage's database. Serializers Mirage is designed for you to be able to completely replicate your production server. So far, we've seen that Mirage's default payloads are formatted using the JSON:API spec. This spec produces payloads that look like this: // GET /movies/1 { data: { id: 1, type: 'movies', attributes: { title: 'Interstellar' } } } New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API. For example, your API responses might look more like this: // GET /movies/1 { movies: { id: 1, title: 'Interstellar' } } This is why Mirage serializers exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup. Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend: // mirage/serializers/application.js import { Serializer } from 'miragejs'; export default Serializer.extend({ keyForAttribute(attr) { return dasherize(attr); }, keyForRelationship(attr) { return dasherize(attr); } }); Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data: // mirage/serializers/movie.js import { Serializer } from 'miragejs'; export default Serializer.extend({ include: [ 'crewMembers' ] }); // mirage/config.js function routes() { this.get('/movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); } With the above config, a GET to /movies/1 would return automatically include related crew members: { movie: { id: 1, title: 'Interstellar' }, 'crew-members': [ { id: 1, 'movie-id': 1, name: 'Matthew McConaughey' }, { id: 1, 'movie-id': 1, name: 'Anne Hathaway' }, ... ] } Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the serializer guide to learn more. Shorthands Mirage has shorthands to reduce the code needed for conventional API routes. For example, the route handler this.get('/authors', (schema, request) => { return schema.authors.all(); }); can be written as this.get('/authors'); There are also shorthands for post, patch (or put), and del methods. Here's a full set of resourceful routes for an author resource: this.get('/authors'); this.get('/authors/:id'); this.post('/authors'); this.patch('/authors/:id'); this.del('/authors/:id'); Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control. Passthrough Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: // mirage/config.js this.passthrough(); Now you can develop as you normally would, for example against an existing API. When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need // mirage/config.js this.get('/comments'); this.passthrough(); and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. That should be enough to get you started! The rest of the docs are organized by Mirage's higher-level concepts: Route handlers contain the logic around what run-time data Mirage uses to respond to requests. The Data layer is how Mirage stores and tracks changes to your data over time. Keep reading to learn more! ","route":"docs.getting-started.overview","keywords":[]},"template:docs/getting-started/upgrade-guide/index":{"id":"template:docs/getting-started/upgrade-guide/index","type":"template","title":"Upgrade guide","text":" Upgrade guide If you're upgrading from an existing version of Mirage, you can run the following: # Using npm npm install -D ember-cli-mirage@X.X.X # Using yarn yarn add -D ember-cli-mirage@X.X.X Full Changelog You can view all of Mirage's release notes on our Releases page. 3.0 Upgrade guide Ensure that all the imports are updated for the objects that were moved to MirageJS. This is generally the imports in the files in the mirage directory. // from import { Model } from 'ember-cli-mirage'; //to import { Model } from 'miragejs'; Previous the file mirage/config.js was a exported default function that defined only your routes. Since MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS. Change the routes function to no longer be exported as the default function and give it a name, we suggest routes. Add the below boilerplate code to the top of the mirage/config.js. The end result would look like this. import { discoverEmberDataModels, } from 'ember-cli-mirage'; import { createServer } from 'miragejs'; export default function (config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } // This would be your old default export function renamed function routes() { } The environment variable discoverEmberDataModels is now longer used. If you wish to not have ember-cli-mirage auto discover the models, just remove the ...discoverEmberDataModels(), 2.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Update import paths for miragejs imports 1.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Remove Faker.js When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call app.import in order to use the library in your application code. Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for Faker.js, a useful library to have alongside your Mirage factory definitions. There's a few problems with this, most notably that users had to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version. Now, thanks to Ember Auto Import, this is no longer the case. Using dependencies directly from npm is painless – just yarn/npm install them and import them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you. This also means that users can easily manage their project's version of Faker (and other similar dependencies) independently of the version of Mirage they're using. For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change. Here are the steps you'll need to take to fix this: Install Ember Auto Import (if it's not already installed) ember install ember-auto-import Install Faker.js directly from npm: yarn add -D faker # or npm install --save-dev faker Change all imports of faker from the ember-cli-packge to import directly from faker: - import { Factory, faker } from 'miragejs'; + import { Factory } from 'miragejs'; + import faker from 'faker'; There is a codemod that will do this for you, thanks to the gracious work of Casey Watts. Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \"useful\" additions. I thought this was a good idea at the time... it wasn't. 🙈 You can look at the module from v0.4.15 to see that we added the faker.list.random, faker.list.cycle and faker.random.number.range methods, so if you use these methods too, you'll need to refactor them. Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS: For faker.list.random, use faker.random.arrayElement: countries() { - return faker.list.random([ 'United States of America', 'Canada', 'Mexico' ]); + return faker.random.arrayElement([ 'United States of America', 'Canada', 'Mexico' ]); } For faker.list.cycle, use the remainder (modulo) operator: countries(i) { - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; + + return countries[i % countries.length]; } For faker.random.number.range, use faker.random.number with min and max options: age() { - return faker.random.number.range(18, 65); + return faker.random.number({ min: 18, max: 65 }); } After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like Chance.js, and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control. 2. New import for setupMirage Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem. // Before import setupMirage from \"ember-cli-mirage/test-support/setup-mirage\"; // After import { setupMirage } from \"ember-cli-mirage/test-support\"; 3. Remove deprecated forms of create, createList and normalizedRequestAttrs There are several places in Mirage's APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in. This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we're moving to 1.0, we're removing this deprecated/unintentional behavior. server.create and server.createList were coded to take a singularized model name, e.g. server.create('user'). It just so happens that server.create('users') also works. That pluralized version is now removed from Mirage. If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like server.create('users') to server.create('user'). Note this also applies to server.createList – the correct form is server.createList('user', 3), and the pluralized form server.createList('users', 3) is now unsupported. this.normalizedRequestAttrs in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. In this case, you can call this.normalizedRequestAttrs('blog-post') to tell Mirage to expect the payload to be for a blog-post model. This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. It just so happened that this.normalizedRequestAttrs('blogPost') also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. The correct usage is this.normalizedRequestAttrs('blog-post'). Using the camelized version of the model name is no longer supported. If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! 4. The normalizeIds serializer property now defaults to true This applies to the ActiveModelSerializer and RestSerializer. The normalize property on serializers helps Mirage's shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly. There was a gap in the default normalize method for a long time, in that it didn't take REST payloads that included foreign keys and looked like let payload = { contact: { id: 1, name: \"Link\", address: 1 } }; and turn that address key into a proper JSON:API relationship: data: { type: 'contacts', id: 1, attributes: { name: 'Link' }, relationships: { address: { data: { type: 'address', id: 1 } } } } We added this feature a while ago, and it's controlled with the normalizeIds property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn't be a breaking change.) We're now making true the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. 0.3.x → 0.4 Upgrade guide There is one primary change in 0.4 that could break your 0.3 app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being included in the payload. This actually goes against JSON:API's design. Foreign keys in the payload are known as Resource Linkage and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a post came back like this: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { data: { type: 'users', id: '1' } } } } } and you forgot to ?include=author in your GET request, Ember Data would potentially use the user:1 foreign key and lazily fetch the author by making a request to GET /authors/1. This is problematic because This is not how foreign keys are intended to be used It'd be better to see no data and fix the problem by going back up to your data-loading code and add ?include=author to your GET request, or If you do want your interface to lazily load the author, use resource links instead of the resource linkage data: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { links: { related: '/api/users/1' } } } } } Resource links can be defined on Mirage serializers using the links method (though including is likely the far more simpler and common approach to fetching related data). So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). This behavior is configurable via the alwaysIncludeLinkageData key on your JSONAPISerializers. It is set to false by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to true: // mirage/serializers/application.js import { JSONAPISerializer } from \"ember-cli-mirage\"; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource links or resource linkage data, and to update your Mirage code accordingly to give you the most faithful representation of your server. 0.2.x → 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. In 0.2, the following model definitions // mirage/models/author.js import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); would have generated a \"schema\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from post to author. To have a two-way sync'd relationship, known as an inverse, you'd need to define both sides of the relationship: // mirage/models/author.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ posts: hasMany() }); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); Practically speaking, to upgrade you'll need to go through your code and update relationships that implicitly had inverses (from 0.2.x's hasMany and belongsTo behavior) and update them to define both sides. This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you'd also need the author to have a postIds: [] array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.) Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it's probably because of something I haven't thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help! For more information on the motivation behind change, please read the 0-3 beta series release blog post. 0.1.x → 0.2 Upgrade guide If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: The default Mirage directory has changed. The default Mirage directory has moved from /app/mirage to /mirage. When you install 0.2.0, the default blueprint will add the /mirage directory to your project. You can delete it and move your current Mirage files to the new location with something like rm -rf mirage mv app/mirage mirage from the root of your project. Mirage's directory is also customizable (Although you should move it from the /app directory or else it will not be removed from the build in production mode). All multiword filenames are dasherized. In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. blog_posts: []), just name your file fixtures/blog_posts.js. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change /mirage/factories/blog_post.js /mirage/fixtures/blog_post.js # etc. to /mirage/factories/blog-post.js /mirage/fixtures/blog-post.js You will then use the new Serializer layer to do things like format keys in your json payloads. All JavaScript properties are camelCased. Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be db.blog_posts, and your factory keys might be first_name() {..}. Looks pretty cool right? Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) You'll need to update your route handlers, which may look like this: let posts = db.blog_posts.filter(p => p.author_id === 1); to let posts = db.blogPosts.filter(p => p.authorId === 1); Note that everything is camelCased, including foreign keys. Similarly, factories that look like export default Factory.extend({ first_name() { return faker.name.firstName(); }, last_name() { return faker.name.firstName(); } }); should be changed to export default Factory.extend({ firstName() { return faker.name.firstName(); }, lastName() { return faker.name.firstName(); } }); This goes for all attrs that server.create takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. Mirage now has its own Model layer (an ORM). In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. To create a model, use ember g mirage-model blog-post This will create a file like import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); Having that file sets up the db.blogPosts collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. We needed to add models for association support (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the models guide and serializers guide to see how having models can simplify your Mirage server. We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. The ORM object schema is now injected into route handlers. In Mirage 0.1.x, the db was the first parameter injected into route handlers: this.get(\"/posts\", function(db, request) { // work with db }); Now, the schema object is, so you can take advantage of the Model layer. Fortunately, the db hangs directly off of the schema, so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to this.get(\"/posts\", function({ db }, request) { // work with db }); and then start opting-in to the ORM (and using schema) one route handler at a time. Specify a Serializer. If you're using shorthands, you'll need to pick a serializer in /mirage/serializers/application.js. See the serializers guide for details. You can always view the full changelog to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please open an issue! ","route":"docs.getting-started.upgrade-guide.index","keywords":[]},"template:docs/getting-started/upgrade-guide/v2-deprecations":{"id":"template:docs/getting-started/upgrade-guide/v2-deprecations","type":"template","title":"Deprecations Added in v2.x of ember-cli-mirage","text":" Deprecations Added in v2.x of ember-cli-mirage miragejs re-exports only exporting routes as the default function ","route":"docs.getting-started.upgrade-guide.v2-deprecations","keywords":[]},"template:docs/getting-started/what-is-mirage":{"id":"template:docs/getting-started/what-is-mirage","type":"template","title":"What is Mirage?","text":" What is Mirage? Mirage is a JavaScript library that lets frontend developers mock out backend APIs. Unlike other mocking libraries, Mirage makes it easy to reproduce dynamic scenarios that are typically only possible when using a true production server. Equipped with a Mirage server, a frontend developer can build, test, and even share a complete working Ember application without having to use or configure any backend services. Why? Mirage was originally built to bring conventions to some home-grown HTTP mocking code that was getting unwieldy. It ended up proving most useful when it enabled frontend developers to work on their apps without having to rely on any local or staging backend services as part of their normal development workflow. Since then, Mirage has focused on making it as easy as possible for Ember developers to maintain a mock server alongside their codebase. How it works Mirage runs in the browser. It uses Pretender.js to intercept and respond to any network requests your Ember app makes, letting you build your app as if it were talking to a real server. In this way, you can develop and test your app against various server states without having to modify any application code. In addition to intercepting HTTP requests, Mirage provides a mock database and helper functions that make it easy to simulate dynamic backend services. Mirage borrows concepts from server-side frameworks like routes to handle HTTP requests a database and models for storing data and defining relationships factories and fixtures for stubbing data, and serializers for formatting HTTP responses to make it easy to simulate production server behavior. Alternatives These other libraries solve similar problems to Mirage and might be a better fit for your needs: Polly.js, a library for recording and replaying HTTP interactions Pretender.js, the low-level HTTP interceptor powering Mirage Ember Data Factory Guy, factories for Ember apps powered by Ember Data ","route":"docs.getting-started.what-is-mirage","keywords":[]},"template:docs/route-handlers/functions":{"id":"template:docs/route-handlers/functions","type":"template","title":"Functions","text":" Functions Function handlers are the most flexible way to write route handlers in Mirage. To define new function handlers, use the get, post, patch (or put) and del methods. Here's an example: // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); Now when your Ember app makes a GET request to /movies, it will receive this data. Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response. this.get('/movies', () => { ... }); this.post('/movies', () => { ... }); this.patch('/movies/:id', () => { ... }); this.del('/movies/:id', () => { ... }); Timing The last argument to a route handler is an options object you can use to adjust the timing. Use this to delay the response of a particular route and see how your Ember app behaves when communicating with a slow network. // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }, { timing: 4000 }); The default delay is 50ms during development, and 0 during testing (so your tests run fast). You can also set a global timing parameter for all routes. Individual timing parameters override the global setting. // mirage/config.js export default function() { this.namespace = 'api'; this.timing = 2000; this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); this.get('/complex-query', () => { return [1, 2, 3, 4, 5]; }, { timing: 3000 }); } If you want to add delays to a test, you can override the timing for individual tests by putting the timing parameter in your test test('this route works with a delay', function() { server.timing = 10000; // ... }); Because the server is reset after each test, this option won't leak into the rest of your suite. Accessing the data layer Route handlers receive schema as their first parameter, which lets them access Mirage's data layer: this.get('/movies', (schema) => { return schema.movies.all(); }); Most of your route handlers will interact with the data layer in some way. The second parameter is the request object, which contains information about the request your Ember app made. For example, you can access dynamic URL segments from it: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); You can also access the request body, for example to handle a POST or PATCH request that contains data sent over by the Ember app: this.post('/movies', (schema, request) => { let title = JSON.parse(request.requestBody).title; return schema.movies.create({ title }); }); The normalizedRequestAttrs helper (documented below) provides some sugar for working with the request data. Dynamic paths and query params The request object that's injected into your route handlers contains any dynamic route segments and query params. To define a route that has a dynamic segment, use colon syntax (:segment) in your path. The dynamic piece will be available via request.params.[segment]: this.get('/authors/:id', (schema, request) => { let id = request.params.id; return schema.authors.find(id); }) Query params from the request can also be accessed via request.queryParams.[param]. Helpers There are several helpers available when writing function route handlers. serialize This helper returns the JSON for the given Model or Collection after passing it through the Serializer layer. It's useful if you want to do some final munging on the serialized JSON before returning it. this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta = { page: 1 }; return json; }); By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer name as the second argument: this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies, 'sparse-movie'); json.meta = { page: 1 }; return json; }); normalizedRequestAttrs This helper returns the body of a request in a normalized form, suitable for working with and creating records. For example, if your Ember app makes a POST request with this data // POST /users { data: { type: 'users', attributes: { 'first-name': 'Conan', 'middle-name': 'the', 'last-name': 'Barbarian' }, relationships: { team: { data: { type: 'teams', id: 1 } } } } } then normalizedRequestAttrs() could be used like this this.post('/users', function(schema, request) { let attrs = this.normalizedRequestAttrs(); /* attrs = { firstName: 'Conan', middleName: 'the', lastName: 'Barbarian', teamId: '1' } */ return schema.users.create(attrs); }); Note that attribute keys were camelCased, and the team foreign key was extracted. This is because a user owns the team foreign key; if another relationship were included in the request but the user did not own its foreign key, it would not have been extracted. This helper method leverages your serializer's normalize method. In the example above, it's assumed that the app was using the JSONAPISerializer, which comes with the #normalize method already written. If you're not using one of the bundled serializers, you'll need to implement #normalize and have it return a JSON:API document to take advantage of this method. Additionally, you'll need to use a full function here, as opposed to an ES6 arrow function (e.g () => { ... }). This is because normalizedRequestAttrs requires the this context from the function handler, and an arrow function would bind this from the outer scope. normalizedRequestAttrs() relies on a modelName to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the modelName to the helper as the first argument: this.patch('/users/edit/:id', function(schema, request) { let attrs = this.normalizedRequestAttrs('user'); // ... }); Status codes and headers By default, Mirage sets the HTTP status code of a response based on the verb being used for the route: GET is 200 PATCH/PUT is 204 POST is 201 DEL is 204 PATCH/PUT and POST change to 200 if there is a response body. Additionally, a header for Content-Type is set to application/json. You can customize both the response code and headers by returning an instance of the Response class in your route handler: // mirage/config.js import { Response } from 'miragejs'; export default function() { this.post('/authors', function(schema, request) { let attrs = JSON.parse(request.requestBody).author; if (attrs.name) { return schema.authors.create(attrs); } else { return new Response(400, { some: 'header' }, { errors: ['name cannot be blank'] }); } }); } External origins You can use Mirage to simulate other-origin requests. By default, a route like this.get('/contacts', ...) will hit the same origin that's serving your Ember app. To handle a different origin, use a fully qualified domain name: this.get('http://api.twitter.com/v1', ...) If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via urlPrefix: // mirage/config.js this.urlPrefix = 'https://my.api.com'; // This route will handle requests to https://my.api.com/contacts this.get('/contacts', ...) That's it on writing low-level function route handlers! Function route handlers are flexible, but also cumbersome to write out for every endpoint. If you're working with an API that's conventional enough, hopefully you'll be writing fewer function route handlers and more Shorthands, which we'll discuss in the next section. ","route":"docs.route-handlers.functions","keywords":[]},"template:docs/route-handlers/shorthands":{"id":"template:docs/route-handlers/shorthands","type":"template","title":"Shorthands","text":" Shorthands APIs have become more standardized, so Mirage has the concept of Shorthands to deal with common scenarios. Shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. For example, this function route handler this.get('/movies', (schema, request) => { return schema.movies.all(); }); is pretty standard: it responds to a URL path with a collection of the same name. The Shorthand form of this is this.get('/movies'); This is a complete route handler. It infers the model name from the last part of the URL, and returns the corresponding collection. Returning a single movie by ID is just as easy: this.get('/movies/:id'); There are also Shorthands for creating and editing data. For example, this function route handler creates a new movie: this.post('/movies', (schema, request) => { let attrs = JSON.parse(request.requestBody).movie; return schema.movies.create(attrs); }); It's also pretty standard: it creates a new model using the attributes from the request payload. The equivalent Shorthand is this.post('/movies'); See the full list of available Shorthands below. Shorthands use default status codes based on the HTTP verb: GET, PATCH/PUT and DEL are 200 POST is 201 GET Shorthands Fetching a collection: // Shorthand this.get('/contacts'); // finds type by singularizing url this.get('/contacts', 'users'); // optionally specify the collection as second param // equivalent this.get('/contacts', (schema) => { return schema.contacts.all(); // users in the second case }); Fetching a model: // Shorthand this.get('/contacts/:id'); // finds type by singularizing url this.get('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.get('/contacts/:id', (schema, request) => { let id = request.params.id; return schema.contacts.find(id); // users in the second case }); Fetching multiple models by ID (for example, GET /contacts?ids=1,3): // Shorthand this.get('/contacts', { coalesce: true }); this.get('/contacts', 'users', { coalesce: true }); // equivalent this.get('/contacts', ({ contacts }, request) => { let ids = request.queryParams.ids; return contacts.find(ids); // users in the second case }); POST Shorthands Creating a resource: // Shorthand this.post('/contacts'); // finds type by singularizing url this.post('/contacts', 'user'); // optionally specify the type as second param // equivalent this.post('/contacts', function(schema, request) { let attrs = this.normalizedRequestAttrs(); return schema.contacts.create(attrs); }); For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. PATCH/PUT Shorthands Updating a resource: // Shorthand (these also work with this.put) this.patch('/contacts/:id'); // finds type by singularizing url this.patch('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.patch('/contacts/:id', function(schema, request) { let id = request.params.id; let attrs = this.normalizedRequestAttrs(); return schema.contacts.find(id).update(attrs); }); For this PATCH shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. DELETE Shorthands Destroying a resource: // Shorthand this.del('/contacts/:id'); // finds type by singularizing url this.del('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.del('/contacts/:id', (schema, request) => { let id = request.params.id; schema.contacts.find(id).destroy(); }); Destroying a resource and related models: // Shorthand this.del('/contacts/:id', ['contact', 'addresses']); // equivalent this.del('/contacts/:id', ({ contacts }, request) => { let id = request.params.id; let contact = contacts.find(id); contact.addresses.destroy(); contact.destroy(); }); To use this Shorthand, you must have the appropriate hasMany/belongsTo relationships defined in your data layer. Resource helper The resource helper lets you define multiple Shorthands for a given resource: // Resource helper usage this.resource('contacts'); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.patch('/contacts/:id'); // and this.put('/contacts/:id') this.del('/contacts/:id'); You can also whitelist which Shorthands will be defined using the only option: this.resource('contacts', { only: [ 'index', 'show' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); or which route handlers shouldn't be defined using except option: this.resource('contacts', { except: [ 'update' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.del('/contacts/:id'); If your route path and collection names do not match, you can define a relative or absolute path using the path option: this.resource('blog-posts', { path: '/posts' }); // Shorthands defined this.get('/posts', 'blog-posts'); this.get('/posts/:id', 'blog-posts'); this.post('/posts', 'blog-posts'); this.put('/posts/:id', 'blog-posts'); this.patch('/posts/:id', 'blog-posts'); this.del('/posts/:id', 'blog-posts'); Here is the full reference of the actions' names you can pass to the only / except options and the Shorthands they stand for: Action | Shorthand ------------------------------ index | this.get('/contacts') show | this.get('/contacts/:id') create | this.post('/contacts') update | this.patch('contacts/:id') (or this.put) delete | this.del('/contacts/:id') Shorthands are a key part of staying productive in your frontend codebase, but they only work so well because Mirage has a Data Layer that's aware of your application's domain model. We'll cover how it works in the next few sections of the docs. ","route":"docs.route-handlers.shorthands","keywords":[]},"template:docs/testing/acceptance-tests":{"id":"template:docs/testing/acceptance-tests","type":"template","title":"Acceptance tests","text":" Acceptance tests Acceptance testing your Ember app involves verifying some user behavior. For example, you may want to test that the user can view a list of movies on your app's homepage. Many of these tests rely on a given server state. In other words, you want to test that, given ten movie resources exist on the server at the time the user boots up the app, when the user visits the homepage they see a list of 10 movies. Mirage was originally built specifically for these sorts of high-level tests. Let's see how it works. Assuming you're using Application Tests (introduced in Ember 3.0), add the setupMirage hook to the top of your test file: import { setupApplicationTest } from 'ember-qunit'; + import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); (If you are using pre-3.0 style tests, Mirage should boot automatically via an initializer. The only other difference is that Mirage is accessed via server, a global, whereas in 3.0-style tests Mirage is accessed via this.server. The rest of this guide will assume 3.0-style tests, but you can just use server in place of this.server and the rest of the documentation applies the same.) Now we can run your Ember app's test suite with ember t -s. In the test environment, Mirage will load all your route handlers from mirage/config.js, but it will ignore your seed data from mirage/scenarios/default.js. That means each test starts off with a clean database state. Within each test, you can use your factories to define your initial server state: test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); After each test, Mirage's server will be reset, so none of this state will leak across tests. Keeping your tests focused Factories are important in keeping code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten movies, given those movies existed on the server. So, the server.createList('movie', 10) call was directly in the test. Say we wanted to test that when the user visits a details route for a movie titled \"Interstellar,\" they would see that title in an

tag. One way to accomplish this would be to update the movie factory itself: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Interstellar' }); The problem with this approach is that this change is very specific to this test. Suppose another test needed to verify something different about movies with different titles. Changing the factory to suit that case would break this test. For this reason, you should use create and createList to override specific attributes of your model. This will keep code relevant to your test near your test, without making the rest of your test suite brittle. test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); test(\"I see the movies's title on the detail route\", await function(assert) { let movie = this.server.create('movie', { title: 'Interstellar' }); await visit(`/movies/${movie.id}`); assert.dom('h1').hasText('Interstellar'); }); Arrange, Act, Assert Mirage recommends using the Arrange, Act, Assert approach to write tests. You'll sometimes hear this pattern referred to as AAA testing (\"triple-A testing\"). You can see this structure in our test from above: test('I can view the movies', async function(assert) { // ARRANGE this.server.createList('movie', 10); // ACT await visit('/'); // ASSERT assert.dom('li.movie').exists({ count: 10 }); }); There are of course times where it makes sense to break this rule (for example to add some extra assertions near the beginning or middle of a test), but in general you should strive to follow the pattern. Testing errors To test how your Ember app responds to a server error, overwrite a route handler within a test: test('the user sees an error if the save attempt fails', async function(assert) { this.server.post('/questions', () => ({ errors: [ 'The database went on vacation' ] }), 500); await visit('/'); await click('.new'); await fillIn('input', 'New question'); await click('.save'); assert.dom('h2').hasText('The database went on vacation'); }); This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to /questions in your config.js file will be used again. Using scenarios in testing Typically you should reserve the scenarios/default.js file for development, so changes to it don't affect the rest of your test suite. That's why Mirage doesn't autoload this module during tests. If there's some logic you'd like to share between your development scenario and your tests, you can always make a new module under scenarios and import it in both places. If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: Create the module // scenarios/shared.js export default function(server) { server.loadFixtures('countries'); server.createList('event', 10); }; ...load it in your default scenario import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); await visit('/contacts'); assert.dom('p').exists({ count: 3 }); }); ...and then also load it in your tests (or even a common test setup function): import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); // ... }); This same sort of pattern will work for Integration and Unit tests as well. Those are the basics of Acceptance Testing with Mirage! Next let's talk about Integration and Unit tests. ","route":"docs.testing.acceptance-tests","keywords":[]},"template:docs/testing/assertions":{"id":"template:docs/testing/assertions","type":"template","title":"Assertions","text":" Assertions Most of your tests will assert against your Ember app's UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you'll assert that your UI is in the state you expect it to be. But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server. To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend. Asserting against Mirage's database The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage's database. If the correct data makes it there, you'll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect. Here's an example: test(\"I can change the lesson's title\", async function(assert) { this.server.create('lesson', { title: 'My First Lesson' }) await visit('/'); await click('.Edit') await fillIn('input', 'Updated lesson'); await click('.Save'); // Assert against our app's UI assert.dom('h1').hasText('Updated lesson'); // Also check that the data was \"persisted\" to our backend assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); }); This is a great way to gain some extra confidence that your Ember app is sending over the data you expect. Asserting against Mirage Models It can also be useful to assert against Mirage's ORM models, to verify things like updates to your model's relationships: test('I can add a tag to a post', async function(assert) { let programming = this.server.create('tag', { name: 'Programming' }); let post = this.server.create('post'); await visit(`/posts/${post.id}/edit`); await select('.tags', 'Programming'); await click('.save'); assert.dom().includesText('Saved!'); assert.equal(post.reload().tagIds.includes(programming.id)); }); The reload method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected. Asserting against models is basically another way to verify Mirage's database data is correct. Asserting against handled requests and responses You can also assert against the actual HTTP requests and responses that are made during your test. To do this, first enable Pretender's trackedRequests feature by enabling the trackRequests environment option: // config/environment.js module.exports = function(environment) { if (environment === 'test') { ENV['ember-cli-mirage'] = { trackRequests: true }; } } This feature is disabled by default to avoid memory issues during long development sessions. Now Mirage will track every request (along with the associated response) and make them available to you via server.pretender.handledRequests. That way you can assert against requests in that array at the end of your test. test(\"I can filter the table\", async function(assert) { this.server.createList('movie', 5, { genre: 'Sci-Fi' }); this.server.createList('movie', 3, { genre: 'Drama' }); await visit('/'); await select('.genre', 'Sci-Fi'); // Assert against our app's UI assert.dom('tr').exists({ count: 5 }); // Also assert against the HTTP request count & query let requests = this.server.pretender.handledRequests; assert.equal(requests.length, 1); assert.deepEqual(requests[0].queryParams, { 'filter[genre]': 'Sci-Fi' }); }); In general we recommend asserting against Mirage's database and your UI, as the specifics of your app's HTTP requests should be considered implementation details of the behavior you're actually interested in verifying. But there's certainly valid reasons to drop down and assert against HTTP data. And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. ","route":"docs.testing.assertions","keywords":[]},"template:docs/testing/integration-and-unit-tests":{"id":"template:docs/testing/integration-and-unit-tests","type":"template","title":"Integration and unit tests","text":" Integration and unit tests While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests. Let's say you have a data-fetching component, and you want to write a rendering test to verify its behavior. You can import and use the setupMirage function directly in your rendering test, and use Mirage just like you would in an acceptance test. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can fetch records', async function(assert) { this.server.create('movie', { title: 'Interstellar' }); await render(hbs`

{{model.title}}

`); assert.equal(this.element.textContent, 'Interstellar'); }); }); If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your mirage/config.js file, you can use this.server to setup new routes. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it renders an error state', async function(assert) { this.server.get( '/movies/:id', () => ({ errors: [ 'Something went wrong' ]}), 500 ); await render(hbs` {{#if error}}

Whoops!

{{/if}}
`); assert.equal(this.element.textContent, 'Whoops!'); }); }); Creating Ember Data models on the client with Mirage Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some. For example, let's say we were writing a rendering test to verify the behavior of our component: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // get the article await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); How might we test this? It might be tempting to use Mirage's server.create, since you probably already have factories defined: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // 🔴 Don't do this this.article = this.server.create('article', { title: 'Old title' }); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); But you shouldn't do this. Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don't actually know anything about your Ember app. Mirage models exist solely in your \"backend\", and are only useful in helping you create your mock server definition. The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server. So, in the same way that you wouldn't create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component. // 🔴 Don't do this // `article` is a Mirage model. It should never be consumed directly by Ember code. this.article = this.server.create('article'); await render(hbs` `); So, how might we get an article materialized into Ember Data's store so we can test this component, while still leveraging our Mirage factory definitions? Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this. Using findRecord and findAll The first approach is to lookup Ember Data's store, and use it to find the record (just like your Ember application's routes do): import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 1: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); let store = this.owner.lookup('service:store'); this.article = await store.findRecord('article', serverArticle.id); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Writing a helper to push Mirage's database The second approach is to make a helper that serializers Mirage's database into JSON and pushes that JSON into your Ember Data store. The actual logic might depend on the configuration of your Mirage server, but if you're following all of Mirage's conventions it should look roughly like this: // your-app/tests/helpers/push-mirage-into-store.js import { getContext } from '@ember/test-helpers'; import { run } from '@ember/runloop'; export default function() { let context = getContext(); let store = context.owner.lookup('service:store'); Object.keys(context.server.schema) .filter(key => context.server.schema[key].all !== undefined) // Get the resources .forEach(resource => { let models = context.server.schema[resource].all(); let modelName = models.modelName; let serializer = context.server.serializerOrRegistry.serializerFor(modelName); let originalAlwaysIncludeLinkageData = serializer.alwaysIncludeLinkageData; serializer.alwaysIncludeLinkageData = true; let json = serializer.serialize(models); serializer.alwaysIncludeLinkageData = originalAlwaysIncludeLinkageData; run(() => { store.pushPayload(json); }); }); } Now in your test, call your helper to seed Ember Data's store, and then use peekRecord to materialize and work with Ember Data records: import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; import pushMirageIntoStore from 'YOUR-APP/tests/helpers/push-mirage-into-store'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 2: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); pushMirageIntoStore(); let store = this.owner.lookup('service:store'); this.article = store.peekRecord('article', serverArticle.id); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Something like pushMirageIntoStore will probably make its way into Mirage at some point. Now that you've seen how to use setupMirage outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server! Next, we discuss some ways you can go about asserting against your Mirage mock server. ","route":"docs.testing.integration-and-unit-tests","keywords":[]},"template:docs/testing/setup-mirage":{"id":"template:docs/testing/setup-mirage","type":"template","title":"setupMirage test helper","text":" setupMirage test helper In your tests (acceptance, integration and unit) you can import the setupMirage test helper to start the Mirage server. Passing the hooks from the test module allows the mirage server to be created and shutdown before and after each test. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); The second parameter (optional) allows defining the mirage server to be used for this set of tests. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import makeServer from 'app-name/mirage/config'; // replace app-name with your app name module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); If it is not desirable to use the default config from the mirage directory you could import any other file that implements the same function, or even define the function locally or inline import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { discoverEmberDataModels } from 'ember-cli-mirage'; import { createServer } from 'miragejs'; const makeServer = function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { this.namespace = \"api\" this.timing = 2000 this.get(\"/movies\", () => { return [\"Interstellar\", \"Inception\", \"Dunkirk\"] }) } }; return createServer(finalConfig); } module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); ","route":"docs.testing.setup-mirage","keywords":[]},"template:index":{"id":"template:index","type":"template","title":"Productive","text":" Productive Spend less time wiring up HTTP stubs, and get back to developing your app. Test-worthy Use factories to define your server's state per test. Acceptance testing just got a whole lot easier. Shareable Share a functional prototype of your app that runs entirely in the client – before writing a single line of your API. Read the docs ","route":"index","keywords":[]},"template:not-found":{"id":"template:not-found","type":"template","title":"Not found","text":" Not found This page doesn't exist. Head home? ","route":"not-found","keywords":[]},"template:templates/application":{"id":"template:templates/application","type":"template","title":null,"text":" Blog ","route":"templates.application","keywords":[]},"template:templates/blog":{"id":"template:templates/blog","type":"template","title":null,"text":" ","route":"templates.blog","keywords":[]},"template:templates/blog/detail":{"id":"template:templates/blog/detail","type":"template","title":" ","text":" ← All posts Comments commented Want to chime in? View the thread on GitHub. ","route":"templates.blog.detail","keywords":[]},"template:templates/blog/error":{"id":"template:templates/blog/error","type":"template","title":"We're sorry...","text":"We're sorry... ","route":"templates.blog.error","keywords":[]},"template:templates/blog/index":{"id":"template:templates/blog/index","type":"template","title":"Blog","text":" Blog ","route":"templates.blog.index","keywords":[]},"template:templates/docs":{"id":"template:templates/docs","type":"template","title":null,"text":" ","route":"templates.docs","keywords":[]},"template:templates/docs/advanced/customizing-the-inflector":{"id":"template:templates/docs/advanced/customizing-the-inflector","type":"template","title":"Customizing the inflector","text":" Customizing the inflector When using Ember Data, you'll sometimes find yourself needing to customize the inflection rules used by your models. For example, say you had an Advice model. By default, Ember's inflector pluralizes this as \"advices\" import { pluralize } from 'ember-inflector'; pluralize(\"advice\"); // advices Ember Data uses these inflection rules for things like building its conventional URLs. For example, this.store.findAll('advice'); would result in a GET request to /api/advices. Mirage also relies on the inflector for its conventions. For example, the resource Shorthand // mirage/config.js this.resource('advice'); might use inflection rules to try to look up the \"advices\" collection or database table. The guides document the best way to configure these inflection rules. At the time of this writing, here's how you'd configure the inflector to treat \"advice\" as an uncountable word (i.e. a word with no plural form): // app/initializers/custom-inflector-rules.js import Inflector from 'ember-inflector'; export function initialize(/* application */) { const inflector = Inflector.inflector; // Tell the inflector that the plural of \"advice\" is \"advice\" inflector.uncountable('advice'); } export default { name: 'custom-inflector-rules', before: 'ember-cli-mirage', initialize }; Make sure to use before: \"ember-cli-mirage\" so this runs before Mirage initializes itself. As long as you follow this approach, Mirage should respect your custom inflector rules. With the above rule, this.store.findAll('advice'); would now result in a GET request to /api/advice, and // mirage/config.js this.resource('advice'); would respond correctly to that request, as well as correctly handle all other operations to the Advice resource. ","route":"templates.docs.advanced.customizing-the-inflector","keywords":[]},"template:templates/docs/advanced/environment-options":{"id":"template:templates/docs/advanced/environment-options","type":"template","title":"Environment options","text":" Environment options Set these options via the ENV['ember-cli-mirage'] variable in your config/environment.js file: // config/environment.js ... if (environment === 'production') { ENV['ember-cli-mirage'] = { enabled: true }; } enabled By default, your Mirage server will run in test mode, and in development mode as long as the --proxy option isn't passed. To change this default behavior, set enabled to either true or false in your ENV config. For example, to enable in production (e.g. to share a working prototype before your server is ready): // config/environment.js ... if (environment === 'production') { ENV['ember-cli-mirage'] = { enabled: true }; } To disable in development, // config/environment.js ... if (environment === 'development') { ENV['ember-cli-mirage'] = { enabled: false }; } trackRequests A boolean that controls whether Pretender's trackRequests feature is enabled. By default it is disabled to avoid memory issues during long development sessions. This should be set in the mirage/config.js options. Defaults to false. export default function(config) { let finalConfig = { ...config, trackRequests: true, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } This feature is useful for asserting against HTTP requests and responses during tests. See the \"Asserting against handled requests and responses\" section of the to learn more. excludeFilesFromBuild Defaults to false. By default, Mirage's files are included in your Ember app's build in non-production environments. This is in case you want to use Mirage via ember serve by visiting /tests, since that's an app with a build-time environment of development but a run-time environment of test. You can explicilty exclude Mirage's files from your Ember app's build by setting excludeFilesFromBuild to true. useDefaultPassthroughs Defaults to true. If true, Mirage will add some default passthrough routes to your server. Currently we add a single route http://localhost:0/chromecheckurl which is used by iOS for URL verification. directory Configure which directory contains your Mirage server definition. The default directory is /mirage (from the root of your project). For example, to have your server definition under /app/mirage, // config/environment.js ... ENV['ember-cli-mirage'] = { directory: 'app/mirage' }; discoverEmberDataModels Tells Mirage whether to automatically infer its schema from the host application's Ember Data models and relationships. Defaults to true. If Ember Data models are present, predefines Mirage's models and relationships. If Ember Data models are not present, has no effect. You can disable by setting to false. You might want to do this if you run into an edge case/issue where the autodiscovery code causes issues in your app's environment (for example, if you have a complex engines setup). // config/environment.js ... ENV['ember-cli-mirage'] = { discoverEmberDataModels: false }; ","route":"templates.docs.advanced.environment-options","keywords":[]},"template:templates/docs/advanced/mocking-guids":{"id":"template:templates/docs/advanced/mocking-guids","type":"template","title":"Mocking GUIDs","text":" Mocking GUIDs Some applications use GUIDs (or UUIDs) instead of auto-incrementing integers as identifiers for their models. Mirage supports the ability to overwrite how its database assigns IDs to new records via the IdentityManager class. You can generate model-specific managers or an application-wide manager to customize how your database behaves. To generate a new identity manager, use the blueprint: ember generate mirage-identity-manager A custom identity manager must implement these methods: fetch, which must return an identifier not used yet. set, which is called with an id of a record being insert in mirage's database. reset, which should reset database to initial state. Here's an example implementation for an identity manager that mocks GUIDs: import { v4 as getUuid } from \"ember-uuid\"; export default class { constructor() { this.ids = new Set(); } // Returns a new unused unique identifier. fetch() { let uuid = getUuid(); while (this.ids.has(uuid)) { uuid = getUuid(); } this.ids.add(uuid); return uuid; } // Registers an identifier as used. Must throw if identifier is already used. set(id) { if (this.ids.has(id)) { throw new Error(`ID ${id} has already been used.`); } this.ids.add(id); } // Resets all used identifiers to unused. reset() { this.ids.clear(); } } ","route":"templates.docs.advanced.mocking-guids","keywords":[]},"template:templates/docs/advanced/server-configuration":{"id":"template:templates/docs/advanced/server-configuration","type":"template","title":"Server configuration","text":" Server configuration The MirageJS server is configured for you by ember-cli-mirage. However, if you need to customize the server you can by creating a makeServer function in the config.js. Typically, the /mirage/config.js file contains a single default export which is a function defining all your Mirage route handlers. Ember CLI Mirage then uses this function, along with all the other modules you've defined in mirage/models, mirage/fixtures, mirage/factories, and mirage/serializers, to create your Mirage JS server when your app boots up in development and testing. You can now opt in to having more control over exactly how your Mirage server is instantiated using the same code as the mirageJS examples of creating a server by changing your current default export that represents the routes to a normal function, then creating a new default export function that creates the mirageJS server. This new default export function receives a single argument named config, which contains all the factory/fixture/serializer/model modules that exist in your project's /mirage directory. This saves you from having to import each module explicitly and then pass it into your Mirage server, just like you're used to with the default setup. The config argument maps exactly to everything inside of your /mirage directory - notably, it does not contain the autogenerated Mirage model definitions derived from your Ember Data models, which is an important feature of Ember CLI Mirage that is enabled by default. To replicate this behavior, a helper has been provided named discoverEmberDataModels from the ember-cli-mirage package that you can use to augment your config with these models so that your Mirage schema is automatically inferred from your host application's Ember Data models and relationships. The snippet below shows how to do this. Note that the order here matters if you also have models defined in your /mirage/models directory, as those model definitions would \"win\" in the event of a conflict with the ones autodiscovered from Ember Data. (However, most of time if you are inferring your Mirage schema from Ember Data, you shouldn't need to define additional models.) Finally, your route handlers just need to be passed to the routes() key in your Mirage config. You can do this inline, or you can make them a separate function, and organize that function however you choose. You should also add miragejs to your project's dependencies in your package.json file, since you are now importing directly from it. Note that this gives you the added benefit of being able to upgrade miragejs independently of ember-cli-mirage. All the objects from miragejs are re-exported in ember-cli-mirage such as Model, belongsTo, hasMany as well as Fixtures, Traits for example. These should in the future also be imported directly from miragejs as eventually these re-exports will be removed. This will help align the ember-cli-mirage users with the rest of the Mirage JS community. // Example with inline routes import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { // this.namespace = '/api' // this.resource('user') }, }; return createServer(finalConfig); } // Example with routes in an external function import { discoverEmberDataModels } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } Serializers If you would like to have Mirage adjust or create your serializers for you from your ember data serializers adjust your server configuration to have mirage perform this for you. When Mirage auto discovers your ember data models, should you also have the same model defined in mirage, it will use the mirage version of the model. With serializers, you may have created a mirage serializer to override some methods, but would still like Mirage to apply the primaryKey and transforms. For that reason the method to apply these properties is different than the way you merge the models. applyEmberDataSerializers will apply the primaryKey and attrs from your ember data serializers to your mirage serializers. If you have not created a mirage serializer it will create one and extend it from your mirage application serializer. Ensure your application serializer extends from EmberDataSerializer as the default JSONApiSerializer will not understand how to use primaryKey and transforms. If you have not created a mirage serializer named application, the created serializer will extend EmberDataSerializer directly. // Example of having Mirage adjust/create your serializers similiar to ember data models import { discoverEmberDataModels, applyEmberDataSerializers } from \"ember-cli-mirage\"; import { createServer } from 'miragejs'; export default function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, serializers: applyEmberDataSerializers(config.serializers), routes, }; return createServer(finalConfig); } function routes() { // this.namespace = '/api' // this.resource('user') } ","route":"templates.docs.advanced.server-configuration","keywords":[]},"template:templates/docs/advanced/simulating-cookie-responses":{"id":"template:templates/docs/advanced/simulating-cookie-responses","type":"template","title":"Simulating cookie responses","text":" Simulating cookie responses Although Mirage allows setting headers in a response, the XMLHttpRequest spec explicitly forbids access to Set-Cookie and Set-Cookie2 headers. As a result Mirage responses cannot set cookies via headers. However, you can simulate receiving cookies from an ajax call at the browser level by setting them in a route function handler: this.post('/users/login', schema => { // log in for 24 hours let now = new Date(); let cookieExpiration = new Date(now.getTime() + (24 * 3600 * 1000)); document.cookie=`remember_me=cookie-content-here; domain=.dev-domain; path=/; expires=${cookieExpiration.toUTCString()};`; return schema.users.find(1); }); Your Ember client code will now have access to any cookies set using document.cookie. ","route":"templates.docs.advanced.simulating-cookie-responses","keywords":[]},"template:templates/docs/advanced/switching-between-scenarios":{"id":"template:templates/docs/advanced/switching-between-scenarios","type":"template","title":"Switching between scenarios","text":" Switching between scenarios Mirage adds a /scenarios directory to your project, where you'll find a default.js file. The function in this file will run in development mode and act as your \"development seeds\". In testing it's ignored, so that your Mirage server starts out with a clean database. You can then use each test to seed Mirage as needed for that test. In this way, each test acts as its own Mirage scenario. Originally Mirage was going to add first-class support for development-time scenario switching, but currently only the scenarios/default.js file is used by Mirage. However, you can use various strategies to configure the behavior of your default scenario, to support multiple development server states or to facilitate things like running user acceptance testing. For example, you might want to test whether a user can complete a set of tasks specific to unique circumstances defined in a scenario. One strategy you could take is to configure your default scenario file to honor options passed to the runtime environment. For example, say you wanted to be able to run a scenario file like this: MIRAGE_SCENARIO=some-scenario ember s To affect the behavior of scenarios/default.js, add the MIRAGE_SCENARIO ENV variable to your environment/config.js: const { MIRAGE_SCENARIO } = process.env; module.exports = function(environment) { const ENV = { // ...other stuff MIRAGE_SCENARIO, // ...other stuff }; return ENV; } Then access this new config variable in your scenarios/default.js file: // scenarios/default.js import ENV from '../../config/environment'; import visitor from './visitor'; import subscriber from './subscriber'; import administrator from './administrator'; const scenarios = { visitor, subscriber, administrator } const activeScenario = ENV.MIRAGE_SCENARIO || 'visitor'; export default function(server) { const scenario = scenarios[activeScenario]; if (scenario) { scenario(server); } // plus whatever default scenario code you want } Like other Mirage objects, all scenario files must export a function like so: export default function(server) { // server.createList('post', 15); } Note that the server parameter is not provided by default. ","route":"templates.docs.advanced.switching-between-scenarios","keywords":[]},"template:templates/docs/api/item":{"id":"template:templates/docs/api/item","type":"template","title":null,"text":" ","route":"templates.docs.api.item","keywords":[]},"template:templates/docs/data-layer/database":{"id":"template:templates/docs/data-layer/database","type":"template","title":"The Database","text":" The Database At the core of Mirage's data layer is a simple in-memory database. This database stores all of Mirage's initial state, and then your route handlers access and modify that state as you use your application. The database is what allows Mirage to mimic a production server, giving you the ability to write complete dynamic features in your Ember app. Most of your Mirage code will not access the database directly, but rather will interact with it through Mirage's ORM. We'll cover the ORM in the next section of these guides. However, it's good to know that whether or not you use the ORM, you can always interact with the database directly. For example, you could seed it with some data in scenarios/default.js // scenarios/default.js export default function(server) { server.db.loadData({ movies: [ { title: 'Interstellar' }, { title: 'Inception' }, { title: 'Dunkirk' }, ] }); } and then can access it in your route handlers using the schema argument: this.get('/movies', (schema, request) => { return schema.db.movies; }); This route handler would then respond with the data you loaded: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] Note that each record has an id field, since the database assigns all new records an auto-incrementing ID. The most common place you'll use the database directly is in your tests, where you can access it via this.server.db. It can be useful to assert against the state of Mirage's database to verify that your Ember app's network requests are sending over the correct data. // tests/movie-test.js test('I can create a movie', async function(assert) { await visit('/movies/new'); await fillIn('.title', 'The Dark Knight'); await click('.submit'); assert.dom('h2').includesText('New movie saved!'); assert.equal(this.server.db.movies[0].title, 'The Dark Knight'); }); You can view the rest of the Database APIs in the and API reference. Next, we'll learn about Mirage's ORM. ","route":"templates.docs.data-layer.database","keywords":[]},"template:templates/docs/data-layer/factories":{"id":"template:templates/docs/data-layer/factories","type":"template","title":"Factories","text":" Factories One of the main benefits of using Mirage is the ability to quickly put your server into different states. For example, you might be developing a feature and want to see how the UI renders for both a logged-in user and an anonymous user. This is the kind of thing that's a pain when using a real backend server, but with Mirage it's as simple as flipping a JavaScript variable and live-reloading your Ember app. Factories are classes that help you organize your data-creation logic, making it easier to define different server states during development or within tests. Let's see how they work. Defining factories Your first factory Say we have a Movie model defined in Mirage. (Remember, if you're using Ember Data you won't have this file on disk. The Model definition will be automatically generated for you.) // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); To seed Mirage's database with some movies so you can start developing your app, use the server.create method in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.create('movie'); } server.create takes the singular hyphenated form of your model's class name as its first argument. Because we have no Factory defined for a Movie, server.create('movie') will just create an empty record and insert it into the database: // server.db.dump(); { movies: [ { id: '1' } ] } Not a very interesting record. However, we can pass attributes of our own as the second argument to server.create: // mirage/scenarios/default.js export default function(server) { server.create('movie', { title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' }); } Now our database looks like this { movies: [ { id: '1', title: 'Interstellar', releaseDate: '10/26/2014', genre: 'Sci-Fi' } ] } and we'll actually be able to develop our UI against realistic data. This is a great way to start, but it can be cumbersome to manually define every attribute (and relationship) when working on data-driven applications. It would be nice if we had a way to dynamically generate some of these attributes. Fortunately, that's exactly what Factories let us do! Let's generate a Factory for our movie using ember g mirage-factory movie which creates this file: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ }); Right now the Factory is empty. Let's define a property on it: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Movie title' }); Now server.create('movie') will use the properties from this factory. The inserted record will look like this: { movies: [ { id: '1', title: 'Movie title' } ] } We can also make this property a function. // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; } }); i is an incrementing index that lets us make our factory attributes more dynamic. If we use the server.createList method, we can quickly generate five movies server.createList('movie', 5); and with the above factory definition, our database will look like this: { movies: [ { id: '1', title: 'Movie 1' }, { id: '2', title: 'Movie 2' }, { id: '3', title: 'Movie 3' }, { id: '4', title: 'Movie 4' }, { id: '5', title: 'Movie 5' } ] } Let's add some more properties to our factory: // mirage/factories/movie.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ title(i) { return `Movie ${i}`; }, releaseDate() { return faker.date.past().toLocaleDateString(); }, genre(i) { let genres = [ 'Sci-Fi', 'Drama', 'Comedy' ]; return genres[i % genres.length]; } }); Here we've installed the Faker.js library to help us generate random dates. Now server.createList('movie', 5) gives us this data: { movies: [ { id: '1', title: 'Movie 1', releaseDate: '5/14/2018', genre: 'Sci-Fi' }, { id: '2', title: 'Movie 2', releaseDate: '2/22/2019', genre: 'Drama' }, { id: '3', title: 'Movie 3', releaseDate: '6/2/2018', genre: 'Comedy' }, { id: '4', title: 'Movie 4', releaseDate: '7/29/2018', genre: 'Sci-Fi' }, { id: '5', title: 'Movie 5', releaseDate: '6/30/2018', genre: 'Drama' }, ] } As you can see, Factories let us rapidly generate different scenarios for our dynamic server data. Attribute overrides Factories are great for defining the \"base case\" of your models, but there's plenty of times where you'll want to override attributes from your factory with specific values. The last argument to create and createList accepts a POJO of attributes that will override anything from your factory. // Using only the base factory server.create('movie'); // gives us this object: { id: '1', title: 'Movie 1', releaseDate: '01/01/2000' } // Passing in specific values to override certain attributes server.create('movie', { title: 'Interstellar' }); // gives us this object: { id: '2', title: 'Interstellar', releaseDate: '01/01/2000' } Think of your factory attributes as a reasonable \"base case\" for your models, and then override them in development and testing scenarios as you have need for specific values. Dependent attributes Attributes can depend on other attributes via this from within a function. This can be useful for quickly generating things like usernames from names: // mirage/factories/user.js import { Factory } from 'miragejs'; import { faker } from '@faker-js/faker'; export default Factory.extend({ name() { return faker.name.findName(); }, username() { return this.name.replace(' ', '').toLowerCase(); } }); Calling server.createList('user', 3) with this factory would generate this data: [ { id: '1', name: 'Retha Donnelly', username: 'rethadonnelly' } { id: '2', name: 'Crystal Schaefer', username: 'crystalschaefer' } { id: '3', name: 'Jerome Schoen', username: 'jeromeschoen' } ] Relationships In the same way that you use the ORM to create relational data, as this example from the Creating and editing related data section of the illustrates let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', }); you can also create relational data with your factories: let nolan = server.create('director', { name: 'Christopher Nolan' }); server.create('movie', { director: nolan, title: 'Interstellar' }); nolan is a model instance, which is why we can just pass it in as an attribute override when creating the Interstellar movie. This also works when using createList: server.create('actor', { movies: server.createList('movie', 3) }); In this way you use factories to help you quickly create graphs of relational data: server.createList('user', 5).forEach(user => { server.createList('post', 10, { user }).forEach(post => { server.createList('comment', 5, { post }); }); }); This code generates 5 users, each of which has 10 posts with each post having 5 comments. Assuming these relationships are defined in your models, all the foreign keys would be set correctly in Mirage's database. The afterCreate hook In many cases, setting up relationships manually (as shown in the previous section) is perfectly fine. However there are times where it makes more sense to have base case relationships set up for you automatically. Enter afterCreate. It's a hook that's called after a model has been created using the factory's base attributes. This hook lets you perform additional logic on your newly-created models before they're returned from create and createList. Let's see how it works. Say you have these two models in your app: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ post: belongsTo() }); Let's further suppose that in your app, it is never valid to create a post without an associated user. You can use afterCreate to enforce this behavior: // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { post.update({ user: server.create('user') }); } }); The first argument to afterCreate is the object that was just created (in this case the post), and the second is a reference to the Mirage server instance, so that you can invoke other factories or inspect any other server state needed to customize your newly-created object. In this example we're immediately creating a user for this post. That way elsewhere in your app (say a test), you could just create a post server.create('post'); and you'd be working with a valid record, since that post would have an associated user. Now, there's one problem with the way we've implemented this so far. Our afterCreate hook updates the post's user regardless if that post already had a user associated with it. That means that this code let tomster = server.create('user', 'Tomster'); server.createList('post', 10, { user: tomster }); would not work as we expect, since the attribute overrides while the object is being created, but the logic in afterCreate runs after the post has been created. Thus, this post would be associated with the newly created post from the hook, rather than Tomster. To fix this, we can update our afterCreate hook to first check if the newly created post already has a user associated with it. Only if it doesn't will we create a new one and update the relationship. // mirage/factories/post.js export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); Now callers can pass in specific users server.createList('post', 10, { user: tomster }); or omit specifying a user if the details of that user aren't important server.create('post'); and in both cases they'll end up with a valid record. afterCreate can also be used to create hasMany associations, as well as apply any other relevant creation logic. Traits Traits are an important feature of factories that make it easy to group related attributes. Define them by importing trait and adding a new key to your factory. For example, here we define a trait named published on our post factory: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }) }); You can pass anything into trait that you can into the base factory. We can use our new trait by passing in the name of the trait as a string argument to create or createList: server.create('post', 'published'); server.createList('post', 3, 'published'); The created posts will have all the base attributes, as well as everything under the published trait. You can also compose multiple traits together: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', published: trait({ isPublished: true, publishedAt: '2010-01-01 10:00:00' }), official: trait({ isOfficial: true }) }); We can pass our new traits into create or createList in any order: let officialPost = server.create('post', 'official'); let officialPublishedPost = server.create('post', 'official', 'published'); If multiple traits set the same attribute, the last trait wins. As always, you can pass in an object of attribute overrides as the last argument: server.create('post', 'published', { title: 'My first post' }); When combined with the afterCreate() hook, traits simplify the process of setting up related object graphs. Here we define a withComments trait that creates 3 comments for a newly created post: // mirage/factories/post.js import { Factory, trait } from 'miragejs'; export default Factory.extend({ title: 'Lorem ipsum', withComments: trait({ afterCreate(post, server) { server.createList('comment', 3, { post }); } }) }); We can use this trait to quickly make 10 posts with 3 comments each: server.createList('post', 10, 'withComments'); Combining traits with the afterCreate hook is one of the most powerful features of Mirage factories. Effective use of this technique will dramatically simplify the process of creating different graphs of relational data for your app. The association helper The association() helper provides some sugar for creating belongsTo relationships. As we saw earlier, given a Post that belongsTo a User, we were able to use the afterCreate hook to pre-wire that relationship: // mirage/factories/post.js import { Factory } from 'miragejs'; export default Factory.extend({ afterCreate(post, server) { if (!post.user) { post.update({ user: server.create('user') }); } } }); The association() helper effectively replaces this code: // mirage/factories/post.js import { Factory, association } from 'miragejs'; export default Factory.extend({ user: association() }); This should help reduce some of the boilerplate in your factory definitions. You can also use association() within traits // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association() }) }); and it also accepts additional traits and overrides for the related model's factory: // mirage/factories/post.js import { Factory, association, trait } from 'miragejs'; export default Factory.extend({ withUser: trait({ user: association('admin', { role: 'editor' }) }) }); There is no equivalent helper for hasMany relationships, so you can continue to use the afterCreate hook to seed those relationships. Using factories In development To use your factories to seed your development database, call server.create and server.createList in your scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); } There's no explicit API for switching scenarios in development, but you can just use JavaScript modules to split things up. For example, you could create a new file for each scenario that contains some seeding logic // mirage/scenarios/admin.js export default function(server) { server.create('user', { isAdmin: true }); } ...export all scenarios as an object from an index.js file // mirage/scenarios/index.js import anonymous from './anonymous'; import subscriber from './subscriber'; import admin from './admin'; export default scenarios = { anonymous, subscriber, admin } ...and then import that object into default.js. Now you can quickly switch your development state by changing a single variable: // mirage/scenarios/default.js import scenarios from './index'; // Choose one const state = // 'anonymous' // 'subscriber' 'admin' ; export default function(server) { scenarios[state](server); } This can be handy while developing your app or sharing the different states of a new feature with your team. In testing When running your app in the test environment, your entire Mirage server is loaded, except for your scenarios/default.js file. That means each test starts out with a clean database, giving you the opportunity to set up only the state needed for that test. It also keeps your development scenarios isolated from your tests, so that you don't inadvertently break your test suite while tweaking your development scenario. To seed Mirage's database within a test, use this.server to access the create and createList methods: test('I can see the movies on the homepage', async function(assert) { this.server.createList('movie', 5); await visit('/'); assert.dom('li.movie').exists({ length: 5 }); }); In this test, we start our Mirage server out with 5 movies. Then we boot up the Ember app and visit the / route, and finally assert that those movies show up in our UI. When we write another test, the database will start out empty so that none of Mirage's state leaks across tests. You can read more about testing with Mirage in the section of these guides. Factory best practices In general, it's best to define a model's base factory using only the attributes and relationships that comprise the minimal valid state for that model. You can then use afterCreate and traits to define other common states that contain valid, related changes on top of the base case. This advice goes a long way towards keeping your test suite maintainable. If you don't use traits and afterCreate, your tests will become bogged down in irrelevant details related to setting up the data needed for that test. test('I can see the title of a post', async function(assert) { let session = server.create('session'); let user = server.create('user', { session }); server.create('post', { user, title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); This test is only concerned with asserting the title of a post gets rendered to the screen, but it has lots of boilerplate code that's only there to get the post in a valid state. If we used afterCreate instead, the developer writing this test could simply create a post with a specified title and slug, since those are the only details relevant to the test: test('I can see the title of a post', async function(assert) { server.create('post', { title: 'My first post', slug: 'my-first-post' }); await visit('/post/my-first-post'); assert.dom('h1').hasText('My first post'); }); afterCreate could take care of setting up the session and user in valid states, and associating the user with the post, so that the test can stay concise and focused on what it's actually testing. Effective use of traits and afterCreate keeps your test suite less brittle and more robust to changes in your data layer, since tests only declare the bare minimum setup logic needed to verify their assertions. Up next, we'll take a look at how to use Fixtures as an alternative way to seed your database. ","route":"templates.docs.data-layer.factories","keywords":[]},"template:templates/docs/data-layer/fixtures":{"id":"template:templates/docs/data-layer/fixtures","type":"template","title":"Fixtures","text":" Fixtures Mirage also lets you use flat fixture files to seed your database with data. In general, we recommend using factories for most situations, since they tend to keep your mock data more maintainable. But there are certainly times where fixture data makes sense. Fixtures are nothing more than a conventional file-based way to accomplish the following: // mirage/scenarios/default.js export default function(server) { server.db.loadData({ countries: [ { id: 1, name: 'China' }, { id: 2, name: 'India' }, { id: 3, name: 'United States' } ] }); } Let's see how we can do the same thing using fixtures. Basic usage We'll start by generating a fixture file for our Country model: ember g mirage-fixture countries Fixture filenames should be the dasherized plural form of the model class. We can now add some data to our fixture file: // mirage/fixtures/countries.js export default [ { id: 1, name: 'China', largestCity: 'Shanghai' }, { id: 2, name: 'India', largestCity: 'Mumbai' }, { id: 3, name: 'United States', largestCity: 'New York City' }, { id: 4, name: 'Indonesia', largestCity: 'Jakarta' }, { id: 5, name: 'Pakistan', largestCity: 'Karachi' }, { id: 6, name: 'Brazil', largestCity: 'São Paulo' }, { id: 7, name: 'Nigeria', largestCity: 'Lagos' }, { id: 8, name: 'Bangladesh', largestCity: 'Dhaka' }, { id: 9, name: 'Russia', largestCity: 'Moscow' }, { id: 10, name: 'Mexico', largestCity: 'Mexico City' }, ]; Because this data will be read directly into Mirage's database, we want to use camelCase for all multi-word attributes. (Mirage uses the camelCasing convention to avoid configuration for things like identifying foreign keys.) Don't worry if your production API format doesn't use camelCase. We'll be able to customize Mirage's API format in the Serializer layer. To load our new fixture file into the database during development, we can call server.loadFixtures in our scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.loadFixtures(); } If we have multiple fixtures defined, server.loadFixtures() will load every file. You can load files selectively by passing in an argument list of fixture names to loadFixtures: // mirage/scenarios/default.js export default function(server) { server.loadFixtures('countries', 'cities'); // only load the countries and cities fixtures } Just like with factories, fixtures will be ignored during tests. If you want to load fixture data in a test, you can call this.server.loadFixtures: test('I can see the countries', async function(assert) { this.server.loadFixtures('countries'); await visit('/'); assert.dom('option.country').exists({ length: 100 }); }); Relationships There's no special API for creating relationships using fixtures – you just need to understand how Mirage uses foreign keys to wire up relationships. Let's say we had these models: // mirage/models/user.js export default Model.extend({ }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); Using the ORM we can create two related models: let chris = schema.users.create({ name: 'Chris Garrett' }); schema.posts.create({ author: chris, title: 'Coming Soon in Ember Octane' }); If we take a look at Mirage's database after this, we'll see this data: // server.db.dump() { users: [ { id: '1', name: 'Chris Garrett' } ], posts: [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ] } As you can see, Mirage added an authorId foreign key to the post. The convention for belongsTo foreign keys is `${relationshipName}Id` In this case, a post gets an authorId, even though that relationship points to a User model. The relationship name is always used rather than the model name, because models can have multiple relationships that point to the same type of model. Looking at the database dump above, if you wanted to recreate the same relationship graph using only fixture files, your files would look something like this: // mirage/fixtures/users.js export default [ { id: '1', name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; Once these fixtures are loaded into Mirage, all the ORM methods, Shorthands and Serializers would work as expected. If this happens to be a bi-directional relationship // mirage/models/user.js export default Model.extend({ + posts: hasMany() }); // mirage/models/post.js export default Model.extend({ author: belongsTo('user') }); then Mirage will add an array of foreign keys on the new hasMany association: // mirage/fixtures/users.js export default [ { id: '1', postIds: [ '1' ], name: 'Chris Garrett' } ]; // mirage/fixtures/posts.js export default [ { id: '1', authorId: '1', title: 'Coming Soon in Ember Octane' } ]; The convention for hasMany relationship foreign keys is `${singularize(relationshipName)}Ids` All associations have their own keys, because Mirage supports arbitrary one-way relationships. If two associations are inverses of each other, as in the above case, Mirage will keep the keys on each model in sync provided you use the ORM methods. As you can see, maintaining foreign keys and keeping them in sync across fixture files can get a little messy, which is why Mirage recommends using factories for most of your data creation. Still, fixtures can be quite useful in certain situations, so they're a good tool to have in your toolbox. ","route":"templates.docs.data-layer.fixtures","keywords":[]},"template:templates/docs/data-layer/models":{"id":"template:templates/docs/data-layer/models","type":"template","title":"Models","text":" Models To take advantage of the ORM, Mirage needs to know about your application's models and their relationships. This section will teach you how to define and work with your models, and the next will discuss relationships. Note that if your Ember application uses Ember Data, Mirage will automatically discover your models and their relationships, so you don’t need to define any files within Mirage yourself. As a clarifying point, Mirage model instances only exist within Mirage's server, and are never shared directly with your Ember app or rendered directly in components. They exist solely to help you manage the data and relationships in your fake backend, but are serialized as a JSON string before they are sent over to your Ember app. Defining models To define a model, you can use the generator: ember g mirage-model blog-post This creates a file under /mirage/models: // mirage/models/blog-post.js import { Model } from 'miragejs'; export default Model; Creating models To create models, access the model's collection via the schema object, which is available in your route handlers: this.post('/blog-posts', function(schema) { let attrs = this.normalizedRequestAttrs(); schema.blogPosts.create(attrs); }); or as server.schema directly off of your Mirage server instance: // scenarios/default.js export default function(server) { server.schema.blogPosts.create({ title: 'Lorem ipsum' }); } Note that the collection is the pluralized form of the model's model name (the models/blog-post.js definition from above creates a schema.blogPosts collection). Outside of route handlers, you'll typically create models using Factories via server.create // scenarios/default.js export default function(server) { server.create('blog-post'); } which delegates to the collection's create method under the hood. We'll talk more about creating data using Factories later in these guides. Accessing models To access your models, use the various query methods from the model's collection. For example, use all() to return all known models: this.get('/blog-posts', (schema, request) => { return schema.blogPosts.all(); }); Here are some other common query methods: schema.blogPosts.find(1); schema.blogPosts.first(); schema.blogPosts.where({ isPublished: true }); schema.blogPosts.findBy({ title: 'Introduction' }); Check out the to see all available query methods. Updating and deleting models Once you're working with an instance of a model, there are other properties and methods you'll have access to. For example, you can update a model: let post = schema.blogPosts.find(1); post.update({ author: 'Obi-Wan' }); or delete one: let post = schema.blogPosts.find(2); post.destroy(); View the to see all the available fields and methods for model instances. Once your Models have been defined, the next step is to define the relationships between them, so you can really start to leverage the power of Mirage's ORM. Let's talk about how to do that next. ","route":"templates.docs.data-layer.models","keywords":[]},"template:templates/docs/data-layer/orm":{"id":"template:templates/docs/data-layer/orm","type":"template","title":"Why an ORM?","text":" Why an ORM? Mirage originally shipped with just a database as its data layer. While helpful, users still had to write a lot of code to reproduce their modern, complex backends. In particular, dealing with relationships was a big pain point. The solution was to add an Object Relational Mapper, or ORM, to Mirage. Let's see how an ORM allows Mirage to do more of the heavy lifting for you. Motivation Consider a database that looks like this: db.dump(); // Result { movies: [ { id: '1', title: 'Interstellar' }, { id: '2', title: 'Inception' }, { id: '3', title: 'Dunkirk' } ] } The first problem you'll encounter when writing a route handler is how to transform this raw data into the format your Ember app expects – that is, how to match the format of your production API. Let's say your backend uses the JSON:API spec. Your response to a GET request for /api/movies/1 should look something like this: // GET /api/movies/1 { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' } } } Not a huge deal – we could just write this formatting logic directly in our route handler: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); return { data: { id: movie.id, type: 'movies', attributes: { title: movie.title } } }; }); This works. But let's say our Movie model had a few more attributes: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } Now our route handler needs to be more clever, and make sure all properties other than id end up in the attributes hash: this.get('/movies/:id', (schema, request) => { let movie = schema.db.movies.find(request.params.id); let movieJSON = { data: { id: movie.id, type: 'movies', attributes: { } } }; Object.keys(movie) .filter(key => key !=== 'id') .forEach(key => { movieJSON[key] = movie[key]; }); return movieJSON; }); As you can see, things get complicated pretty fast. What if we add relationships to the mix? Let's say a Movie has a relationship to a director, and it stores that relationship using a directorId foreign key: { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '23' } The expected HTTP response for this model now looks like this { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar' }, relationships: { directors: { data: { type: 'people', id: '23' } } } } } meaning our route handlers need to get even more complex. In particular, they need a robust way to differentiate between a model's attributes (like title) and its relationship keys (like directorId). These sorts of problems turn out to be common enough that we can solve them generally, provided Mirage is aware of your application's models and their relationships. Problems solved by the ORM When Mirage knows about your application's domain, it can shoulder the responsibility for the low-level bookkeeping work needed to properly implement your mock server. Let's take a look at some examples of how it does this. Separation of formatting logic To start, we can tell Mirage about our application's schema by defining Mirage models. These models get registered with the ORM and tell Mirage about the shape of your data. Let's define a Movie model. // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Mirage models are schemaless in attributes, in that they don't require you to define plain attributes like title and releaseDate. So, the above model definition works regardless of what attributes your Movie model has. If you're using Ember Data, Mirage's ORM will automatically register your Ember Data models for you at run time, so you don't have to duplicate your domain information in two places. With the Movie model defined, we can update our route handler to use the ORM to respond with a Mirage model instance: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); The schema argument is how you interact with the ORM. By returning an instance of a Mirage model from a route handler instead of a plain JavaScript object, we can now take advantage of Mirage's Serializer layer. Serializers work by turning Models and Collections into formatted JSON responses. Mirage ships with a JSONAPISerializer out of the box, so assuming it's defined as your Application serializer // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); this route handler will now respond with the payload we expect: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' } } } The ORM is already helping us keep our route handlers tidy by delegating the work of transforming our models into JSON to the Serializer layer. But it gets even more powerful when we add relationships to the mix. Fetching related data Let's say our Movie has a belongs-to relationship with a director: // mirage/models/movie.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ director: belongsTo('person') }); The director is an instance of a Person model: // mirage/models/person.js import { Model } from 'miragejs'; export default Model.extend({ }); Again, if you're using Ember Data, both the models and relationships will be automatically generated for you. No need to create this file. Without changing anything about our route handler or serializer, we can now fetch a graph of data by using JSON:API includes. The following request GET /api/movies/1?include=director will now generate this response: { data: { id: '1', type: 'movies', attributes: { title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }, relationships: { director: { data: { type: 'people', id: '1' } } } }, included: [ { id: '1', type: 'people', attributes: { name: 'Christopher Nolan' } } ] } The JSONAPISerializer is able to inspect the ORM so that it can put all models, attributes and relationships in the right place. Our route handler doesn't need to change at all. In fact, the route handler we wrote is the same as the default behavior of the Shorthand, meaning we can just switch to using that: - this.get('/movies/:id', (schema, request) => { - let id = request.params.id; - return schema.movies.find(id); - }); + this.get('/movies/:id'); This is another example of how the ORM helps various parts of Mirage, like Shorthands and Serializers, work together to simplify your server definition. Creating and editing related data The ORM also makes creating and editing related data easier than if you only worked with the raw database records. For instance, to create a Movie and Person with a relationship using only the database, you'd need to do something like this: server.db.loadData({ people: [ { id: '1', name: 'Christopher Nolan' } ], movies: [ { id: '1', title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi', directorId: '1' } ] }); Note the directorId foreign key on the Movies record must match the id on the associated People record. Managing raw database data like this quickly gets unwieldy, especially as relationships change over time. Using the ORM via server.schema, we can create this graph without managing any IDs: let nolan = schema.people.create({ name: 'Christopher Nolan' }); schema.movies.create({ director: nolan, title: 'Interstellar', releaseDate: 'October 26, 2014', genre: 'Sci-Fi' }); Passing in the model instance nolan as the director attribute when creating the movie is enough for all the keys to be properly set up. The ORM also keeps foreign keys in sync as relationships are edited. Given the database { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '2' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } we could update the movie's director like this: let episode9 = schema.movies.findBy({ title: 'Star Wars: The Rise of Skywalker' }); episode9.update({ director: schema.people.findBy({ name: 'J.J. Abrams' }); }); The new database would look like this: { movies: [ { id: '1', title: 'Star Wars: The Rise of Skywalker', directorId: '3' } ], people: [ { id: '2', name: 'Rian Johnson' }, { id: '3', name: 'J.J. Abrams' } ] } Note how the directorId was changed in the database, even though we only ever worked with model instances. Importantly, this also holds true for more complex relationships, like one-to-many or many-to-many relationships that have an inverse. The ORM allows Mirage to abstract all this bookkeeping away from your code, and even gives Shorthands enough power to respect arbitrary updates to complex relationship graphs. These are some of the main problems addressed by Mirage's ORM. Generally, when Mirage knows about your application's schema, it can take on more of the responsibility of configuring your mock server. Next, we'll take a look at how to actually define your models and their relationships in Mirage. ","route":"templates.docs.data-layer.orm","keywords":[]},"template:templates/docs/data-layer/relationships":{"id":"template:templates/docs/data-layer/relationships","type":"template","title":"Relationships","text":" Relationships Once you've defined your models, you can define relationships between them using the belongsTo and hasMany helpers. Each helper adds some dynamic methods to your model. Just as another reminder, if you use Ember Data and have models and relationships defined there, you don't need to define any relationships within your Mirage folder, as those will be automatically discovered and set up for you. belongsTo To define a to-one relationship, import the belongsTo helper and define a new property on a model that points to another model: // mirage/models/blog-post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); This defines a belongsTo relationship to an Author model. The belongsTo helper adds several new properties and methods to your models. In this case, our blog-post model would now have an authorId property, as well as some methods for working with the associated author model: blogPost.authorId; // 1 blogPost.authorId = 2; // updates the relationship blogPost.author; // Author instance blogPost.author = anotherAuthor; blogPost.newAuthor(attrs); // new unsaved author blogPost.createAuthor(attrs); // new saved author (updates blogPost.authorId in memory only) Note that when a child calls child.createParent, the new parent is immediately saved to the db, but the child's foreign key is updated on this instance only, and is not immediately persisted to the database. In other words, blogPost.createAuthor will create a new author record, insert it into the db, and update the blogPost.authorId in memory, but if you were to fetch the blogPost from the db again, the relationship would not be persisted. To persist the new foreign key, you would call blogPost.save() after creating the new author. hasMany To define a to-many relationship, use the hasMany helper: // mirage/models/blog-post.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ comments: hasMany() }); This helper adds a commentIds property to the blogPost model, as well as some methods for working with the associated comments collection: blogPost.commentIds; // [1, 2, 3] blogPost.commentIds = [2, 3]; // updates the relationship blogPost.comments; // array of related comments blogPost.comments = [comment1, comment2]; // updates the relationship blogPost.newComment(attrs); // new unsaved comment blogPost.createComment(attrs); // new saved comment (comment.blogPostId is set) Association options modelName If your associations model has a different name than the association itself, you can specify the modelName on the association. For example, // mirage/models/blog-post.js import { Model, belongsTo, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo(\"user\"), comments: hasMany(\"annotation\") }); would add all the named author and comment methods as listed above, but use user and annotation models for the actual relationships. inverse Often, relationships can be inverses of each other. For example, say we had the following two models: // blog-post.js export default Model.extend({ comments: hasMany() }); // comment.js export default Model.extend({ blogPost: belongsTo() }); In this case, blogPost.comments would point to a collection of Comment models, and each one of those Comment models would have a comment.blogPost relationship that pointed back to the original post. Mirage will often be able to infer that two relationships on two different models are inverses of each other, but sometimes you'll need to be explicit. This typically happens if a model has two relationships that point to the same model type. For example, suppose we had the following schema: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\"), reviewer: belongsTo(\"user\") }); In this case, Mirage doesn't know which relationship (blogPost.author or blogPost.reviewer) should by synchronized with the parent's user.blogPosts collection. So, you can specify which one by using the inverse option: // user.js export default Model.extend({ blogPosts: hasMany() }); // blog-post.js export default Model.extend({ author: belongsTo(\"user\", { inverse: \"blogPosts\" }), reviewer: belongsTo(\"user\", { inverse: null }) }); Now, if a blog post is added to user.blogPosts, that post's author will be correctly set. polymorphic You can specify whether an association is a polymorphic association by passing { polymorphic: true } as an option. For example, say you have a Comment that can belong to a BlogPost or a Picture. Here's how the model definitions would look: // app/models/comment.js export default Model.extend({ commentable: belongsTo({ polymorphic: true }) }); // app/models/blog-post.js export default Model.extend({ comments: hasMany() }); // app/models/picture.js export default Model.extend({ comments: hasMany() }); Note that commentable doesn't need a type (there's no validation done on which types of models can exist on that association). Polymorphic associations have slightly different method signatures for their foreign keys and build/create methods. let comment = schema.comments.create({ text: \"foo\" }); comment.buildCommentable(\"post\", { title: \"Lorem Ipsum\" }); comment.createCommentable(\"post\", { title: \"Lorem Ipsum\" }); // getter comment.commentableId; // { id: 1, type: 'blog-post' } // setter comment.commentableId = { id: 2, type: \"picture\" }; Has-many asssociations can also be polymorphic: // app/models/user.js export default Model.extend({ things: hasMany({ polymorphic: true }) }); // app/models/car.js export default Model.extend({ }); // app/models/watch.js export default Model.extend({ }); let user = schema.users.create({ name: \"Sam\" }); user.buildThing('car', { attrs }); user.createThing('watch', { attrs }); // getter user.thingIds; // [ { id: 1, type: 'car' }, { id: 3, type: 'watch' }, ... ] // setter user.thingIds = [ { id: 2, type: 'watch' }, ... ]; Be sure to check out the , and API docs to learn about all the available ORM methods. We'll also cover Serializers in these guides, where you'll learn how to customize the serialized forms of your models and collections to match your production API. Next, let's take a look at Factories, which leverage your new Model and Relationship definitions to make it easy to create graphs of relational data. ","route":"templates.docs.data-layer.relationships","keywords":[]},"template:templates/docs/data-layer/serializers/ember-data-serializer":{"id":"template:templates/docs/data-layer/serializers/ember-data-serializer","type":"template","title":null,"text":"The EmberDataSerializer extends the RestSerializer with the added functionality ofprimaryKey and attrs (renamed transforms as attrs was already in use by Mirage) properties. These properties work the same as the properties provided. Primary Key This serializer provides for a property primaryKey that works the same as the primaryKey property on an ember data serializer. By default this property will be id but if you assign a different value, that value will be used in the JSON instead of id. This means that if you are using the primaryKey property on your ember data serializer, using the same property on the mirage serializer will perform the same function. If you were using the RestSerializer you would need to override the serialize and normalize functions to do the transform yourself. Using EmberDataSerializer you can let the serializer perform this transformation for you. To be clear, when data is received by Mirage, this will take the value of addressId from the JSON and use it as the id for the Mirage model. When Mirage serializers it's model into JSON, it will use the value for the id property and assign it to the property addressId. import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ primaryKey: \"addressId\" }); Transforms Transforms provides the same function as attrs for the ember data serializers however this transformation is happening on the server side for Mirage. This allows your mirage models to look more like your actual server models. Example of a Mirage serializer extending from EmberDataSerializer import { EmberDataSerializer } from \"ember-cli-mirage\"; export default EmberDataSerializer.extend({ transforms: { name: \"externalName\", address: {key: \"addressId\", serialize: \"ids\"}, age: {key: \"externalAge\"}, blogPosts: {key: \"blogPostIds\"} } }); If you would like Mirage to apply the transforms from your ember data serializers for you see . ","route":"templates.docs.data-layer.serializers.ember-data-serializer","keywords":[]},"template:templates/docs/data-layer/serializers/index":{"id":"template:templates/docs/data-layer/serializers/index","type":"template","title":"Serializers","text":" Serializers A serializer is an object responsible for transforming a Model or Collection that's returned from your route handlers this.get('movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); into a formatted JSON payload // GET /movies/1 { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' } } } suitable for consumption by your Ember app. Serializers are the last main part of Mirage's architecture that interacts with the Data Layer, because producing a well-formatted JSON response often involves traversing the relationship graph of your models. Let's see how they work. Choosing which serializer to use The first step in working with Mirage's serializers is to choose which included serializer to start with, which in turn depends on what JSON format your backend uses to serve data to your Ember app. The JSON payload above is an example of an API that follows the JSON:API spec. You'll see it used a lot in the Ember ecosystem, because it's the default API format expected by Ember Data. It also solves a lot of problems that exist in other formats that are less well-defined. If you are starting a new app, it's recommended that you choose a JSON:API implementation for your backend, as that format will give you the smoothest experience with the rest of the Ember ecosystem. However, plenty of Ember apps are built that don't use JSON:API. If your app does use JSON:API, Mirage ships with a JSONAPISerializer that will do the heavy lifting for you. Mirage also ships with two other named serializers, ActiveModelSerializer and RestSerializer, that match two other popular backend formats. EmberDataSerializer is also provided as a variation to the RestSerializer that uses the primaryKey and attrs defined in your applications ember data serializers, similar to how models are auto discovered. See the section on for more information. If your backend uses a different format, you'll need to choose the closest one and customize it to match your production format. We'll talk about that later in this guide. Defining serializers Once you've selected the appropriate serializer, define your default application-wide serializer by exporting it from /mirage/serializers/application.js: // mirage/serializers/application.js import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ }); This specifies the serializer to use for each Model and Collection in your system. If you need to customize a serializer for a particular model type, you can define model-specific serializers that take precedence over your application serializer. Let's use Mirage's generator to create a Movie serializer: ember g mirage-serializer movie This creates the file import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ }); which follows the best practice of model-specific serializers extending from your Application serializer. You can now customize the behavior of how Movie models and collections are serialized into JSON. Customizing serializers When it comes to customizing your application's serializers, you'll mostly be tweaking Mirage's defaults. For example, if your Ember app expects attribute names to be PascalCase // GET /movies/1 { Id: '1', ReleaseDate: 'Interstellar' } you might override the Serializer's keyForAttribute method: import { Serializer } from 'miragejs'; import { classify } from '@ember/string'; export default Serializer.extend({ keyForAttribute(attr) { return classify(attr); } }); See the API docs for each serializer to learn more about all the customization hooks available. Relationships Relationships are another important aspect of Serializers, as backends have many different ways of dealing with relationships. For example, the JSONAPISerializer respects query param includes GET /movies/1?include=cast-members out of the box. But sometimes Ember apps expect a resource payload to have all their relationship IDs defined, regardless if the request used query param includes. There's an option on JSONAPISerializer that enables this: import { JSONAPISerializer } from 'miragejs'; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); Now, a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { data: [ { type: 'people', id: '1' }, { type: 'people', id: '2' }, { type: 'people', id: '3' }, ] } } } } The Ember app could now use these ids to subsequently fetch the related cast members. Other times, an Ember app expects to get a link to fetch related data. The JSONAPISerializer also has a hook for this: // mirage/serializers/movie.js import ApplicationSerializer from './application'; export default ApplicationSerializer.extend({ links(movie) { return { 'cast-members': { related: `/api/movies/${movie.id}/cast-members` } }; } }); Now a GET request to /movies/1 would respond with this payload: { data: { id: '1', type: 'movies';, attributes: { title: 'Interstellar' }, relationships: { 'cast-members': { links: { related: `/api/movies/1/cast-members` } } } } } The other serializers also have mechanisms controlling how related data can be loaded. Be sure to check out the API docs for all the details. Working with serialized JSON While most route handlers should return a Model or Collection instance, and leave the serialization logic up to the Serializer, sometimes it can be convenient to perform some final serialization logic directly in your route handler. You can use the this.serialize helper method to do this - make sure to use a function instead of a fat arrow so you have access to the correct this: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta.size = movies.length; return json; }); The serialize helper will use the typical lookup logic to first check for a model-specific serializer, and then fall back to the default Application serializer. You can also use a specific serializer if you have a special case by passing in the name of the serialize as a second argument: // mirage/config.js this.get('/movies', function(schema, request) { let movies = schema.movies.all(); let json = this.serialize(movies, 'movie-with-relationship'); json.meta.size = movies.length; return json; }); This route handler would use the mirage/serializers/movie-with-relationship.js serializer to transform the collection of movies into a json payload, which is then modified and then finally returned from the route handler. In general, you should not need to write much code dealing with Mirage serializers. Even if your backend doesn't adhere to one of the predefined formats, you should be able to use the provided hooks to implement an ApplicationSerializer that works for the majority of your models. The more conventional your backend API is, the less code you'll need to write – not only in Mirage, but also in other parts of your Ember application! Be sure to check out the and docs to learn about all the hooks available to customize your serializer layer. Now that we've covered the ins and outs of Mirage's data layer, we're ready to see how we can use Mirage to effectively test our Ember application. ","route":"templates.docs.data-layer.serializers.index","keywords":[]},"template:templates/docs/getting-started/installation":{"id":"template:templates/docs/getting-started/installation","type":"template","title":"Installation","text":" Installation To install Mirage, run ember install ember-cli-mirage Ember should install the addon and add a /mirage directory to the root of your project. Ember-cli-mirage depends on MirageJS as a peer dependency and will add it to your applications package.json. Check out the if you're coming from a previous version of Mirage. Note for Embroider users Embroider does not recognizes changes to Ember CLI Mirage configuration in mirage/ folder by default. To support livereload for the Ember CLI Mirage configuration, the addon must be listed explicitly in EMBROIDER_REBUILD_ADDONS environment variable. If you are working on Mirage configuration, you should start the Ember development server like the following: EMBROIDER_REBUILD_ADDONS=ember-cli-mirage ember s Note for Prettier users There's an Ember CLI bug that exposes itself when using Prettier + Mirage. A longer-term fix is in the works, but for now, if you're using Prettier and install Mirage, you can either pin eslint-plugin-prettier to 2.6.0, or add the following to .eslintignore: /mirage/mirage Note for FastBoot users You might expect Mirage to serve network requests made by your FastBoot app, but because Mirage runs only in the browser, it currently disables itself if your app is being served by FastBoot. FastBoot support is a highly requested feature we are working on. In the meantime, you'll need to develop your FastBoot pages against a local server. You can always bypass FastBoot page generation locally by running FASTBOOT_DISABLED=true ember serve Mirage will then run in the browser as expected, and you can develop your client app as normal. ","route":"templates.docs.getting-started.installation","keywords":[]},"template:templates/docs/getting-started/overview":{"id":"template:templates/docs/getting-started/overview","type":"template","title":"Overview","text":" Overview The file mirage/config.js contains the boilerplate code to create a mirage server. You can customize the server that is created here by following the mirage documentation https://miragejs.com/docs/getting-started/overview/ Mirage lets you simulate API responses by writing route handlers. The simplest example of a route handler is a function that returns an object: // mirage/config.js function routes() { this.namespace = 'api'; this.get('/movies', () => { return { data: [ { id: 1, type: 'movies', attributes: { name: 'Interstellar' } }, { id: 2, type: 'movies', attributes: { name: 'Inception' } }, { id: 3, type: 'movies', attributes: { name: 'Dunkirk' } }, ] }; }); } Now whenever your Ember app makes a GET request to /api/movies, Mirage will respond with this data. Dynamic data This works, and is a common way to simulate HTTP responses - but hard-coded responses like this have a few problems: They're inflexible. What if you want to change the data for this route in your tests? They contain formatting logic. Logic that's concerned with the shape of your JSON payload (e.g. the data and attributes keys) is now duplicated across all your route handlers. They're too basic. Inevitably, when your Mirage server needs to deal with more complex things like relationships, these simple ad hoc responses start to break down. Mirage provides a data layer that lets you write more powerful server implementations. Let's see how it works by replacing our basic stub data above. Creating a model First, we'll need to tell Mirage that we have a dynamic Movie model. If you're using Ember Data and you already have a Movie model defined, you can skip this step! Mirage will automatically generate its models from your Ember Data definitions, so you won't have any files in the mirage/models directory. If you're not using Ember Data, you can use the mirage-model generator to create a model from the command line: $ ember g mirage-model movie This generates the following file: // mirage/models/movie.js import { Model } from 'miragejs'; export default Model.extend({ }); Writing a dynamic route handler Models let our route handlers take advantage of Mirage's in-memory database. The database makes our route handlers dynamic, so we can change the data that's returned without having to rewrite the handler. Let's update our route handler to be dynamic: this.get('/movies', (schema, request) => { return schema.movies.all(); }); The schema argument lets us access our new Movie model. This route will now respond with all the authors in Mirage's database at the time of the request. We can therefore change the data this route responds with by only changing what records are in Mirage's database, instead of having to write a different version of the handler for each scenario we want to simulate. Seeding the database Right now, if we sent a request to our new handler above, the response would look something like this: // GET /api/movies data: [ ] That's because Mirage's database is empty. To actually seed our database with fake data, we'll use factories. Factories are objects that make it easy to generate realistic-looking data for your Mirage server. Think of them as blueprints for your models. Let's create a factory for our author with $ ember g mirage-factory movie We can then define some properties on our Factory. They can be simple types like Booleans, Strings or Numbers, or functions that return dynamic data: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title(i) { return `Movie ${i}`; // Movie 1, Movie 2, etc. }, year() { let min = 1950; let max = 2019; return Math.floor(Math.random() * (max - min + 1)) + min; }, rating: \"PG-13\" }); This factory creates objects like [ { title: 'Movie 1', year: 1992, rating: \"PG-13\" }, { title: 'Movie 2', year: 2008, rating: \"PG-13\" }, // ... ] and so on, which will automatically be inserted into the movies database table. The database will assign each record an id, and now we can interact with this data in our route handlers. To actually use our new factory definition, we can call the server.create and server.createList methods. To seed our development database, use the function in the scenarios/default.js file: // mirage/scenarios/default.js export default function(server) { server.createList('movie', 10); }; Now when our Ember app makes a GET request to /api/movies using the route handler above, we'll see something that looks like this: // GET /api/movies data: [ { id: 1, type: \"movies\", attributes: { title: \"Movie 1\", year: 1992, rating: \"PG-13\" } }, { id: 2, type: \"movies\", attributes: { title: \"Movie 2\", year: 2008, rating: \"PG-13\" } }, // ... ] As we can see, this response is now influenced by the run-time state of our database. In acceptance tests, scenarios/default.js is ignored, and instead you can use this.server to setup your database in the state needed for the test: // tests/acceptance/movies-test.js import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test(\"I can view the movies\", async function(assert) { this.server.createList(\"movie\", 3); await visit(\"/home\"); assert.dom(\"[data-test-id='movie-row']\").exists({ count: 3 }); }); }); You can also pass attribute overrides directly to create or createList: test(\"I can view the movie title\", async function(assert) { let movie = this.server.create('movie', { title: \"Interstellar\" }); await visit(`/movies/${movie.id}`); assert.dom('h1').includesText(\"Interstellar\"); }); You now have a simple way to set up your Mirage server's initial data, both during development and on a per-test basis. Associations Dealing with associations is always tricky, and faking endpoints that deal with associations is no exception. Fortunately, Mirage ships with an ORM to help keep your route handlers clean. Let's say your movie has many cast-members. You can declare this relationship in your model: // mirage/models/movie.js import { Model, hasMany } from 'miragejs'; export default Model.extend({ castMembers: hasMany() }); // mirage/models/cast-member.js import { Model, belongsTo } from 'miragejs'; export default Model.extend({ movie: belongsTo() }); Now Mirage knows about the relationship between these two models, which can be useful when writing route handlers: this.get('/movies/:id/cast-members', (schema, request) => { let movie = schema.movies.find(request.params.id); return movie.castMembers; }); and when creating graphs of related data: test(\"I can see a movie's cast members\", async function(assert) { server.create('movie', { title: 'Interstellar', castMembers: [ server.create('cast-member', { name: 'Matthew McConaughey' }), server.create('cast-member', { name: 'Anne Hathaway' }), server.create('cast-member', { name: 'Jessica Chastain' }) ] }); await visit('/'); assert.dom('li.cast-member').exists({ count: 3 }); }); Mirage uses foreign keys to keep track of these related models for you, so you don't have to worry about any messy bookkeeping details while your Ember app reads and writes new relationships to Mirage's database. Serializers Mirage is designed for you to be able to completely replicate your production server. So far, we've seen that Mirage's default payloads are formatted using the JSON:API spec. This spec produces payloads that look like this: // GET /movies/1 { data: { id: 1, type: 'movies', attributes: { title: 'Interstellar' } } } New Ember apps using Ember Data work well with the JSON:API format, but of course, not every backend uses JSON:API. For example, your API responses might look more like this: // GET /movies/1 { movies: { id: 1, title: 'Interstellar' } } This is why Mirage serializers exist. Serializers let you customize the formatting logic of your responses, without having to change your route handlers, models, relationships, or any other part of your Mirage setup. Mirage ships with a few named serializers that match popular backend formats. You can also extend from the base class and use formatting hooks to match your own backend: // mirage/serializers/application.js import { Serializer } from 'miragejs'; export default Serializer.extend({ keyForAttribute(attr) { return dasherize(attr); }, keyForRelationship(attr) { return dasherize(attr); } }); Mirage's serializer layer is also aware of your relationships, which helps when faking endpoints that sideload or embed related data: // mirage/serializers/movie.js import { Serializer } from 'miragejs'; export default Serializer.extend({ include: [ 'crewMembers' ] }); // mirage/config.js function routes() { this.get('/movies/:id', (schema, request) => { return schema.movies.find(request.params.id); }); } With the above config, a GET to /movies/1 would return automatically include related crew members: { movie: { id: 1, title: 'Interstellar' }, 'crew-members': [ { id: 1, 'movie-id': 1, name: 'Matthew McConaughey' }, { id: 1, 'movie-id': 1, name: 'Anne Hathaway' }, ... ] } Mirage ships with two named serializers, JSONAPISerializer and ActiveModelSerializer, to save you the trouble of writing this custom code yourself. See the serializer guide to learn more. Shorthands Mirage has shorthands to reduce the code needed for conventional API routes. For example, the route handler this.get('/authors', (schema, request) => { return schema.authors.all(); }); can be written as this.get('/authors'); There are also shorthands for post, patch (or put), and del methods. Here's a full set of resourceful routes for an author resource: this.get('/authors'); this.get('/authors/:id'); this.post('/authors'); this.patch('/authors/:id'); this.del('/authors/:id'); Shorthands make writing your server definition concise, so use them whenever possible. When mocking a new route, you should always start with a Shorthand, and then drop down to a function route handler when you need more control. Passthrough Mirage is a great tool to use even if you're working on an existing app, or if you don't want to fake your entire API. By default, Mirage throws an error if your Ember app makes a request that doesn't have a corresponding route handler defined. To avoid this, tell Mirage to let unhandled requests pass through: // mirage/config.js this.passthrough(); Now you can develop as you normally would, for example against an existing API. When it comes time to build a new feature, you don't have to wait for the API to be updated. Just define the new route that you need // mirage/config.js this.get('/comments'); this.passthrough(); and you can fully develop and test the feature. In this way you can build up your fake server piece by piece - adding some solid acceptance tests along the way. That should be enough to get you started! The rest of the docs are organized by Mirage's higher-level concepts: Route handlers contain the logic around what run-time data Mirage uses to respond to requests. The Data layer is how Mirage stores and tracks changes to your data over time. Keep reading to learn more! ","route":"templates.docs.getting-started.overview","keywords":[]},"template:templates/docs/getting-started/upgrade-guide/index":{"id":"template:templates/docs/getting-started/upgrade-guide/index","type":"template","title":"Upgrade guide","text":" Upgrade guide If you're upgrading from an existing version of Mirage, you can run the following: # Using npm npm install -D ember-cli-mirage@X.X.X # Using yarn yarn add -D ember-cli-mirage@X.X.X Full Changelog You can view all of Mirage's release notes on our Releases page. 3.0 Upgrade guide Ensure that all the imports are updated for the objects that were moved to MirageJS. This is generally the imports in the files in the mirage directory. // from import { Model } from 'ember-cli-mirage'; //to import { Model } from 'miragejs'; Previous the file mirage/config.js was a exported default function that defined only your routes. Since MirageJS has been extracted into its own repo, we want to follow the way a server is made in MirageJS. Change the routes function to no longer be exported as the default function and give it a name, we suggest routes. Add the below boilerplate code to the top of the mirage/config.js. The end result would look like this. import { discoverEmberDataModels, } from 'ember-cli-mirage'; import { createServer } from 'miragejs'; export default function (config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes, }; return createServer(finalConfig); } // This would be your old default export function renamed function routes() { } The environment variable discoverEmberDataModels is now longer used. If you wish to not have ember-cli-mirage auto discover the models, just remove the ...discoverEmberDataModels(), 2.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Update import paths for miragejs imports 1.0 Upgrade guide There were a few breaking changes made in the 1.0 release. 1. Remove Faker.js When Mirage was first released, including npm libraries into Ember CLI apps was difficult. You needed to generate a vendor shim and call app.import in order to use the library in your application code. Because of all this ceremony, it was common for addons to do that work for you, and bundle related packages. This is exactly what Mirage did for Faker.js, a useful library to have alongside your Mirage factory definitions. There's a few problems with this, most notably that users had to use the version of Faker that was bundled with Mirage. It was frustrating not being able to take advantage of new Faker features until Mirage upgraded its bundled version. Now, thanks to Ember Auto Import, this is no longer the case. Using dependencies directly from npm is painless – just yarn/npm install them and import them directly from your ES6 classes. Thanks to Auto Import, all that ceremony is taken care of for you. This also means that users can easily manage their project's version of Faker (and other similar dependencies) independently of the version of Mirage they're using. For this reason, in 1.0 we are no longer bundling Faker.js with Mirage. This is a breaking change. Here are the steps you'll need to take to fix this: Install Ember Auto Import (if it's not already installed) ember install ember-auto-import Install Faker.js directly from npm: yarn add -D faker # or npm install --save-dev faker Change all imports of faker from the ember-cli-packge to import directly from faker: - import { Factory, faker } from 'miragejs'; + import { Factory } from 'miragejs'; + import faker from 'faker'; There is a codemod that will do this for you, thanks to the gracious work of Casey Watts. Additionally, when I originally bundled Faker, I monkey-patched it with some methods that I thought would be \"useful\" additions. I thought this was a good idea at the time... it wasn't. 🙈 You can look at the module from v0.4.15 to see that we added the faker.list.random, faker.list.cycle and faker.random.number.range methods, so if you use these methods too, you'll need to refactor them. Fortunately, two of them have been added to recent versions of Faker, and one can be replaced with some simple JS: For faker.list.random, use faker.random.arrayElement: countries() { - return faker.list.random([ 'United States of America', 'Canada', 'Mexico' ]); + return faker.random.arrayElement([ 'United States of America', 'Canada', 'Mexico' ]); } For faker.list.cycle, use the remainder (modulo) operator: countries(i) { - return faker.list.cycle([ 'United States of America', 'Canada', 'Mexico' ]); + let countries = [ 'United States of America', 'Canada', 'Mexico' ]; + + return countries[i % countries.length]; } For faker.random.number.range, use faker.random.number with min and max options: age() { - return faker.random.number.range(18, 65); + return faker.random.number({ min: 18, max: 65 }); } After that, you should be on your own with respect to Faker! Thanks to Auto Import, you can change versions, or even try out other libraries like Chance.js, and rest easy knowing Mirage is a bit slimmer and one less thing is beyond your control. 2. New import for setupMirage Please use the new named import for the setupMirage test helper. The old one still works for now but is not robust to us refactoring the internal file location. The named export is also more aligned with the rest of the ecosystem. // Before import setupMirage from \"ember-cli-mirage/test-support/setup-mirage\"; // After import { setupMirage } from \"ember-cli-mirage/test-support\"; 3. Remove deprecated forms of create, createList and normalizedRequestAttrs There are several places in Mirage's APIs that were intended to be used with singularized versions of model names, but just so happened to work if a non-singularized version was passed in. This behavior was discovered during a refactor, and the non-singularized versions were maintained to avoid breaking apps. Now that we're moving to 1.0, we're removing this deprecated/unintentional behavior. server.create and server.createList were coded to take a singularized model name, e.g. server.create('user'). It just so happens that server.create('users') also works. That pluralized version is now removed from Mirage. If you're running the latest 0.x version you should see a deprecation message letting you know where to change it. Otherwise, it should be a pretty mechanic change from things like server.create('users') to server.create('user'). Note this also applies to server.createList – the correct form is server.createList('user', 3), and the pluralized form server.createList('users', 3) is now unsupported. this.normalizedRequestAttrs in a route handler optionally takes a modelName as an argument. This is if your URLs are non-standard and Mirage cannot guess the modelName from the URL path. In this case, you can call this.normalizedRequestAttrs('blog-post') to tell Mirage to expect the payload to be for a blog-post model. This API was intended to be used with dasherized names, because that's how compound model names are specified throughout Mirage when they are represented as strings. It just so happened that this.normalizedRequestAttrs('blogPost') also worked, by chance, until a refactor. So, that behavior was kept but now is being removed. The correct usage is this.normalizedRequestAttrs('blog-post'). Using the camelized version of the model name is no longer supported. If either of these changes cause a ton of refactoring pain, we can try to marshal some resources to help write a codemod. Please open an issue if that's the case! 4. The normalizeIds serializer property now defaults to true This applies to the ActiveModelSerializer and RestSerializer. The normalize property on serializers helps Mirage's shorthands work by transforming differently formatted payloads into JSON:API documents. These documents are then used by Mirage to update the database accordingly. There was a gap in the default normalize method for a long time, in that it didn't take REST payloads that included foreign keys and looked like let payload = { contact: { id: 1, name: \"Link\", address: 1 } }; and turn that address key into a proper JSON:API relationship: data: { type: 'contacts', id: 1, attributes: { name: 'Link' }, relationships: { address: { data: { type: 'address', id: 1 } } } } We added this feature a while ago, and it's controlled with the normalizeIds property on the ActiveModelSerializer and RESTSerializer. (We did this so the feature wouldn't be a breaking change.) We're now making true the default, which should be the behavior everyone desires (assuming they're using shorthands). This is technically a breaking change, though it's unlikely to affect most people. 0.3.x → 0.4 Upgrade guide There is one primary change in 0.4 that could break your 0.3 app. In 0.3.x, Mirage's JSONAPISerializer included all related foreign keys whenever serializing a model or collection, even if those relationships were not being included in the payload. This actually goes against JSON:API's design. Foreign keys in the payload are known as Resource Linkage and are intended to be used by API clients to link together all resources in a JSON:API compound document. In fact, most server-side JSON:API libraries do not automatically serialize all related foreign keys, and only return linkage data for related resources when they are being included in the current document. By including linkage data for every relationship in 0.3, it was easy to develop Ember apps that would work with Mirage but would behave differently when hooked up to a standard JSON:API server. Since Mirage always included linkage data, an Ember app might automatically be able to fetch related resources using the ids from that linkage data plus its knowledge about the API. For example, if a post came back like this: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { data: { type: 'users', id: '1' } } } } } and you forgot to ?include=author in your GET request, Ember Data would potentially use the user:1 foreign key and lazily fetch the author by making a request to GET /authors/1. This is problematic because This is not how foreign keys are intended to be used It'd be better to see no data and fix the problem by going back up to your data-loading code and add ?include=author to your GET request, or If you do want your interface to lazily load the author, use resource links instead of the resource linkage data: // GET /posts/1 { data: { type: 'posts', id: '1', attributes: { ... }, relationships: { author: { links: { related: '/api/users/1' } } } } } Resource links can be defined on Mirage serializers using the links method (though including is likely the far more simpler and common approach to fetching related data). So, Mirage 0.4 changed this behavior and by default, the JSONAPISerializer only includes linkage data for relationships that are being included in the current payload (i.e. within the same compound document). This behavior is configurable via the alwaysIncludeLinkageData key on your JSONAPISerializers. It is set to false by default, but if you want to opt-in to 0.3 behavior and always include linkage data, set it to true: // mirage/serializers/application.js import { JSONAPISerializer } from \"ember-cli-mirage\"; export default JSONAPISerializer.extend({ alwaysIncludeLinkageData: true }); If you do this, I would recommend looking closely at how your real server behaves when serializing resources' relationships and whether it uses resource links or resource linkage data, and to update your Mirage code accordingly to give you the most faithful representation of your server. 0.2.x → 0.3 Upgrade guide The main change from 0.2.x to 0.3.x is that relationships are now one-way. This better matches the semantics of both Ember Data and common HTTP transfer protocols like JSON:API. In 0.2, the following model definitions // mirage/models/author.js import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); would have generated a \"schema\" with a one-to-many relationship between authors and posts: an author has many posts, and a post belongs to an author. Now, this just generates a one-way relationship from post to author. To have a two-way sync'd relationship, known as an inverse, you'd need to define both sides of the relationship: // mirage/models/author.js import { Model, hasMany } from \"ember-cli-mirage\"; export default Model.extend({ posts: hasMany() }); // mirage/models/post.js import { Model, belongsTo } from \"ember-cli-mirage\"; export default Model.extend({ author: belongsTo() }); Practically speaking, to upgrade you'll need to go through your code and update relationships that implicitly had inverses (from 0.2.x's hasMany and belongsTo behavior) and update them to define both sides. This could also affect your fixture files, if you are using those to seed your database. Instead of just having an authorId on the post above, for example, you'd also need the author to have a postIds: [] array. (In general Factories are better for seeding your database, as they save you from having to manage ids at all.) Conceptually this change should be straightforward, as its making existing implicit relationships explicit, but if you find yourself having trouble with the upgrade it's probably because of something I haven't thought of. Please reach out to the community on the #ec-mirage channel on Slack and ask for help! For more information on the motivation behind change, please read the 0-3 beta series release blog post. 0.1.x → 0.2 Upgrade guide If you're upgrading your Mirage server from v0.1.x to v0.2.x, here's what you need to know: The default Mirage directory has changed. The default Mirage directory has moved from /app/mirage to /mirage. When you install 0.2.0, the default blueprint will add the /mirage directory to your project. You can delete it and move your current Mirage files to the new location with something like rm -rf mirage mv app/mirage mirage from the root of your project. Mirage's directory is also customizable (Although you should move it from the /app directory or else it will not be removed from the build in production mode). All multiword filenames are dasherized. In Mirage 0.1.x, database collection names were taken from filenames. The idea was, if your API returned snake_case collection keys (e.g. blog_posts: []), just name your file fixtures/blog_posts.js. This approach turned out to be insufficiently flexib-- what am I saying, it was just a bad idea :P. In Mirage 0.2.x, we follow Ember CLI's conventions of dasherized filenames. So, you'll just need to go through and change /mirage/factories/blog_post.js /mirage/fixtures/blog_post.js # etc. to /mirage/factories/blog-post.js /mirage/fixtures/blog-post.js You will then use the new Serializer layer to do things like format keys in your json payloads. All JavaScript properties are camelCased. Similar to the previous change, factory properties and database collection names followed the format of your API in Mirage 0.1.x. If you were faking an ActiveModelSerializer backend, multiword keys used snake_case throughout your Mirage code. So, your database table might be db.blog_posts, and your factory keys might be first_name() {..}. Looks pretty cool right? Wrong. We're JavaScript developers here, people. It's time to start using camelCase. (Also, the idea of tying these keys to your serialization format was bad, as it left us without any conventions. We need to stick to a single format, so the ORM knows how to find foreign keys.) You'll need to update your route handlers, which may look like this: let posts = db.blog_posts.filter(p => p.author_id === 1); to let posts = db.blogPosts.filter(p => p.authorId === 1); Note that everything is camelCased, including foreign keys. Similarly, factories that look like export default Factory.extend({ first_name() { return faker.name.firstName(); }, last_name() { return faker.name.firstName(); } }); should be changed to export default Factory.extend({ firstName() { return faker.name.firstName(); }, lastName() { return faker.name.firstName(); } }); This goes for all attrs that server.create takes (and returns), etc. For many this will be the most painful part of the upgrade. Please find it in your heart to forgive me. Mirage now has its own Model layer (an ORM). In Mirage 0.1.x, you had to define either a factory or a fixture file (or both) in order for a database collection to be created, which let you take advantage of the db in your route handlers. In 0.2, we've introduced Mirage Models, which serve as the new canonical source of truth about your database. To create a model, use ember g mirage-model blog-post This will create a file like import { Model } from \"ember-cli-mirage\"; export default Model.extend({}); Having that file sets up the db.blogPosts collection, allows you to use the JSON:API serializer, and more. You can still define factories and fixtures - but only if you need them. Models, factories and fixtures all work together, but now you won't be making blank factory or fixture files just to set up your database. The models themselves serve as the source of truth. We needed to add models for association support (which currently exists) and factory relationships (the first feature to come after the 0.2 release). Read through the models guide and serializers guide to see how having models can simplify your Mirage server. We also have a plan to make a separate addon that could ascertain your model definitions and their relationships from your Ember Data models. Adding the ORM paves the way for this important future addition. Currently, Mirage will still work if a factory/fixture file is defined for a particular db collection without a corresponding model. Eventually, we may require all setups to have model definitions for each collection. But for now, to make for an easier upgrade path, you can start generating models and opt-in to the ORM layer in piecemeal. The ORM object schema is now injected into route handlers. In Mirage 0.1.x, the db was the first parameter injected into route handlers: this.get(\"/posts\", function(db, request) { // work with db }); Now, the schema object is, so you can take advantage of the Model layer. Fortunately, the db hangs directly off of the schema, so you can leave all your old route handler code intact (with the exception of making the change to camelCase), and just use destructuring to change the function signature to this.get(\"/posts\", function({ db }, request) { // work with db }); and then start opting-in to the ORM (and using schema) one route handler at a time. Specify a Serializer. If you're using shorthands, you'll need to pick a serializer in /mirage/serializers/application.js. See the serializers guide for details. You can always view the full changelog to see everything that's changed. If you think this guide missed a critical part of the upgrade path, please open an issue! ","route":"templates.docs.getting-started.upgrade-guide.index","keywords":[]},"template:templates/docs/getting-started/upgrade-guide/v2-deprecations":{"id":"template:templates/docs/getting-started/upgrade-guide/v2-deprecations","type":"template","title":"Deprecations Added in v2.x of ember-cli-mirage","text":" Deprecations Added in v2.x of ember-cli-mirage miragejs re-exports only exporting routes as the default function ","route":"templates.docs.getting-started.upgrade-guide.v2-deprecations","keywords":[]},"template:templates/docs/getting-started/what-is-mirage":{"id":"template:templates/docs/getting-started/what-is-mirage","type":"template","title":"What is Mirage?","text":" What is Mirage? Mirage is a JavaScript library that lets frontend developers mock out backend APIs. Unlike other mocking libraries, Mirage makes it easy to reproduce dynamic scenarios that are typically only possible when using a true production server. Equipped with a Mirage server, a frontend developer can build, test, and even share a complete working Ember application without having to use or configure any backend services. Why? Mirage was originally built to bring conventions to some home-grown HTTP mocking code that was getting unwieldy. It ended up proving most useful when it enabled frontend developers to work on their apps without having to rely on any local or staging backend services as part of their normal development workflow. Since then, Mirage has focused on making it as easy as possible for Ember developers to maintain a mock server alongside their codebase. How it works Mirage runs in the browser. It uses Pretender.js to intercept and respond to any network requests your Ember app makes, letting you build your app as if it were talking to a real server. In this way, you can develop and test your app against various server states without having to modify any application code. In addition to intercepting HTTP requests, Mirage provides a mock database and helper functions that make it easy to simulate dynamic backend services. Mirage borrows concepts from server-side frameworks like routes to handle HTTP requests a database and models for storing data and defining relationships factories and fixtures for stubbing data, and serializers for formatting HTTP responses to make it easy to simulate production server behavior. Alternatives These other libraries solve similar problems to Mirage and might be a better fit for your needs: Polly.js, a library for recording and replaying HTTP interactions Pretender.js, the low-level HTTP interceptor powering Mirage Ember Data Factory Guy, factories for Ember apps powered by Ember Data ","route":"templates.docs.getting-started.what-is-mirage","keywords":[]},"template:templates/docs/route-handlers/functions":{"id":"template:templates/docs/route-handlers/functions","type":"template","title":"Functions","text":" Functions Function handlers are the most flexible way to write route handlers in Mirage. To define new function handlers, use the get, post, patch (or put) and del methods. Here's an example: // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); Now when your Ember app makes a GET request to /movies, it will receive this data. Each verb method has the same signature. The first argument is the path (URL) and the second is the actual function handler that returns the response. this.get('/movies', () => { ... }); this.post('/movies', () => { ... }); this.patch('/movies/:id', () => { ... }); this.del('/movies/:id', () => { ... }); Timing The last argument to a route handler is an options object you can use to adjust the timing. Use this to delay the response of a particular route and see how your Ember app behaves when communicating with a slow network. // mirage/config.js this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }, { timing: 4000 }); The default delay is 50ms during development, and 0 during testing (so your tests run fast). You can also set a global timing parameter for all routes. Individual timing parameters override the global setting. // mirage/config.js export default function() { this.namespace = 'api'; this.timing = 2000; this.get('/movies', () => { return [ 'Interstellar', 'Inception', 'Dunkirk' ]; }); this.get('/complex-query', () => { return [1, 2, 3, 4, 5]; }, { timing: 3000 }); } If you want to add delays to a test, you can override the timing for individual tests by putting the timing parameter in your test test('this route works with a delay', function() { server.timing = 10000; // ... }); Because the server is reset after each test, this option won't leak into the rest of your suite. Accessing the data layer Route handlers receive schema as their first parameter, which lets them access Mirage's data layer: this.get('/movies', (schema) => { return schema.movies.all(); }); Most of your route handlers will interact with the data layer in some way. The second parameter is the request object, which contains information about the request your Ember app made. For example, you can access dynamic URL segments from it: this.get('/movies/:id', (schema, request) => { let id = request.params.id; return schema.movies.find(id); }); You can also access the request body, for example to handle a POST or PATCH request that contains data sent over by the Ember app: this.post('/movies', (schema, request) => { let title = JSON.parse(request.requestBody).title; return schema.movies.create({ title }); }); The normalizedRequestAttrs helper (documented below) provides some sugar for working with the request data. Dynamic paths and query params The request object that's injected into your route handlers contains any dynamic route segments and query params. To define a route that has a dynamic segment, use colon syntax (:segment) in your path. The dynamic piece will be available via request.params.[segment]: this.get('/authors/:id', (schema, request) => { let id = request.params.id; return schema.authors.find(id); }) Query params from the request can also be accessed via request.queryParams.[param]. Helpers There are several helpers available when writing function route handlers. serialize This helper returns the JSON for the given Model or Collection after passing it through the Serializer layer. It's useful if you want to do some final munging on the serialized JSON before returning it. this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies); json.meta = { page: 1 }; return json; }); By default this method uses the named serializer for the given Model or Collection. You can pass in a specific serializer name as the second argument: this.get('/movies', function (schema) { let movies = schema.movies.all(); let json = this.serialize(movies, 'sparse-movie'); json.meta = { page: 1 }; return json; }); normalizedRequestAttrs This helper returns the body of a request in a normalized form, suitable for working with and creating records. For example, if your Ember app makes a POST request with this data // POST /users { data: { type: 'users', attributes: { 'first-name': 'Conan', 'middle-name': 'the', 'last-name': 'Barbarian' }, relationships: { team: { data: { type: 'teams', id: 1 } } } } } then normalizedRequestAttrs() could be used like this this.post('/users', function(schema, request) { let attrs = this.normalizedRequestAttrs(); /* attrs = { firstName: 'Conan', middleName: 'the', lastName: 'Barbarian', teamId: '1' } */ return schema.users.create(attrs); }); Note that attribute keys were camelCased, and the team foreign key was extracted. This is because a user owns the team foreign key; if another relationship were included in the request but the user did not own its foreign key, it would not have been extracted. This helper method leverages your serializer's normalize method. In the example above, it's assumed that the app was using the JSONAPISerializer, which comes with the #normalize method already written. If you're not using one of the bundled serializers, you'll need to implement #normalize and have it return a JSON:API document to take advantage of this method. Additionally, you'll need to use a full function here, as opposed to an ES6 arrow function (e.g () => { ... }). This is because normalizedRequestAttrs requires the this context from the function handler, and an arrow function would bind this from the outer scope. normalizedRequestAttrs() relies on a modelName to work and attempts to automatically detect it based on the URL of the request. If you use conventional URLs – for example, PATCH /users/1 – the helper should work. If you are using something custom – for example, PATCH /users/edit/1 – you’ll need to provide the modelName to the helper as the first argument: this.patch('/users/edit/:id', function(schema, request) { let attrs = this.normalizedRequestAttrs('user'); // ... }); Status codes and headers By default, Mirage sets the HTTP status code of a response based on the verb being used for the route: GET is 200 PATCH/PUT is 204 POST is 201 DEL is 204 PATCH/PUT and POST change to 200 if there is a response body. Additionally, a header for Content-Type is set to application/json. You can customize both the response code and headers by returning an instance of the Response class in your route handler: // mirage/config.js import { Response } from 'miragejs'; export default function() { this.post('/authors', function(schema, request) { let attrs = JSON.parse(request.requestBody).author; if (attrs.name) { return schema.authors.create(attrs); } else { return new Response(400, { some: 'header' }, { errors: ['name cannot be blank'] }); } }); } External origins You can use Mirage to simulate other-origin requests. By default, a route like this.get('/contacts', ...) will hit the same origin that's serving your Ember app. To handle a different origin, use a fully qualified domain name: this.get('http://api.twitter.com/v1', ...) If your entire Ember app uses an external (other-origin) API, you can globally configure the domain via urlPrefix: // mirage/config.js this.urlPrefix = 'https://my.api.com'; // This route will handle requests to https://my.api.com/contacts this.get('/contacts', ...) That's it on writing low-level function route handlers! Function route handlers are flexible, but also cumbersome to write out for every endpoint. If you're working with an API that's conventional enough, hopefully you'll be writing fewer function route handlers and more Shorthands, which we'll discuss in the next section. ","route":"templates.docs.route-handlers.functions","keywords":[]},"template:templates/docs/route-handlers/shorthands":{"id":"template:templates/docs/route-handlers/shorthands","type":"template","title":"Shorthands","text":" Shorthands APIs have become more standardized, so Mirage has the concept of Shorthands to deal with common scenarios. Shorthands can replace many of your custom route handlers, dramatically simplifying your server definition. For example, this function route handler this.get('/movies', (schema, request) => { return schema.movies.all(); }); is pretty standard: it responds to a URL path with a collection of the same name. The Shorthand form of this is this.get('/movies'); This is a complete route handler. It infers the model name from the last part of the URL, and returns the corresponding collection. Returning a single movie by ID is just as easy: this.get('/movies/:id'); There are also Shorthands for creating and editing data. For example, this function route handler creates a new movie: this.post('/movies', (schema, request) => { let attrs = JSON.parse(request.requestBody).movie; return schema.movies.create(attrs); }); It's also pretty standard: it creates a new model using the attributes from the request payload. The equivalent Shorthand is this.post('/movies'); See the full list of available Shorthands below. Shorthands use default status codes based on the HTTP verb: GET, PATCH/PUT and DEL are 200 POST is 201 GET Shorthands Fetching a collection: // Shorthand this.get('/contacts'); // finds type by singularizing url this.get('/contacts', 'users'); // optionally specify the collection as second param // equivalent this.get('/contacts', (schema) => { return schema.contacts.all(); // users in the second case }); Fetching a model: // Shorthand this.get('/contacts/:id'); // finds type by singularizing url this.get('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.get('/contacts/:id', (schema, request) => { let id = request.params.id; return schema.contacts.find(id); // users in the second case }); Fetching multiple models by ID (for example, GET /contacts?ids=1,3): // Shorthand this.get('/contacts', { coalesce: true }); this.get('/contacts', 'users', { coalesce: true }); // equivalent this.get('/contacts', ({ contacts }, request) => { let ids = request.queryParams.ids; return contacts.find(ids); // users in the second case }); POST Shorthands Creating a resource: // Shorthand this.post('/contacts'); // finds type by singularizing url this.post('/contacts', 'user'); // optionally specify the type as second param // equivalent this.post('/contacts', function(schema, request) { let attrs = this.normalizedRequestAttrs(); return schema.contacts.create(attrs); }); For this POST shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. PATCH/PUT Shorthands Updating a resource: // Shorthand (these also work with this.put) this.patch('/contacts/:id'); // finds type by singularizing url this.patch('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.patch('/contacts/:id', function(schema, request) { let id = request.params.id; let attrs = this.normalizedRequestAttrs(); return schema.contacts.find(id).update(attrs); }); For this PATCH shorthand to work, Mirage needs to know the format of the JSON payload your Ember app sends along with the request, so that it can insert the appropriate data into the database. See the note on normalize in the Serializer docs for more information. DELETE Shorthands Destroying a resource: // Shorthand this.del('/contacts/:id'); // finds type by singularizing url this.del('/contacts/:id', 'user'); // optionally specify the type as second param // equivalent this.del('/contacts/:id', (schema, request) => { let id = request.params.id; schema.contacts.find(id).destroy(); }); Destroying a resource and related models: // Shorthand this.del('/contacts/:id', ['contact', 'addresses']); // equivalent this.del('/contacts/:id', ({ contacts }, request) => { let id = request.params.id; let contact = contacts.find(id); contact.addresses.destroy(); contact.destroy(); }); To use this Shorthand, you must have the appropriate hasMany/belongsTo relationships defined in your data layer. Resource helper The resource helper lets you define multiple Shorthands for a given resource: // Resource helper usage this.resource('contacts'); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.patch('/contacts/:id'); // and this.put('/contacts/:id') this.del('/contacts/:id'); You can also whitelist which Shorthands will be defined using the only option: this.resource('contacts', { only: [ 'index', 'show' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); or which route handlers shouldn't be defined using except option: this.resource('contacts', { except: [ 'update' ] }); // Shorthands defined this.get('/contacts'); this.get('/contacts/:id'); this.post('/contacts'); this.del('/contacts/:id'); If your route path and collection names do not match, you can define a relative or absolute path using the path option: this.resource('blog-posts', { path: '/posts' }); // Shorthands defined this.get('/posts', 'blog-posts'); this.get('/posts/:id', 'blog-posts'); this.post('/posts', 'blog-posts'); this.put('/posts/:id', 'blog-posts'); this.patch('/posts/:id', 'blog-posts'); this.del('/posts/:id', 'blog-posts'); Here is the full reference of the actions' names you can pass to the only / except options and the Shorthands they stand for: Action | Shorthand ------------------------------ index | this.get('/contacts') show | this.get('/contacts/:id') create | this.post('/contacts') update | this.patch('contacts/:id') (or this.put) delete | this.del('/contacts/:id') Shorthands are a key part of staying productive in your frontend codebase, but they only work so well because Mirage has a Data Layer that's aware of your application's domain model. We'll cover how it works in the next few sections of the docs. ","route":"templates.docs.route-handlers.shorthands","keywords":[]},"template:templates/docs/testing/acceptance-tests":{"id":"template:templates/docs/testing/acceptance-tests","type":"template","title":"Acceptance tests","text":" Acceptance tests Acceptance testing your Ember app involves verifying some user behavior. For example, you may want to test that the user can view a list of movies on your app's homepage. Many of these tests rely on a given server state. In other words, you want to test that, given ten movie resources exist on the server at the time the user boots up the app, when the user visits the homepage they see a list of 10 movies. Mirage was originally built specifically for these sorts of high-level tests. Let's see how it works. Assuming you're using Application Tests (introduced in Ember 3.0), add the setupMirage hook to the top of your test file: import { setupApplicationTest } from 'ember-qunit'; + import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); + setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); (If you are using pre-3.0 style tests, Mirage should boot automatically via an initializer. The only other difference is that Mirage is accessed via server, a global, whereas in 3.0-style tests Mirage is accessed via this.server. The rest of this guide will assume 3.0-style tests, but you can just use server in place of this.server and the rest of the documentation applies the same.) Now we can run your Ember app's test suite with ember t -s. In the test environment, Mirage will load all your route handlers from mirage/config.js, but it will ignore your seed data from mirage/scenarios/default.js. That means each test starts off with a clean database state. Within each test, you can use your factories to define your initial server state: test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); After each test, Mirage's server will be reset, so none of this state will leak across tests. Keeping your tests focused Factories are important in keeping code that's relevant to a test as close to that test as possible. In the example above, we wanted to verify that the user would see ten movies, given those movies existed on the server. So, the server.createList('movie', 10) call was directly in the test. Say we wanted to test that when the user visits a details route for a movie titled \"Interstellar,\" they would see that title in an

tag. One way to accomplish this would be to update the movie factory itself: // mirage/factories/movie.js import { Factory } from 'miragejs'; export default Factory.extend({ title: 'Interstellar' }); The problem with this approach is that this change is very specific to this test. Suppose another test needed to verify something different about movies with different titles. Changing the factory to suit that case would break this test. For this reason, you should use create and createList to override specific attributes of your model. This will keep code relevant to your test near your test, without making the rest of your test suite brittle. test('I can view the movies', async function(assert) { this.server.createList('movie', 10); await visit('/'); assert.dom('li.movie').exists({ count: 10 }); }); test(\"I see the movies's title on the detail route\", await function(assert) { let movie = this.server.create('movie', { title: 'Interstellar' }); await visit(`/movies/${movie.id}`); assert.dom('h1').hasText('Interstellar'); }); Arrange, Act, Assert Mirage recommends using the Arrange, Act, Assert approach to write tests. You'll sometimes hear this pattern referred to as AAA testing (\"triple-A testing\"). You can see this structure in our test from above: test('I can view the movies', async function(assert) { // ARRANGE this.server.createList('movie', 10); // ACT await visit('/'); // ASSERT assert.dom('li.movie').exists({ count: 10 }); }); There are of course times where it makes sense to break this rule (for example to add some extra assertions near the beginning or middle of a test), but in general you should strive to follow the pattern. Testing errors To test how your Ember app responds to a server error, overwrite a route handler within a test: test('the user sees an error if the save attempt fails', async function(assert) { this.server.post('/questions', () => ({ errors: [ 'The database went on vacation' ] }), 500); await visit('/'); await click('.new'); await fillIn('input', 'New question'); await click('.save'); assert.dom('h2').hasText('The database went on vacation'); }); This route handler definition is only in effect for the duration of this test, so as soon as it's over any handler you have defined for POST to /questions in your config.js file will be used again. Using scenarios in testing Typically you should reserve the scenarios/default.js file for development, so changes to it don't affect the rest of your test suite. That's why Mirage doesn't autoload this module during tests. If there's some logic you'd like to share between your development scenario and your tests, you can always make a new module under scenarios and import it in both places. If you'd like to load your development scenario in your tests, you can always directly import that module and run your test server through it: Create the module // scenarios/shared.js export default function(server) { server.loadFixtures('countries'); server.createList('event', 10); }; ...load it in your default scenario import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); await visit('/contacts'); assert.dom('p').exists({ count: 3 }); }); ...and then also load it in your tests (or even a common test setup function): import sharedScenario from '../../mirage/scenarios/shared'; test('I can view the authors', async function(assert) { sharedScenario(server); // ... }); This same sort of pattern will work for Integration and Unit tests as well. Those are the basics of Acceptance Testing with Mirage! Next let's talk about Integration and Unit tests. ","route":"templates.docs.testing.acceptance-tests","keywords":[]},"template:templates/docs/testing/assertions":{"id":"template:templates/docs/testing/assertions","type":"template","title":"Assertions","text":" Assertions Most of your tests will assert against your Ember app's UI. After visiting a route and interacting with the app, and after Mirage handles any requests, you'll assert that your UI is in the state you expect it to be. But sometimes even if your UI looks consistent, your app may have a bug on account of sending the wrong data to your server. To address this class of issues, you can assert against the state of your Mirage server within your tests, right alongside your UI assertions. This will give you more confidence that your Ember app is sending over the correct data to your backend. Asserting against Mirage's database The simplest way to assert that your Ember app is sending over the correct data to your backend is to assert against Mirage's database. If the correct data makes it there, you'll have confidence not only that the JSON payloads from your Ember app are correct, but that your Mirage route handlers are behaving as you expect. Here's an example: test(\"I can change the lesson's title\", async function(assert) { this.server.create('lesson', { title: 'My First Lesson' }) await visit('/'); await click('.Edit') await fillIn('input', 'Updated lesson'); await click('.Save'); // Assert against our app's UI assert.dom('h1').hasText('Updated lesson'); // Also check that the data was \"persisted\" to our backend assert.equal(this.server.db.lessons[0].title, 'Updated lesson'); }); This is a great way to gain some extra confidence that your Ember app is sending over the data you expect. Asserting against Mirage Models It can also be useful to assert against Mirage's ORM models, to verify things like updates to your model's relationships: test('I can add a tag to a post', async function(assert) { let programming = this.server.create('tag', { name: 'Programming' }); let post = this.server.create('post'); await visit(`/posts/${post.id}/edit`); await select('.tags', 'Programming'); await click('.save'); assert.dom().includesText('Saved!'); assert.equal(post.reload().tagIds.includes(programming.id)); }); The reload method on Mirage models will rehydrate them with any new database data since they were instantiated, allowing you to verify that your route handler logic worked as expected. Asserting against models is basically another way to verify Mirage's database data is correct. Asserting against handled requests and responses You can also assert against the actual HTTP requests and responses that are made during your test. To do this, first enable Pretender's trackedRequests feature by enabling the trackRequests environment option: // config/environment.js module.exports = function(environment) { if (environment === 'test') { ENV['ember-cli-mirage'] = { trackRequests: true }; } } This feature is disabled by default to avoid memory issues during long development sessions. Now Mirage will track every request (along with the associated response) and make them available to you via server.pretender.handledRequests. That way you can assert against requests in that array at the end of your test. test(\"I can filter the table\", async function(assert) { this.server.createList('movie', 5, { genre: 'Sci-Fi' }); this.server.createList('movie', 3, { genre: 'Drama' }); await visit('/'); await select('.genre', 'Sci-Fi'); // Assert against our app's UI assert.dom('tr').exists({ count: 5 }); // Also assert against the HTTP request count & query let requests = this.server.pretender.handledRequests; assert.equal(requests.length, 1); assert.deepEqual(requests[0].queryParams, { 'filter[genre]': 'Sci-Fi' }); }); In general we recommend asserting against Mirage's database and your UI, as the specifics of your app's HTTP requests should be considered implementation details of the behavior you're actually interested in verifying. But there's certainly valid reasons to drop down and assert against HTTP data. And with that, you've completed the main portion of the guides! Read on to see some advanced use cases and configuration options, or head over to the API docs to see how to use Mirage's various classes. ","route":"templates.docs.testing.assertions","keywords":[]},"template:templates/docs/testing/integration-and-unit-tests":{"id":"template:templates/docs/testing/integration-and-unit-tests","type":"template","title":"Integration and unit tests","text":" Integration and unit tests While Mirage was originally designed for acceptance testing, it also works great when writing integration and unit tests. Let's say you have a data-fetching component, and you want to write a rendering test to verify its behavior. You can import and use the setupMirage function directly in your rendering test, and use Mirage just like you would in an acceptance test. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can fetch records', async function(assert) { this.server.create('movie', { title: 'Interstellar' }); await render(hbs`

{{model.title}}

`); assert.equal(this.element.textContent, 'Interstellar'); }); }); If you want to define some new logic for your Mirage route handlers instead of using the global ones defined in your mirage/config.js file, you can use this.server to setup new routes. import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Integration | Component | FindRecord', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it renders an error state', async function(assert) { this.server.get( '/movies/:id', () => ({ errors: [ 'Something went wrong' ]}), 500 ); await render(hbs` {{#if error}}

Whoops!

{{/if}}
`); assert.equal(this.element.textContent, 'Whoops!'); }); }); Creating Ember Data models on the client with Mirage Something that can be a bit confusing is when you need to write a test against Ember Data models, and you reach for Mirage to help you create some. For example, let's say we were writing a rendering test to verify the behavior of our component: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // get the article await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); How might we test this? It might be tempting to use Mirage's server.create, since you probably already have factories defined: module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // 🔴 Don't do this this.article = this.server.create('article', { title: 'Old title' }); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); But you shouldn't do this. Even though Mirage pulls its initial schema from your Ember Data models, Mirage models don't actually know anything about your Ember app. Mirage models exist solely in your \"backend\", and are only useful in helping you create your mock server definition. The only way data gets from Mirage to your Ember app is via an HTTP request – which is also true for your production server. So, in the same way that you wouldn't create a model in your server-side framework and pass it directly into an Ember component, you should also not pass a Mirage model directly into an Ember component. // 🔴 Don't do this // `article` is a Mirage model. It should never be consumed directly by Ember code. this.article = this.server.create('article'); await render(hbs` `); So, how might we get an article materialized into Ember Data's store so we can test this component, while still leveraging our Mirage factory definitions? Right now, there is no first-class API for this, but one is in the works. In the meantime, there are two common ways to accomplish this. Using findRecord and findAll The first approach is to lookup Ember Data's store, and use it to find the record (just like your Ember application's routes do): import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 1: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); let store = this.owner.lookup('service:store'); this.article = await store.findRecord('article', serverArticle.id); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Writing a helper to push Mirage's database The second approach is to make a helper that serializers Mirage's database into JSON and pushes that JSON into your Ember Data store. The actual logic might depend on the configuration of your Mirage server, but if you're following all of Mirage's conventions it should look roughly like this: // your-app/tests/helpers/push-mirage-into-store.js import { getContext } from '@ember/test-helpers'; import { run } from '@ember/runloop'; export default function() { let context = getContext(); let store = context.owner.lookup('service:store'); Object.keys(context.server.schema) .filter(key => context.server.schema[key].all !== undefined) // Get the resources .forEach(resource => { let models = context.server.schema[resource].all(); let modelName = models.modelName; let serializer = context.server.serializerOrRegistry.serializerFor(modelName); let originalAlwaysIncludeLinkageData = serializer.alwaysIncludeLinkageData; serializer.alwaysIncludeLinkageData = true; let json = serializer.serialize(models); serializer.alwaysIncludeLinkageData = originalAlwaysIncludeLinkageData; run(() => { store.pushPayload(json); }); }); } Now in your test, call your helper to seed Ember Data's store, and then use peekRecord to materialize and work with Ember Data records: import { module } from 'qunit'; import { setupRenderingTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { click, fillIn } from '@ember/test-helpers'; import pushMirageIntoStore from 'YOUR-APP/tests/helpers/push-mirage-into-store'; module('Integration | Component | ArticleForm', function(hooks) { setupRenderingTest(hooks); setupMirage(hooks); test('it can edit an article', async function(assert) { // ✅ Option 2: Use the store to find the record let serverArticle = this.server.create('article', { title: 'Old title' }); pushMirageIntoStore(); let store = this.owner.lookup('service:store'); this.article = store.peekRecord('article', serverArticle.id); await render(hbs` `); await fillIn('input', 'New title'); await click('.save'); // assert the model was saved }); }); Something like pushMirageIntoStore will probably make its way into Mirage at some point. Now that you've seen how to use setupMirage outside of an acceptance test, you can use it in any kind of test where it makes sense to run your Mirage server! Next, we discuss some ways you can go about asserting against your Mirage mock server. ","route":"templates.docs.testing.integration-and-unit-tests","keywords":[]},"template:templates/docs/testing/setup-mirage":{"id":"template:templates/docs/testing/setup-mirage","type":"template","title":"setupMirage test helper","text":" setupMirage test helper In your tests (acceptance, integration and unit) you can import the setupMirage test helper to start the Mirage server. Passing the hooks from the test module allows the mirage server to be created and shutdown before and after each test. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks); test('my first test', async function(assert) { // test code }); }); The second parameter (optional) allows defining the mirage server to be used for this set of tests. import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import makeServer from 'app-name/mirage/config'; // replace app-name with your app name module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); If it is not desirable to use the default config from the mirage directory you could import any other file that implements the same function, or even define the function locally or inline import { setupApplicationTest } from 'ember-qunit'; import { setupMirage } from 'ember-cli-mirage/test-support'; import { discoverEmberDataModels } from 'ember-cli-mirage'; import { createServer } from 'miragejs'; const makeServer = function(config) { let finalConfig = { ...config, models: { ...discoverEmberDataModels(), ...config.models }, routes() { this.namespace = \"api\" this.timing = 2000 this.get(\"/movies\", () => { return [\"Interstellar\", \"Inception\", \"Dunkirk\"] }) } }; return createServer(finalConfig); } module('Acceptance | Homepage test', function(hooks) { setupApplicationTest(hooks); setupMirage(hooks, { makeServer }); test('my first test', async function(assert) { // test code }); }); ","route":"templates.docs.testing.setup-mirage","keywords":[]},"template:templates/index":{"id":"template:templates/index","type":"template","title":"Productive","text":" Productive Spend less time wiring up HTTP stubs, and get back to developing your app. Test-worthy Use factories to define your server's state per test. Acceptance testing just got a whole lot easier. Shareable Share a functional prototype of your app that runs entirely in the client – before writing a single line of your API. Read the docs ","route":"templates.index","keywords":[]},"template:templates/not-found":{"id":"template:templates/not-found","type":"template","title":"Not found","text":" Not found This page doesn't exist. Head home? ","route":"templates.not-found","keywords":[]}}} diff --git a/versions/master/index.html b/versions/master/index.html index c81722048..8f6aed68e 100644 --- a/versions/master/index.html +++ b/versions/master/index.html @@ -7,7 +7,7 @@ - + @@ -97,10 +97,10 @@ - + - - + +