UNPKG

ember-data

Version:

A data layer for your Ember applications.

944 lines • 609 kB
{ "project": { "name": "The ember-data API", "description": "The ember-data API: a data persistence library for Ember.js", "url": "https://github.com/emberjs/data", "version": "v3.21.0" }, "files": { "../../node_modules/ember-inflector/addon/lib/ext/string.js": { "name": "../../node_modules/ember-inflector/addon/lib/ext/string.js", "modules": {}, "classes": {}, "fors": { "String": 1 }, "namespaces": {} }, "../../node_modules/ember-inflector/addon/lib/helpers/pluralize.js": { "name": "../../node_modules/ember-inflector/addon/lib/helpers/pluralize.js", "modules": {}, "classes": {}, "fors": { "Ember.HTMLBars.helpers": 1 }, "namespaces": {} }, "../../node_modules/ember-inflector/addon/lib/helpers/singularize.js": { "name": "../../node_modules/ember-inflector/addon/lib/helpers/singularize.js", "modules": {}, "classes": {}, "fors": { "Ember.HTMLBars.helpers": 1 }, "namespaces": {} }, "../../node_modules/ember-inflector/addon/lib/system/inflector.js": { "name": "../../node_modules/ember-inflector/addon/lib/system/inflector.js", "modules": {}, "classes": { "Ember.Inflector": 1 }, "fors": {}, "namespaces": { "Ember": 1 } }, "../adapter/addon/-private/build-url-mixin.js": { "name": "../adapter/addon/-private/build-url-mixin.js", "modules": {}, "classes": { "BuildURLMixin": 1 }, "fors": {}, "namespaces": {} }, "../adapter/addon/-private/index.ts": { "name": "../adapter/addon/-private/index.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../adapter/addon/error.js": { "name": "../adapter/addon/error.js", "modules": {}, "classes": { "AdapterError": 1, "InvalidError": 1, "TimeoutError": 1, "AbortError": 1, "UnauthorizedError": 1, "ForbiddenError": 1, "NotFoundError": 1, "ConflictError": 1, "ServerError": 1 }, "fors": {}, "namespaces": {} }, "../adapter/addon/index.js": { "name": "../adapter/addon/index.js", "modules": {}, "classes": { "Adapter": 1 }, "fors": {}, "namespaces": {} }, "../adapter/addon/json-api.js": { "name": "../adapter/addon/json-api.js", "modules": {}, "classes": { "JSONAPIAdapter": 1 }, "fors": {}, "namespaces": {} }, "../adapter/addon/rest.js": { "name": "../adapter/addon/rest.js", "modules": {}, "classes": { "RESTAdapter": 1 }, "fors": {}, "namespaces": {} }, "../canary-features/addon/default-features.ts": { "name": "../canary-features/addon/default-features.ts", "modules": { "@ember-data/canary-features": 1 }, "classes": {}, "fors": {}, "namespaces": {} }, "../canary-features/addon/index.ts": { "name": "../canary-features/addon/index.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../debug/addon/index.js": { "name": "../debug/addon/index.js", "modules": { "@ember-data/debug": 1 }, "classes": { "InspectorDataAdapter": 1 }, "fors": {}, "namespaces": {} }, "../model/addon/-private/system/relationships/ext.js": { "name": "../model/addon/-private/system/relationships/ext.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../model/addon/-private/system/many-array.js": { "name": "../model/addon/-private/system/many-array.js", "modules": {}, "classes": { "ManyArray": 1 }, "fors": {}, "namespaces": {} }, "../model/addon/-private/system/promise-belongs-to.js": { "name": "../model/addon/-private/system/promise-belongs-to.js", "modules": {}, "classes": { "PromiseBelongsTo": 1 }, "fors": {}, "namespaces": {} }, "../model/addon/-private/system/promise-many-array.js": { "name": "../model/addon/-private/system/promise-many-array.js", "modules": {}, "classes": { "PromiseManyArray": 1 }, "fors": {}, "namespaces": {} }, "../model/addon/-private/attr.js": { "name": "../model/addon/-private/attr.js", "modules": {}, "classes": {}, "fors": { "@ember-data/model": 1 }, "namespaces": {} }, "../model/addon/-private/belongs-to.js": { "name": "../model/addon/-private/belongs-to.js", "modules": {}, "classes": {}, "fors": { "@ember-data/model": 1 }, "namespaces": {} }, "../model/addon/-private/errors.js": { "name": "../model/addon/-private/errors.js", "modules": {}, "classes": { "Errors": 1 }, "fors": {}, "namespaces": {} }, "../model/addon/-private/has-many.js": { "name": "../model/addon/-private/has-many.js", "modules": {}, "classes": {}, "fors": { "@ember-data/model": 1 }, "namespaces": {} }, "../model/addon/-private/model.js": { "name": "../model/addon/-private/model.js", "modules": {}, "classes": {}, "fors": { "Model": 1 }, "namespaces": {} }, "../model/addon/index.ts": { "name": "../model/addon/index.ts", "modules": { "@ember-data/model": 1 }, "classes": { "Model": 1 }, "fors": {}, "namespaces": {} }, "../private-build-infra/addon/current-deprecations.ts": { "name": "../private-build-infra/addon/current-deprecations.ts", "modules": { "@ember-data/deprecations": 1 }, "classes": {}, "fors": {}, "namespaces": {} }, "../record-data/addon/-private/relationships/state/has-many.ts": { "name": "../record-data/addon/-private/relationships/state/has-many.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../record-data/addon/-private/relationships/state/relationship.ts": { "name": "../record-data/addon/-private/relationships/state/relationship.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../record-data/addon/-private/record-data.ts": { "name": "../record-data/addon/-private/record-data.ts", "modules": { "@ember-data/record-data": 1 }, "classes": {}, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/transforms/boolean.js": { "name": "../serializer/addon/-private/transforms/boolean.js", "modules": {}, "classes": { "BooleanTransform": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/transforms/date.js": { "name": "../serializer/addon/-private/transforms/date.js", "modules": {}, "classes": { "DateTransform": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/transforms/number.js": { "name": "../serializer/addon/-private/transforms/number.js", "modules": {}, "classes": { "NumberTransform": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/transforms/string.js": { "name": "../serializer/addon/-private/transforms/string.js", "modules": {}, "classes": { "StringTransform": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/transforms/transform.js": { "name": "../serializer/addon/-private/transforms/transform.js", "modules": {}, "classes": { "Transform": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/embedded-records-mixin.js": { "name": "../serializer/addon/-private/embedded-records-mixin.js", "modules": {}, "classes": { "EmbeddedRecordsMixin": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/index.js": { "name": "../serializer/addon/-private/index.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../serializer/addon/-private/utils.js": { "name": "../serializer/addon/-private/utils.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../serializer/addon/index.js": { "name": "../serializer/addon/index.js", "modules": {}, "classes": { "Serializer": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/json-api.js": { "name": "../serializer/addon/json-api.js", "modules": {}, "classes": { "JSONAPISerializer": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/json.js": { "name": "../serializer/addon/json.js", "modules": {}, "classes": { "JSONSerializer": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/rest.js": { "name": "../serializer/addon/rest.js", "modules": {}, "classes": { "RESTSerializer": 1 }, "fors": {}, "namespaces": {} }, "../serializer/addon/transform.js": { "name": "../serializer/addon/transform.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/identifiers/utils/uuid-v4.ts": { "name": "../store/addon/-private/identifiers/utils/uuid-v4.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/identifiers/cache.ts": { "name": "../store/addon/-private/identifiers/cache.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/identifiers/is-stable-identifier.ts": { "name": "../store/addon/-private/identifiers/is-stable-identifier.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/model/internal-model.ts": { "name": "../store/addon/-private/system/model/internal-model.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/model/states.js": { "name": "../store/addon/-private/system/model/states.js", "modules": {}, "classes": { "RootState": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/record-arrays/adapter-populated-record-array.js": { "name": "../store/addon/-private/system/record-arrays/adapter-populated-record-array.js", "modules": {}, "classes": { "AdapterPopulatedRecordArray": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/record-arrays/record-array.js": { "name": "../store/addon/-private/system/record-arrays/record-array.js", "modules": {}, "classes": { "RecordArray": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/references/belongs-to.js": { "name": "../store/addon/-private/system/references/belongs-to.js", "modules": {}, "classes": { "BelongsToReference": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/references/has-many.js": { "name": "../store/addon/-private/system/references/has-many.js", "modules": {}, "classes": { "HasManyReference": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/references/record.ts": { "name": "../store/addon/-private/system/references/record.ts", "modules": {}, "classes": { "RecordReference": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/references/reference.ts": { "name": "../store/addon/-private/system/references/reference.ts", "modules": {}, "classes": { "Reference": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/store/common.js": { "name": "../store/addon/-private/system/store/common.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/store/finders.js": { "name": "../store/addon/-private/system/store/finders.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/store/internal-model-factory.ts": { "name": "../store/addon/-private/system/store/internal-model-factory.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/store/record-data-store-wrapper.ts": { "name": "../store/addon/-private/system/store/record-data-store-wrapper.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/store/serializer-response.js": { "name": "../store/addon/-private/system/store/serializer-response.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/backburner.js": { "name": "../store/addon/-private/system/backburner.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/coerce-id.ts": { "name": "../store/addon/-private/system/coerce-id.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/core-store.ts": { "name": "../store/addon/-private/system/core-store.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/deprecated-evented.js": { "name": "../store/addon/-private/system/deprecated-evented.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/diff-array.js": { "name": "../store/addon/-private/system/diff-array.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/ds-model-store.ts": { "name": "../store/addon/-private/system/ds-model-store.ts", "modules": { "@ember-data/store": 1 }, "classes": { "Store": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/errors-utils.js": { "name": "../store/addon/-private/system/errors-utils.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/fetch-manager.ts": { "name": "../store/addon/-private/system/fetch-manager.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/identity-map.ts": { "name": "../store/addon/-private/system/identity-map.ts", "modules": {}, "classes": { "IdentityMap": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/internal-model-map.ts": { "name": "../store/addon/-private/system/internal-model-map.ts", "modules": {}, "classes": { "InternalModelMap": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/normalize-model-name.js": { "name": "../store/addon/-private/system/normalize-model-name.js", "modules": {}, "classes": {}, "fors": { "@ember-data/store": 1 }, "namespaces": {} }, "../store/addon/-private/system/promise-proxies.js": { "name": "../store/addon/-private/system/promise-proxies.js", "modules": {}, "classes": { "PromiseArray": 1, "PromiseObject": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/record-array-manager.js": { "name": "../store/addon/-private/system/record-array-manager.js", "modules": {}, "classes": { "RecordArrayManager": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/record-arrays.ts": { "name": "../store/addon/-private/system/record-arrays.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/references.js": { "name": "../store/addon/-private/system/references.js", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/relationship-meta.ts": { "name": "../store/addon/-private/system/relationship-meta.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/schema-definition-service.ts": { "name": "../store/addon/-private/system/schema-definition-service.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/snapshot-record-array.ts": { "name": "../store/addon/-private/system/snapshot-record-array.ts", "modules": {}, "classes": { "SnapshotRecordArray": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/snapshot.ts": { "name": "../store/addon/-private/system/snapshot.ts", "modules": {}, "classes": { "Snapshot": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/system/ts-upgrade-map.ts": { "name": "../store/addon/-private/system/ts-upgrade-map.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/utils/brand.ts": { "name": "../store/addon/-private/ts-interfaces/utils/brand.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/utils/symbol.ts": { "name": "../store/addon/-private/ts-interfaces/utils/symbol.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/ember-data-json-api.ts": { "name": "../store/addon/-private/ts-interfaces/ember-data-json-api.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/identifier.ts": { "name": "../store/addon/-private/ts-interfaces/identifier.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/minimum-adapter-interface.ts": { "name": "../store/addon/-private/ts-interfaces/minimum-adapter-interface.ts", "modules": { "@ember-data/adapter": 1 }, "classes": { "MinimumAdapterInterface": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/minimum-serializer-interface.ts": { "name": "../store/addon/-private/ts-interfaces/minimum-serializer-interface.ts", "modules": { "@ember-data/serializer": 1 }, "classes": { "MinimumSerializerInterface": 1 }, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/record-data-json-api.ts": { "name": "../store/addon/-private/ts-interfaces/record-data-json-api.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/record-data-record-wrapper.ts": { "name": "../store/addon/-private/ts-interfaces/record-data-record-wrapper.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/record-data-schemas.ts": { "name": "../store/addon/-private/ts-interfaces/record-data-schemas.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/record-data-store-wrapper.ts": { "name": "../store/addon/-private/ts-interfaces/record-data-store-wrapper.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/record-data.ts": { "name": "../store/addon/-private/ts-interfaces/record-data.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/record-instance.ts": { "name": "../store/addon/-private/ts-interfaces/record-instance.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/schema-definition-service.ts": { "name": "../store/addon/-private/ts-interfaces/schema-definition-service.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/ts-interfaces/utils.ts": { "name": "../store/addon/-private/ts-interfaces/utils.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/utils/promise-record.ts": { "name": "../store/addon/-private/utils/promise-record.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/-private/index.ts": { "name": "../store/addon/-private/index.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} }, "../store/addon/index.ts": { "name": "../store/addon/index.ts", "modules": {}, "classes": {}, "fors": {}, "namespaces": {} } }, "modules": { "@ember-data/adapter": { "name": "@ember-data/adapter", "submodules": {}, "elements": {}, "classes": { "String": 1, "Ember.HTMLBars.helpers": 1, "Ember.Inflector": 1, "BuildURLMixin": 1, "AdapterError": 1, "InvalidError": 1, "TimeoutError": 1, "AbortError": 1, "UnauthorizedError": 1, "ForbiddenError": 1, "NotFoundError": 1, "ConflictError": 1, "ServerError": 1, "Adapter": 1, "JSONAPIAdapter": 1, "RESTAdapter": 1, "MinimumAdapterInterface": 1 }, "fors": {}, "namespaces": {}, "tag": "main", "file": "../store/addon/-private/ts-interfaces/minimum-adapter-interface.ts", "line": 149, "description": "## Overview\n\nIn order to properly fetch and update data, EmberData\nneeds to understand how to connect to your API.\n\n`Adapters` accept various kinds of requests from the store\nand manage fulfillment of the request from your API.\n\n### Request Flow\n\nWhen the store decides it needs to issue a request it uses the\nfollowing flow to manage the request and process the data.\n\n- find the appropriate adapter\n- issue the request to the adapter\n- await the adapter's response\n - if an error occurs reject with the error\n - if no error\n - if there is response data\n - pass the response data to the appropriate serializer\n - update the cache using the JSON:API formatted data from the serializer's response\n - return the primary record(s) associated with the request\n\n### Request Errors\n\nWhen a request errors and your adapter does not have the ability to recover from the error,\nyou may either reject the promise returned by your adapter method with the error or simply\nthrow the error.\n\nIf the request was for a `createRecord` `updateRecord` or `deleteRecord` special rules\napply to how this error will affect the state of the store and additional properties on\nthe `Error` class may be used. See the documentation for these methods in the\n`MinimumAdapterInterface` for more information.\n\n### Implementing an Adapter\n\nThere are seven required adapter methods, one for each of\nthe primary request types that EmberData issues.\n\nThey are:\n\n- findRecord\n- findAll\n- queryRecord\n- query\n- createRecord\n- updateRecord\n- deleteRecord\n\nEach of these request types has a matching store method that triggers it\nand matching `requestType` that is passed to the serializer's\n`normalizeResponse` method.\n\nIf your app only reads data but never writes data, it is not necessary\nto implement the methods for create, update, and delete. This extends to\nall of the store's find methods with the exception of `findRecord` (`findAll`,\n`query`, `queryRecord`): if you do not use the store method in your app then\nyour Adapter does not need the method.\n\n```ts\nimport EmberObject from '@ember/object';\n\nasync function fetchData(url, options = {}) {\n let response = await fetch(`./${modelName}s/${id}`, options);\n return response.toJSON();\n}\n\nexport default class ApplicationAdapter extends EmberObject {\n findRecord(_, { modelName }, id) {\n return fetchData(`./${modelName}s/${id}`);\n }\n}\n```\n\n### Adapter Resolution\n\n`store.adapterFor(name)` will lookup adapters defined in `app/adapters/` and\nreturn an instance.\n\n`adapterFor` first attempts to find an adapter with an exact match on `name`,\nthen falls back to checking for the presence of an adapter named `application`.\n\nIf no adapter is found, an error will be thrown.\n\n```ts\nstore.adapterFor('author');\n\n// lookup paths (in order) =>\n// app/adapters/author.js\n// app/adapters/application.js\n```\n\nMost requests in EmberData are made with respect to a particular `type` (or `modelName`)\n(e.g., \"get me the full collection of **books**\" or \"get me the **employee** whose id is 37\"). We\nrefer to this as the **primary** resource `type`.\n\n`adapterFor` is used by the store to find an adapter with a name matching that of the primary\nresource `type` for the request, which then falls back to the `application` adapter.\n\nIt is recommended that applications define only a single `application` adapter and serializer\nwhere possible, only implementing an adapter specific to the `type` when absolutely necessary.\n\nIf you need to support multiple API versions for the same type, the per-type strategy for\ndefining adapters might not be adequate.\n\nIf you have multiple APIs or multiple API versions and the single application adapter and per-type\nstrategy does not suite your needs, one strategy is to write an `application` adapter and serializer\nthat make use of `options` to specify the desired format when making a request, then forwards to the\nrequest to the desired adapter or serializer as needed.\n\n```app/adapters/application.js\nexport default class Adapter extends EmberObject {\n findRecord(store, schema, id, snapshot) {\n let { apiVersion } = snapshot.adapterOptions;\n return this.adapterFor(`-api-${apiVersion}`).findRecord(store, schema, id, snapshot);\n }\n}\n```\n\n### Using an Adapter\n\nAny adapter in `app/adapters/` can be looked up by `name` using `store.adapterFor(name)`.\n\n### Default Adapters\n\nApplications whose API's structure endpoint URLs *very close to* or *exactly* the **REST**\nor **JSON:API** convention, the `@ember-data/adapter` package contains implementations\nthese applications can extend.\n\nMany applications will find writing their own adapter to be allow greater flexibility,\ncustomization, and maintenance than attempting to override methods in these adapters.", "extends": "EmberObject", "itemtype": "main", "access": "public", "tagname": "" }, "@ember-data/canary-features": { "name": "@ember-data/canary-features", "submodules": {}, "elements": {}, "classes": {}, "fors": {}, "namespaces": {}, "tag": "main", "file": "../canary-features/addon/default-features.ts", "line": 1, "description": "## Canary Features\n\nEmberData allows users to test features that are implemented but not yet\navailable even in canary.\n\nTypically these features represent work that might introduce a new concept,\nnew API, change an API, or risk an unintended change in behavior to consuming\napplications.\n\nSuch features have their implementations guarded by a \"feature flag\", and the\nflag is only activated once the core-data team is prepared to ship the work\nin a canary release.\n\n### Installing Canary\n\nTo test a feature you MUST be using a canary build. Canary builds are published\nto `npm` and can be installed using a precise tag (such as `ember-data@3.16.0-alpha.1`)\nor by installing the latest dist-tag published to the `canary` channel.\n\n*Using `npm` to install the latest canary*\n\n```cli\nnpm install --save-dev ember-data@canary\n```\n\n*Using `yarn` to install the latest canary*\n\n```cli\nyarn add ember-data@canary\n```\n\n### Activating a Canary Feature\n\nOnce you have installed canary, feature-flags can be activated at build-time by an environment\nvariable or at runtime using `window.EmberDataENV`.\n\nThe \"off\" branch of feature-flagged code is always stripped from production builds, so you\nMUST use the build-time environment variable to activate a flag if testing production.\n\nThe list of available feature-flags is located [here](https://github.com/emberjs/data/tree/master/packages/canary-features/addon/default-features.ts \"List of EmberData FeatureFlags\")\n\n#### Runtime Configuration\n\nTo configure feature-flags at runtime you will want to configure `window.EmberDataENV = {}` appropriately.\nYou should add this global property in your app prior to your application booting. At the top of\nyour `app.js` file is a convenient location, as is within ` index.html` as a script running prior\nto loading any other scripts.\n\n*Example activating a single feature flags*\n\n```js\nwindow.EmberDataENV = {\n FEATURES: {\n RECORD_DATA_ERRORS: true,\n }\n}\n```\n\n*Example activating multiple feature flags*\n\n```js\nwindow.EmberDataENV = {\n FEATURES: {\n RECORD_DATA_ERRORS: true,\n RECORD_DATA_STATE: true,\n }\n}\n```\n\n*Example activating all feature flags*\n\n```js\nwindow.EmberDataENV = {\n ENABLE_OPTIONAL_FEATURES: true\n}\n```\n\n#### Build Time Configuration\n\n*Example activating a single feature flags*\n\n```js\nEMBER_DATA_FEATURE_OVERRIDE=REQUEST_SERVICE ember build\n```\n\n*Example activating multiple feature flags*\n\n```js\nEMBER_DATA_FEATURE_OVERRIDE=REQUEST_SERVICE,CUSTOM_MODEL_CLASS ember build\n```\n\n*Example activating all feature flags*\n\n```js\nEMBER_DATA_FEATURE_OVERRIDE=ENABLE_ALL_OPTIONAL ember build\n```\n\n### Preparing an Addon to use a Canary Feature\n\nFor most addons and most features simple version detection should be\nenough. Using the provided version compatibility helpers from\n[ember-compatibility-helpers](https://github.com/pzuraq/ember-compatibility-helpers)\nthe following can be done:\n\n```js\nif (gte('@ember-data/store', '3.12.0')) {\n\n} else {\n\n}\n```\n\nFor addons needing more advanced detection [babel-plugin-debug-macros](https://github.com/ember-cli/babel-plugin-debug-macros)\ncan be leveraged to provide code-stripping based on feature presence. For example in your addon's `index.js`:\n\n```js\nfunction debugMacros(features) {\n let plugins = [\n [\n require.resolve('babel-plugin-debug-macros'),\n {\n flags: [\n {\n source: '<addon-name>/feature-flags',\n flags: features,\n },\n ],\n },\n '<addon-name>/canary-features-stripping',\n ],\n ];\n\n return plugins;\n}\n\nmodule.exports = {\n name: '<addon-name>',\n\n init() {\n this._super.init.apply(this, arguments);\n\n let features;\n try {\n features = this.project.require('@ember-data/private-build-infra/src/features')();\n } catch (e) {\n features = { CUSTOM_MODEL_CLASS: false };\n }\n\n this.options = this.options || {};\n this.options.babel = this.options.babel || {};\n // this ensures that the same `@ember-data/canary-features` processing that the various\n // ember-data addons do is done for this addon\n this.options.babel.plugins = [...debugMacros(features)];\n }\n}\n```", "itemtype": "main" }, "@ember-data/debug": { "name": "@ember-data/debug", "submodules": {}, "elements": {}, "classes": { "InspectorDataAdapter": 1 }, "fors": {}, "namespaces": {}, "tag": "main", "file": "../debug/addon/index.js", "line": 37, "description": "# Overview\n\nThis package provides the `DataAdapter` which the [Ember Inspector](https://github.com/emberjs/ember-inspector)\nuses to subscribe and retrieve information for the `data` tab in the inspector.\n\nThis package adds roughly .6 KB when minified and compressed to your application in production; however,\nyou can opt out of shipping this addon in production via options in `ember-cli-build.js`\n\n```js\nlet app = new EmberApp(defaults, {\n emberData: {\n includeDataAdapterInProduction: false\n }\n});\n```\n\nWhen using `ember-data` as a dependency of your app, the default is to ship the inspector support to production.\n\nWhen not using `ember-data` as a dependency but instead using EmberData via declaring specific `@ember-data/<package>`\ndependencies the default is to not ship to production.", "itemtype": "main" }, "@ember-data/model": { "name": "@ember-data/model", "submodules": {}, "elements": {}, "classes": { "PromiseBelongsTo": 1, "PromiseManyArray": 1, "@ember-data/model": 1, "Model": 1 }, "fors": { "@ember-data/model": 1, "Model": 1 }, "namespaces": {}, "tag": "main", "file": "../model/addon/index.ts", "line": 1, "description": "In EmberData a `Model` is a class defining the attributes and relationships\n of a specific resource `type` (model name). In this sense it represents a static \"schema\".\n\n Data for individual resources fetched from your API is presented\n to the UI via instances of the `Model`s you define.\n\n An instantiated `Model` is referred to as a `record`.\n\n When we refer to the `ModelClass` we are referring to the class definition\n and the static schema methods present on it.\n\n When we refer to a `record` we refer to a specific class instance presenting\n the resource data for a given `type` and `id`.\n\n ### Defining a Model\n\n ```app/models/person.js\n import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n\n export default Model.extend({\n name: attr(),\n\n dog: belongsTo('pet', { inverse: 'owners', async: false }),\n\n friends: hasMany('person', { inverse: 'friends', async: true }),\n });\n ```\n\n ### modelName convention\n\n By convention, the name of a given model (its `type`) matches the name\n of the file in the `app/models` folder and should be lowercase, singular\n and dasherized.", "itemtype": "main" }, "@ember-data/store": { "name": "@ember-data/store", "submodules": {}, "elements": {}, "classes": { "ManyArray": 1, "Errors": 1, "RootState": 1, "AdapterPopulatedRecordArray": 1, "RecordArray": 1, "BelongsToReference": 1, "HasManyReference": 1, "RecordReference": 1, "Reference": 1, "Store": 1, "IdentityMap": 1, "InternalModelMap": 1, "@ember-data/store": 1, "PromiseArray": 1, "PromiseObject": 1, "RecordArrayManager": 1, "SnapshotRecordArray": 1, "Snapshot": 1 }, "fors": { "@ember-data/store": 1 }, "namespaces": {}, "tag": "main", "file": "../store/addon/-private/system/snapshot.ts", "line": 53, "description": "The store service contains all of the data for records loaded from the server.\nIt is also responsible for creating instances of `Model` that wrap\nthe individual data for a record, so that they can be bound to in your\nHandlebars templates.\n\nBy default, applications will have a single `Store` service that is\nautomatically created.\n\nThe store can be customized by extending the service in the following manner:\n\n```app/services/store.js\nimport Store from '@ember-data/store';\n\nexport default class MyStore extends Store {}\n```\n\nYou can retrieve models from the store in several ways. To retrieve a record\nfor a specific id, use the `Store`'s `findRecord()` method:\n\n```javascript\nstore.findRecord('person', 123).then(function (person) {\n});\n```\n\nBy default, the store will talk to your backend using a standard\nREST mechanism. You can customize how the store talks to your\nbackend by specifying a custom adapter:\n\n```app/adapters/application.js\nimport DS from 'ember-data';\n\nexport default Adapter.extend({\n});\n```\n\nYou can learn more about writing a custom adapter by reading the `Adapter`\ndocumentation.\n\n### Store createRecord() vs. push() vs. pushPayload()\n\nThe store provides multiple ways to create new record objects. They have\nsome subtle differences in their use which are detailed below:\n\n[createRecord](../classes/Store/methods/createRecord?anchor=createRecord) is used for creating new\nrecords on the client side. This will return a new record in the\n`created.uncommitted` state. In order to persist this record to the\nbackend, you will need to call `record.save()`.\n\n[push](../classes/Store/methods/push?anchor=push) is used to notify Ember Data's store of new or\nupdated records that exist in the backend. This will return a record\nin the `loaded.saved` state. The primary use-case for `store#push` is\nto notify Ember Data about record updates (full or partial) that happen\noutside of the normal adapter methods (for example\n[SSE](http://dev.w3.org/html5/eventsource/) or [Web\nSockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).\n\n[pushPayload](../classes/Store/methods/pushPayload?anchor=pushPayload) is a convenience wrapper for\n`store#push` that will deserialize payloads if the\nSerializer implements a `pushPayload` method.\n\nNote: When creating a new record using any of the above methods\nEmber Data will update `RecordArray`s such as those returned by\n`store#peekAll()` or `store#findAll()`. This means any\ndata bindings or computed properties that depend on the RecordArray\nwill automatically be synced to include the new or updated record\nvalues.", "itemtype": "main" }, "@ember-data/deprecations": { "name": "@ember-data/deprecations", "submodules": {}, "elements": {}, "classes": {}, "fors": {}, "namespaces": {}, "tag": "main", "file": "../private-build-infra/addon/current-deprecations.ts", "line": 1, "description": "## Deprecations\n\nEmberData allows users to remove code that exists to support deprecated\nbehaviors.\n\nIf your app has resolved all deprecations present in a given version,\nyou may specify that version as your \"compatibility\" version to remove\nthe code that supported the deprecated behavior from your app.\n\nFor instance, if a deprecation was introduced in 3.13, and the app specifies\n3.13 as its minimum version compatibility, any deprecations introduced before\nor during 3.13 would be stripped away.\n\nAn app can use a different version than what it specifies as it's compatibility\nversion. For instance, an App could be using `3.16` while specifying compatibility\nwith `3.12`. This would remove any deprecations that were present in or before `3.12`\nbut keep support for anything deprecated in or abvoe `3.13`.\n\n### Configuring Compatibility\n\nTo configure your compatibility version, set the `compatWith` to the version you\nare compatible with on the `emberData` config in your `ember-cli-build.js` file.\n\n```js\nlet app = new EmberApp(defaults, {\n emberData: {\n compatWith: '3.12',\n },\n});\n```\n\nThe complete list of which versions specific deprecations will be removed in\ncan be found [here](https://github.com/emberjs/data/tree/master/packages/private-build-infra/addon/current-deprecations.ts \"List of EmberData Deprecations\")", "itemtype": "main" }, "@ember-data/record-data": { "name": "@ember-data/record-data", "submodules": {}, "elements": {}, "classes": {}, "fors": {}, "namespaces": {}, "tag": "module", "file": "../record-data/addon/-private/record-data.ts", "line": 1 }, "@ember-data/serializer": { "name": "@ember-data/serializer", "submodules": {}, "elements": {}, "classes": { "BooleanTransform": 1, "DateTransform": 1, "NumberTransform": 1, "StringTransform": 1, "Transform": 1, "EmbeddedRecordsMixin": 1, "Serializer": 1, "JSONAPISerializer": 1, "JSONSerializer": 1, "RESTSerializer": 1, "MinimumSerializerInterface": 1 }, "fors": {}, "namespaces": {}, "tag": "main", "file": "../store/addon/-private/ts-interfaces/minimum-serializer-interface.ts", "line": 113, "description": "## Overview\n\nIn order to properly manage and present your data, EmberData\nneeds to understand the structure of data it receives.\n\n`Serializers` convert data between the server's API format and\nthe format EmberData understands.\n\nData received from an API response is **normalized** into\n[JSON:API](https://jsonapi.org/) (the format used internally\nby EmberData), while data sent to an API is **serialized**\ninto the format the API expects.\n\n### Implementing a Serializer\n\nThere are only two required serializer methods, one for\nnormalizing data from the server API format into JSON:API, and\nanother for serializing records via `Snapshots` into the expected\nserver API format.\n\nTo implement a serializer, export a class that conforms to the structure\ndescribed by the [MinimumSerializerInterface](/ember-data/release/classes/MinimumSerializerInterface)\nfrom the `app/serializers/` directory. An example is below.\n\n```ts\nimport EmberObject from '@ember/object';\n\nexport default class ApplicationSerializer extends EmberObject {\n normalizeResponse(store, schema, rawPayload) {\n return rawPayload;\n }\n\n serialize(snapshot, options) {\n const serializedResource = {\n id: snapshot.id,\n type: snapshot.modelName,\n attributes: snapshot.attributes()\n };\n\n return serializedResource;\n }\n}\n ```\n\n\n### Serializer Resolution\n\n`store.serializerFor(name)` will lookup serializers defined in\n`app/serializers/` and return an instance. If no serializer is found, an\nerror will be thrown.\n\n`serializerFor` first attempts to find a serializer with an exact match on `name`,\nthen falls back to checking for the presence of a serializer named `application`.\n\n```ts\nstore.serializerFor('author');\n\n// lookup paths (in order) =>\n// app/serializers/author.js\n// app/serializers/application.js\n```\n\nMost requests in EmberData are made with respect to a particular `type` (or `modelName`)\n(e.g., \"get me the full collection of **books**\" or \"get me the **employee** whose id is 37\"). We\nrefer to this as the **primary** resource `type`.\n\nTypically `serializerFor` will be used to find a serializer with a name matching that of the primary\nresource `type` for the request, falling back to the `application` serializer for those types that\ndo not have a defined serializer. This is often described as a `per-model` or `per-type` strategy\nfor defining serializers. However, because APIs rarely format payloads per-type but rather\nper-API-version, this may not be a desired strategy.\n\nIt is recommended that applications define only a single `application` adapter and serializer\nwhere possible.\n\nIf you have multiple API formats and the per-type strategy is not viable, one strategy is to\nwrite