/**
* Registered as `js-data` in NPM and Bower.
*
* Also available from CDN.JS and JSDelivr.
*
* @module js-data
*
* @example <caption>Install from NPM</caption>
* npm i --save js-data@beta
* @example <caption>Install from Bower</caption>
* bower i --save js-data@3.0.0-beta.1
* @example <caption>Install from CDN.JS</caption>
* <script src="https://cdnjs.cloudflare.com/ajax/libs/js-data/3.0.0-beta.1/js-data.min.js"></script>
* @example <caption>Install from JSDelivr</caption>
* <script src="https://cdn.jsdelivr.net/js-data/3.0.0-beta.1/js-data.min.js"></script>
* @example <caption>Load into your app via script tag</caption>
* <script src="/path/to/js-data.min.js"></script>
* <script>
* console.log(JSData.version.full); // "3.0.0-beta.1"
* </script>
* @example <caption>Load into your app via CommonJS</caption>
* var JSData = require('js-data');
* @example <caption>Load into your app via ES2015 Modules</caption>
* import * as JSData from 'js-data';
* @example <caption>Load into your app via AMD</caption>
* define('myApp', ['js-data'], function (JSData) { ... })
*/
/**
* Describes the version of this `JSData` object.
*
* @example
* console.log(JSData.version.full) // "3.0.0-beta.1"
*
* @name version
* @memberof module:js-data
* @property {string} full The full semver value.
* @property {number} major The major version number.
* @property {number} minor The minor version number.
* @property {number} patch The patch version number.
* @property {(string|boolean)} alpha The alpha version value, otherwise `false`
* if the current version is not alpha.
* @property {(string|boolean)} beta The beta version value, otherwise `false`
* if the current version is not beta.
* @since 2.0.0
* @type {Object}
*/
export const version = '<%= version %>'
/**
* JSData's utility methods.
*
* @example
* import {utils} from 'js-data'
* console.log(utils.isString('foo')) // true
*
* @name module:js-data.utils
* @property {Function} Promise See {@link utils.Promise}.
* @see utils
* @since 3.0.0
* @type {Object}
*/
import utils from './utils'
/**
* JSData's {@link Collection} class.
*
* @example
* import {Collection} from 'js-data'
* const collection = new Collection()
*
* @name module:js-data.Collection
* @see Collection
* @since 3.0.0
* @tutorial ["http://www.js-data.io/v3.0/docs/components-of-jsdata#collection","Components of JSData: Collection"]
* @type {Constructor}
*/
import Collection from './Collection'
/**
* JSData's {@link Component} class. Most components in JSData extend this
* class.
*
* @example
* import {Component} from 'js-data'
* // Make a custom component.
* const MyComponent = Component.extend({
* myMethod (someArg) { ... }
* })
*
* @name module:js-data.Component
* @see Component
* @since 3.0.0
* @type {Constructor}
*/
import Component from './Component'
/**
* JSData's {@link Container} class. Defines and manages {@link Mapper}s. Used
* in Node.js and in the browser, though in the browser you may want to use
* {@link DataStore} instead.
*
* @example
* import {Container} from 'js-data'
* const store = new Container()
*
* @name module:js-data.Container
* @see Container
* @since 3.0.0
* @tutorial ["http://www.js-data.io/v3.0/docs/components-of-jsdata#container","Components of JSData: Container"]
* @type {Constructor}
*/
import {Container} from './Container'
/**
* JSData's {@link DataStore} class. Primarily for use in the browser. In
* Node.js you probably want to use {@link Container} instead.
*
* @example
* import {DataStore} from 'js-data'
* const store = new DataStore()
*
* @name module:js-data.DataStore
* @see DataStore
* @since 3.0.0
* @tutorial ["http://www.js-data.io/v3.0/docs/components-of-jsdata#datastore","Components of JSData: DataStore"]
* @type {Constructor}
*/
import DataStore from './DataStore'
/**
* JSData's {@link Index} class, based on [mindex]{@link https://github.com/internalfx/mindex}.
*
* @name module:js-data.Index
* @see Index
* @since 3.0.0
* @type {Constructor}
*/
import Index from '../lib/mindex/index'
/**
* JSData's {@link LinkedCollection} class. Used by the {@link DataStore}
* component. If you need to create a collection manually, you should probably
* use the {@link Collection} class.
*
* @name module:js-data.LinkedCollection
* @see DataStore
* @see LinkedCollection
* @since 3.0.0
* @type {Constructor}
*/
import LinkedCollection from './LinkedCollection'
/**
* JSData's {@link Mapper} class. The core of the ORM.
*
* @example <caption>Recommended use</caption>
* import {Container} from 'js-data'
* const store = new Container()
* store.defineMapper('user')
*
* @example <caption>Create Mapper manually</caption>
* import {Mapper} from 'js-data'
* const UserMapper = new Mapper({ name: 'user' })
*
* @name module:js-data.Mapper
* @see Container
* @see Mapper
* @since 3.0.0
* @tutorial ["http://www.js-data.io/v3.0/docs/modeling-your-data","Modeling your data"]
* @tutorial ["http://www.js-data.io/v3.0/docs/components-of-jsdata#mapper","Components of JSData: Mapper"]
* @type {Constructor}
*/
import Mapper from './Mapper'
/**
* JSData's {@link Query} class. Used by the {@link Collection} component.
*
* @name module:js-data.Query
* @see Query
* @since 3.0.0
* @type {Constructor}
*/
import Query from './Query'
/**
* JSData's {@link Record} class.
*
* @example
* import {Container} from 'js-data'
* const store = new Container()
* store.defineMapper('user')
* const user = store.createRecord('user')
*
* @name module:js-data.Record
* @see Record
* @since 3.0.0
* @tutorial ["http://www.js-data.io/v3.0/docs/components-of-jsdata#record","Components of JSData: Record"]
* @type {Constructor}
*/
import Record from './Record'
/**
* JSData's {@link Schema} class. Implements http://json-schema.org/draft-04.
*
* @example
* import {Container, Schema} from 'js-data'
* const userSchema = new Schema({
* properties: {
* id: { type: 'string' },
* name: { type: 'string' }
* }
* })
* const store = new Container()
* store.defineMapper('user', {
* schema: userSchema
* })
*
* @name module:js-data.Schema
* @see Schema
* @see http://json-schema.org/
* @since 3.0.0
* @tutorial ["http://www.js-data.io/v3.0/docs/components-of-jsdata#schema","Components of JSData: schema"]
* @tutorial ["http://www.js-data.io/v3.0/docs/schemas","JSData's Schema Syntax"]
* @type {Constructor}
*/
import Schema from './Schema'
/**
* JSData's {@link Settable} class.
*
* @example
* import {Settable} from 'js-data'
* const obj = new Settable()
* obj.set('secret', 'value')
* console.log(JSON.stringify(obj)) // {}
*
* @name module:js-data.Settable
* @see Settable
* @since 3.0.0
* @type {Constructor}
*/
import Settable from './Settable'
export * from './decorators'
export {
Collection,
Component,
Container,
DataStore,
Index,
LinkedCollection,
Mapper,
Query,
Record,
Schema,
Settable,
utils
}