@versacommerce/versacommerce-js-sdk 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +318 -0
- package/dist/versacommerce-js-sdk.es.js +2680 -0
- package/dist/versacommerce-js-sdk.es.js.map +1 -0
- package/dist/versacommerce-js-sdk.umd.cjs +2 -0
- package/dist/versacommerce-js-sdk.umd.cjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versacommerce-js-sdk.es.js","sources":["../lib/utils/entries.js","../lib/utils/dig.js","../lib/utils/bury.js","../lib/core/base-object.js","../lib/utils/pluralize.js","../lib/core/store.js","../lib/utils/capitalize.js","../lib/utils/query-params.js","../lib/utils/append-query-params.js","../lib/core/adapter.js","../lib/utils/camelcase.js","../lib/utils/singularize.js","../lib/utils/decapitalize.js","../lib/utils/underscore.js","../lib/utils/flatten.js","../lib/core/serializer.js","../lib/core/client.js","../lib/core/registry.js","../lib/utils/logger.js","../lib/utils/dasherize.js","../lib/core/model.js","../lib/models/article.js","../lib/models/blog.js","../lib/core/event-emitter.js","../lib/models/cart.js","../lib/models/collection.js","../lib/utils/resize-image-url.js","../lib/models/image.js","../lib/models/line-item.js","../lib/models/link.js","../lib/models/linklist.js","../lib/models/page.js","../lib/models/base-product.js","../lib/models/product.js","../lib/models/shop.js","../lib/models/variant.js","../lib/version.js","../lib/versacommerce.js","../lib/exports.js"],"sourcesContent":["export default function* (obj) {\n for (let key of Object.keys(obj)) {\n yield [key, obj[key]];\n }\n}\n","export default (hash, components) => {\n let current = hash;\n\n components.forEach((component) => {\n if (current === undefined) {\n return;\n }\n\n current = current[component];\n });\n\n return current;\n};\n","export default (hash, value, components) => {\n const lastComponent = components.pop();\n let current = hash;\n\n components.forEach((component) => {\n if (current[component] === undefined) {\n current[component] = {};\n }\n\n current = current[component];\n });\n\n current[lastComponent] = value;\n};\n","import entries from 'utils/entries';\nimport dig from 'utils/dig';\nimport bury from 'utils/bury';\n\n/**\n * @description\n * Abstract class used as parent for all classes within VersaCommerce JavaScript SDK.\n *\n * @memberof module:core\n *\n * @example\n * // create object with property 'test'\n * var object = new BaseObject({\n * test: 'value'\n * });\n *\n * // access defined property\n * object.test; // => 'value'\n */\nclass BaseObject {\n /**\n * @description\n * Creates a new BaseObject instance.\n *\n * @param {Object} [properties={}] - Properties which are set on creation.\n */\n constructor(properties = {}) {\n for (let [key, value] of entries(properties)) {\n this[key] = value;\n }\n }\n\n /**\n * @description\n * Finds value of a nested property.\n *\n * @param {...String} component - The property names.\n * @return {*} The value.\n */\n dig(...components) {\n return dig(this, components);\n }\n\n /**\n * @description\n * Sets value of a nested property.\n *\n * @param {*} value - The value to set.\n * @param {...String} component - The property names.\n */\n bury(value, ...components) {\n bury(this, value, components);\n }\n\n /**\n * @description\n * Defines a read-only property.\n *\n * @param {String} name - The name of the property.\n * @param {Function} getter - The getter function.\n */\n defineReadOnlyProperty(name, getter) {\n Object.defineProperty(this, name, {\n get: getter\n });\n }\n\n /**\n * @description\n * Returns result from function or cache and caches result.\n *\n * @param {String} name - The cache key name.\n * @param {Function} func - The function to evaluate.\n * @return {*} The result of the function or the previously cached result.\n */\n memoize(name, func) {\n // create memoized cache on demand\n if (!this._memoized) {\n this._memoized = {};\n }\n\n let value = this.dig('_memoized', name);\n if (value === undefined) {\n value = func.call(this);\n this.bury(value, '_memoized', name);\n }\n\n return value;\n }\n\n /**\n * @description\n * Defines a cached property from evaluating a function.\n *\n * @param {String} name - The property name.\n * @param {Function} func - The function to evaluate.\n */\n defineCachedProperty(name, func) {\n let self = this;\n this.defineReadOnlyProperty(name, () => self.memoize(name, func));\n }\n\n /**\n * @description\n * Clears the value of a cached value\n *\n * @param {String} name - The property name.\n */\n clearCachedProperty(name) {\n this.bury(undefined, '_memoized', name);\n }\n\n /**\n * @description\n * Clears the values of all cached properties.\n */\n clearCachedProperties() {\n const memoized = this._memoized || {};\n\n for (let [name] of entries(memoized)) {\n this.clearCachedProperty(name);\n }\n }\n}\n\nexport default BaseObject;\n","export default (str) => {\n return str + 's';\n};\n","import BaseObject from 'core/base-object';\nimport pluralize from 'utils/pluralize';\nimport VC from 'versacommerce';\n\n/**\n * @description\n * Class used to fetch and cache models.\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * // create client\n * var client = new Client({\n * shopName: 'mein-test-shop'\n * });\n *\n * // create store\n * var store = new Store({ client: client });\n *\n * // use store to fetch a product\n * store.find('product', 1).then(function(product) {\n * console.log(product); // => Product\n * });\n */\nclass Store extends BaseObject {\n /**\n * description\n * Creates a new store instance.\n */\n constructor() {\n super(...arguments);\n\n this._db = new BaseObject();\n }\n\n /**\n * @description\n * Finds a single model by kind and id.\n *\n * @param {String} kind - The kind of model.\n * @param {Number} id - The id.\n * @return {Promise} Promise that resolves with the remote model.\n *\n * @example\n * var store = new Store({ client: client });\n *\n * store.find('product', 1).then(function(product) {\n * console.log(product); // => Product\n * }).catch(function() {\n * console.log('Product not found');\n * });\n */\n find(kind, id) {\n const self = this;\n const local = this.findSync(kind, id);\n\n if (local) {\n return Promise.resolve(local);\n }\n\n return this.load(kind, id)\n .then((result) => {\n result.forEach((model) => self.push(model));\n return self.findSync(kind, id);\n })\n .catch((reason) => {\n VC.Logger.error(`Cannot find ${kind} ${id ? `with id ${id} ` : ''}(${reason})`);\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Refreshes model attributes (and dependencies) from remote.\n *\n * @param {String} kind - The kind of model.\n * @param {Number} id - The id.\n * @return {Promise} Promise that resolves with the refreshed model.\n */\n refresh(kind, id) {\n const self = this;\n\n return this.load(kind, id)\n .then((result) => self._refreshWithDeserialized(kind, result))\n .catch((reason) => {\n VC.Logger.error(`Cannot refresh ${kind} ${id ? `with id ${id} ` : ''}(${reason})`);\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Refreshes model attributes (and dependencies) from given data.\n *\n * @param {String} - The kind of model.\n * @param {Object} - The data.\n * @return {Model} - The refreshed model.\n */\n refreshWithData(kind, data) {\n const result = this.loadData(kind, data);\n return this._refreshWithDeserialized(kind, result);\n }\n\n _refreshWithDeserialized(kind, result) {\n const self = this;\n const model = result[0];\n const dependencies = result.slice(1);\n const local = self.findSync(kind, model.id);\n\n local.update(model.attributes);\n dependencies.forEach((model) => self.push(model));\n\n return self.findSync(kind, model.id);\n }\n\n /**\n * @description\n * Finds model in local database.\n *\n * @param {String} kind - The kind of model.\n * @param {Number} id - The id.\n * @return {Model} The model from local cache.\n *\n * @example\n * var store = new Store();\n * var product = new Product({ id: 1 });\n *\n * store.push(product);\n * store.findSync('product', 1); // => Product\n */\n findSync(kind, id) {\n if (id) {\n return this._db.dig(pluralize(kind), id);\n } else {\n // singelton, e.g. cart\n return this._db.dig(kind);\n }\n }\n\n /**\n * @description\n * Loads model from remote.\n *\n * @param {String} kind - The kind of model.\n * @param {Number} id - The id.\n * @return {Promise} Promise that resolves with remote model.\n *\n * @example\n * var store = new Store({ client: client });\n *\n * store.load('product', 1).then(fucntion(product) {\n * console.log(product); // => Product\n * });\n */\n load(kind, id) {\n const self = this;\n return this.adapter.getRessource(kind, id).then((data) => self.loadData(kind, data));\n }\n\n /**\n * @description\n * Finds a single model by kind and handle.\n *\n * @param {String} kind - The kind of model (e.g. \"page\", \"blog\", \"linklist\").\n * @param {String} handle - The handle/slug of the model.\n * @return {Promise} Promise that resolves with the model.\n *\n * @example\n * store.findByHandle('page', 'impressum').then(function(page) {\n * console.log(page.title); // => \"Impressum\"\n * });\n */\n findByHandle(kind, handle) {\n const self = this;\n const local = this.findSyncByHandle(kind, handle);\n\n if (local) {\n return Promise.resolve(local);\n }\n\n return this.loadByHandle(kind, handle)\n .then((result) => {\n result.forEach((model) => self.push(model));\n return self.findSyncByHandle(kind, handle);\n })\n .catch((reason) => {\n VC.Logger.error(`Cannot find ${kind} with handle '${handle}' (${reason})`);\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Finds model in local database by handle.\n *\n * @param {String} kind - The kind of model.\n * @param {String} handle - The handle/slug.\n * @return {Model} The model from local cache.\n */\n findSyncByHandle(kind, handle) {\n return this._db.dig(pluralize(kind), handle);\n }\n\n /**\n * @description\n * Loads model from remote by handle.\n *\n * @param {String} kind - The kind of model.\n * @param {String} handle - The handle/slug.\n * @return {Promise} Promise that resolves with remote model.\n */\n loadByHandle(kind, handle) {\n const self = this;\n return this.adapter\n .getRessourceByHandle(kind, handle)\n .then((data) => self.loadData(kind, data));\n }\n\n /**\n * @description\n * Finds an article by blog handle and article handle.\n *\n * @param {String} blogHandle - The blog handle.\n * @param {String} articleHandle - The article handle.\n * @return {Promise} Promise that resolves with the article.\n *\n * @example\n * store.findArticle('mein-blog', 'mein-artikel').then(function(article) {\n * console.log(article.title);\n * });\n */\n findArticle(blogHandle, articleHandle) {\n const self = this;\n\n return this.adapter\n .getArticle(blogHandle, articleHandle)\n .then((data) => {\n const result = self.loadData('article', data);\n result.forEach((model) => self.push(model));\n return result[0];\n })\n .catch((reason) => {\n VC.Logger.error(\n `Cannot find article '${articleHandle}' in blog '${blogHandle}' (${reason})`\n );\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Finds all models of a given kind (list endpoint).\n *\n * @param {String} kind - The kind of model (e.g. \"page\", \"blog\", \"linklist\").\n * @return {Promise} Promise that resolves with array of models.\n *\n * @example\n * store.findAll('page').then(function(pages) {\n * pages.forEach(function(page) {\n * console.log(page.title);\n * });\n * });\n */\n findAll(kind) {\n const self = this;\n\n return this.adapter\n .getList(kind)\n .then((data) => self._loadListData(kind, data))\n .catch((reason) => {\n VC.Logger.error(`Cannot find ${kind} list (${reason})`);\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Loads list data and returns array of models.\n * @private\n */\n _loadListData(kind, data) {\n const self = this;\n const pluralizedKind = pluralize(kind);\n const items = data[pluralizedKind] || [];\n const models = [];\n\n items.forEach((item) => {\n // Items in list responses are wrapped: { page: { ... } }\n const result = self.loadData(kind, item);\n result.forEach((model) => self.push(model));\n models.push(result[0]);\n });\n\n return models;\n }\n\n /*\n * @description\n * Loads model from given data.\n *\n * @param {String} kind - The kind of model.\n * @param {Object} data - The data for the model.\n * @return {Model} The deserialized model.\n *\n * @example\n * var store = new Store({ client: client });\n *\n * var product = store.loadData('product', { id: 1 });\n * console.log(product); // => Product\n */\n loadData(kind, data) {\n const serializer = this.client.serializer;\n return serializer.deserialize(kind, data);\n }\n\n /**\n * @description\n * Pushes a model into local db.\n *\n * @param {Model} model - The model.\n * @example\n * var store = new Store();\n * var product = new Product({ id: 1 });\n *\n * store.push(product);\n * store.findSync('product', 1); // => Product\n */\n push(model) {\n model.store = this;\n this._db.bury(model, ...model.storeKey);\n }\n\n /**\n * @description\n * Adapter of the store\n *\n * @type {Adapter}\n */\n get adapter() {\n return this.client.adapter;\n }\n}\n\nexport default Store;\n","export default (str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n","export default (data = {}) => {\n return Object.keys(data)\n .map((key) => `${key}=${data[key]}`)\n .join('&');\n};\n","import queryParams from 'utils/query-params';\n\nexport default (url, data = {}) => {\n if (Object.keys(data).length === 0) {\n return url;\n }\n\n const params = queryParams(data);\n const hasQueryParams = url.match(/\\?[^?=]+=.+$/);\n\n return [url, params].join(hasQueryParams ? '&' : '?');\n};\n","import BaseObject from 'core/base-object';\nimport capitalize from 'utils/capitalize';\nimport pluralize from 'utils/pluralize';\nimport queryParams from 'utils/query-params';\nimport appendQueryParams from 'utils/append-query-params';\nimport VC from 'versacommerce';\n\nconst isStatusOk = (code) => code >= 200 && code < 300;\n\n/**\n * @description\n * Class for accessing frontend API.\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * var adapter = new Adapter({\n * baseUrl: '//mein-test-shop.versacommerce.de'\n * });\n */\nclass Adapter extends BaseObject {\n /**\n * @description\n * Creates a new Adapter instance\n *\n * @param {Object} options\n * @param {String} options.baseUrl - The base url for the adapter.\n * @param {Object} [options.queryParams={}] - The GET query parameters which are\n * appended to every request of the adapter.\n */\n constructor({ baseUrl = '', queryParams = {} }) {\n super();\n\n this.baseUrl = baseUrl.replace(/\\/$/, ''); // remove trailing slash\n this._queryParams = queryParams;\n }\n\n /**\n * @description\n * Returns Promise for JSON of ressource\n *\n * @param {String} kind - The ressource kind (e.g. \"product\" or\n * \"collection\").\n * @param {Number} id - The id of the ressource.\n * @return {Promise} Promise that resolves with the parsed JSON of the\n * ressource.\n *\n * @example\n * var adapter = new Adapter({\n * baseUrl: '//mein-test-shop.versacommerce.de'\n * });\n *\n * adapter.getRessource('product', 1).then(function(json) {\n * console.log(json) // => { 'product': { ... } }\n * });\n */\n getRessource(kind, id) {\n const url = this.urlForRessource(kind, id);\n return this.getJSON(url);\n }\n\n /**\n * @description\n * Builds url for resource\n *\n * @param {String} kind - The ressource kind (e.g. \"product\" or\n * \"collection\").\n * @param {Number} id - The id of the ressource.\n * @return {String} The url of the ressource.\n *\n * @example\n * var adapter = new Adapter({\n * baseUrl: '//mein-test-shop.versacommerce.de'\n * });\n *\n * adapter.urlForRessource('product', 1);\n * // => '//mein-test-shop.versacommerce.de/products/1.json'\n */\n urlForRessource(kind, id) {\n const customUrlGenerator = this['_urlFor' + capitalize(kind)];\n if (customUrlGenerator) {\n return customUrlGenerator.apply(this, arguments);\n }\n\n const pluralizedKind = pluralize(kind);\n return [this.baseUrl, pluralizedKind, id + '.json'].join('/');\n }\n\n _urlForCart() {\n return [this.baseUrl, 'cart.json'].join('/');\n }\n\n /**\n * @description\n * URL for shop endpoint (root level)\n * @private\n */\n _urlForShop() {\n return this.rootUrl + '/shop.json';\n }\n\n /**\n * @description\n * URL for page by handle (root level)\n * @private\n */\n _urlForPage(kind, handle) {\n return this.rootUrl + '/pages/' + handle + '.json';\n }\n\n /**\n * @description\n * URL for blog by handle (root level)\n * @private\n */\n _urlForBlog(kind, handle) {\n return this.rootUrl + '/blogs/' + handle + '.json';\n }\n\n /**\n * @description\n * URL for article by blog handle and article handle (root level)\n * @private\n */\n _urlForArticle(kind, blogHandle, articleHandle) {\n return this.rootUrl + '/blogs/' + blogHandle + '/' + articleHandle + '.json';\n }\n\n /**\n * @description\n * URL for linklist by handle (root level)\n * @private\n */\n _urlForLinklist(kind, handle) {\n return this.rootUrl + '/linklists/' + handle + '.json';\n }\n\n /**\n * @description\n * Returns Promise for JSON of resource by handle\n *\n * @param {String} kind - The resource kind (e.g. \"page\", \"blog\", \"linklist\").\n * @param {String} handle - The handle/slug of the resource.\n * @return {Promise} Promise that resolves with the parsed JSON.\n *\n * @example\n * adapter.getRessourceByHandle('page', 'impressum').then(function(json) {\n * console.log(json) // => { 'page': { ... } }\n * });\n */\n getRessourceByHandle(kind, handle) {\n const url = this.urlForRessource(kind, handle);\n return this.getJSON(url);\n }\n\n /**\n * @description\n * Returns Promise for JSON of article\n *\n * @param {String} blogHandle - The blog handle.\n * @param {String} articleHandle - The article handle.\n * @return {Promise} Promise that resolves with the parsed JSON.\n */\n getArticle(blogHandle, articleHandle) {\n const url = this._urlForArticle('article', blogHandle, articleHandle);\n return this.getJSON(url);\n }\n\n /**\n * @description\n * Returns Promise for JSON list of resources\n *\n * @param {String} kind - The resource kind (e.g. \"page\", \"blog\", \"linklist\", \"collection\").\n * @return {Promise} Promise that resolves with the parsed JSON array.\n *\n * @example\n * adapter.getList('page').then(function(json) {\n * console.log(json) // => { 'pages': [...] }\n * });\n */\n getList(kind) {\n const url = this._urlForList(kind);\n return this.getJSON(url);\n }\n\n /**\n * @description\n * URL for list endpoint (root level)\n * @private\n */\n _urlForList(kind) {\n const pluralizedKind = pluralize(kind);\n return this.rootUrl + '/' + pluralizedKind + '.json';\n }\n\n /**\n * @description\n * Returns Promise for product by handle (root level)\n *\n * @param {String} handle - The product handle/slug.\n * @return {Promise} Promise that resolves with the parsed JSON.\n */\n getProductByHandle(handle) {\n const url = this.rootUrl + '/products/' + handle + '.json';\n return this.getJSON(url);\n }\n\n /**\n * @description\n * Returns Promise for collection by handle (root level)\n *\n * @param {String} handle - The collection handle/slug.\n * @return {Promise} Promise that resolves with the parsed JSON.\n */\n getCollectionByHandle(handle) {\n const url = this.rootUrl + '/collections/' + handle + '.json';\n return this.getJSON(url);\n }\n\n /**\n * @description\n * Builds url for adding given variant to cart and redirecting to checkout.\n *\n * @param {Variant} variant - The variant to add.\n * @param {Number} [quantity=1] - The quantity to add to the cart.\n * @return {String} The checkout url.\n */\n checkoutUrlForVariant(variant, quantity = 1, params = {}) {\n let url = [this.rootUrl, 'cart', 'add'].join('/');\n\n params = Object.assign(\n {\n clear: 1,\n return_to: encodeURIComponent('/checkout'),\n 'products[][id]': variant.id,\n 'products[][quantity]': quantity\n },\n params\n );\n url = appendQueryParams(url, params);\n\n return this.makeUrl(url);\n }\n\n /**\n * @description\n * Builds url for adding given variant to cart.\n *\n * @param {Variant} variant - The variant to add.\n * @param {Number} [quantity=1] - The quantity to add to the cart.\n * @return {String} The add to cart url.\n */\n addToCartUrlForVariant(variant, quantity = 1, params = {}) {\n let url = [this.rootUrl, 'cart', 'add'].join('/');\n\n params = Object.assign(\n {\n 'products[][id]': variant.id,\n 'products[][quantity]': quantity\n },\n params\n );\n url = appendQueryParams(url, params);\n\n return this.makeUrl(url);\n }\n\n /**\n * @description\n * Builds url for viewing page of given product.\n *\n * @param {Product} product - The product to view.\n * @return {String} The product page url.\n */\n urlForProduct(product, params = {}) {\n let url = [this.rootUrl, 'products', product.id].join('/');\n\n url = appendQueryParams(url, params);\n\n return this.makeUrl(url);\n }\n\n /**\n * @description\n * Returns Promise for content at given url\n *\n * @param {String} url - The remote url.\n * @return {String} The response text.\n *\n * @example\n * var Adapter = new Adapter({\n * baseUrl: '//mein-test-shop.versacommerce.de'\n * });\n *\n * adapter.get('http://example.com/test.txt', function(response) {\n * console.log(response);\n * // => \"test\"\n * });\n */\n get(url) {\n url = this.makeUrl(url);\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const DONE = 4;\n xhr.open('GET', url);\n xhr.withCredentials = true;\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== DONE) {\n return;\n }\n\n if (!isStatusOk(xhr.status)) {\n VC.Logger.error(`Error retrieving ${url} (${xhr.status})`);\n reject(xhr.status);\n return;\n }\n\n resolve(xhr.responseText);\n };\n xhr.send(null);\n });\n }\n\n /**\n * @description\n * Sends data via POST request and retrieves data.\n *\n * @param {String} url - The remote url.\n * @param {Object} data - The data to sent.\n *\n * @return {Promise} Promise that resolves with response text after\n * sending data via POST.\n */\n post(url, data = {}) {\n const query = queryParams(data);\n url = this.makeUrl(url);\n\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n const DONE = 4;\n\n xhr.open('POST', url);\n xhr.withCredentials = true;\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n xhr.onreadystatechange = () => {\n if (xhr.readyState !== DONE) {\n return;\n }\n\n if (!isStatusOk(xhr.status)) {\n VC.Logger.error(`Error retrieving ${url} (${xhr.status})`);\n reject(xhr.status);\n return;\n }\n\n resolve(xhr.responseText);\n };\n\n xhr.send(query);\n });\n }\n\n /**\n * @description\n * Retrieves JSON from a url.\n *\n * @param {String} url - The remote url.\n * @return {Promise} Promise that resolves with the response JSON.\n *\n * @example\n * var Adapter = new Adapter({\n * baseUrl: '//mein-test-shop.versacommerce.de'\n * });\n *\n * adapter.getJSON('http://example.com/test.json', function(root) {\n * console.log(root);\n * // => { ... }\n * });\n */\n getJSON(url) {\n const self = this;\n return this.get(url)\n .then((response) => self._parseJSON(response))\n .catch((reason) => {\n if (reason === 'invalid json') {\n VC.Logger.error(`Cannot parse JSON (${url})`);\n }\n\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Sends data via POST request and retrieves json.\n *\n * @param {String} url - The remote url.\n * @param {Object} data - The data to sent.\n *\n * @return {Promise} Promise that resolves with response JSON after sending\n * data via POST.\n */\n postJSON(url, data = {}) {\n const self = this;\n return this.post(url, data)\n .then((response) => self._parseJSON(response))\n .catch((reason) => {\n if (reason === 'invalid json') {\n VC.Logger.error(`Cannot parse JSON (${url})`);\n }\n\n return Promise.reject(reason);\n });\n }\n\n /**\n * @description\n * Builds url with optional query params appended.\n *\n * @param {String} url - The url.\n * @return {String} The url with query params appended.\n */\n makeUrl(url) {\n return appendQueryParams(url, this._queryParams);\n }\n\n _parseJSON(content) {\n try {\n const data = JSON.parse(content);\n return Promise.resolve(data);\n } catch {\n return Promise.reject('invalid json');\n }\n }\n\n /**\n * @description\n * Root url of base url.\n *\n * @type {String}\n */\n get rootUrl() {\n const baseUrl = this.baseUrl;\n const match = baseUrl.match(/^(?:https?:)?\\/\\/(?:[^/]+)/);\n\n return match ? match[0] : baseUrl;\n }\n}\n\nexport default Adapter;\n","export default (str) => {\n return str.replace(/(_|-)[A-z0-9]/g, (s) => {\n return s.substring(1, 2).toUpperCase();\n });\n};\n","export default (str) => {\n return str.replace(/s$/, '');\n};\n","export default (str) => {\n return str.charAt(0).toLowerCase() + str.slice(1);\n};\n","import decapitalize from './decapitalize';\n\nexport default (str) => {\n return decapitalize(str)\n .replace(/[A-Z]/g, (s) => {\n return '_' + s.toLowerCase();\n })\n .replace(/-/g, '_');\n};\n","let flatten = (array) => {\n return array.reduce((a, b) => {\n return a.concat(Array.isArray(b) ? flatten(b) : b);\n }, []);\n};\n\nexport default flatten;\n","import BaseObject from 'core/base-object';\nimport camelcase from 'utils/camelcase';\nimport entries from 'utils/entries';\nimport singularize from 'utils/singularize';\nimport underscore from 'utils/underscore';\nimport flatten from 'utils/flatten';\nimport VC from 'versacommerce';\n\n/**\n * @description\n * Class used to deserialize results from frontend API.\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * var serializer = new Serializer();\n *\n * // deserialize json object\n * serializer.deserialize('product', {\n * product: { id: 1 }\n * }); // => [Product]\n */\nclass Serializer extends BaseObject {\n /**\n * @description\n * Returns models with denpendent models from relationships.\n *\n * @param {String} kind - The kind of model.\n * @param {Object} root - The JSON object.\n * @return {Array} The array with model and dependencies (first element is model).\n *\n * @example\n * var serializer = new Serializer();\n * serializer.deserialize('product', {\n * product: {\n * id: 1,\n * images: [{\n * 'image': { id: 1 }\n * }]\n * }\n * }); // => [Product, Image]\n */\n deserialize(kind, json) {\n const root = this.getRoot(kind, json);\n const attributes = this.normalize(root);\n const Klass = VC.lookup(['models', kind].join('/'));\n const dependencies = this._resolveRelationships(Klass, attributes);\n const model = new Klass(attributes);\n\n return [model].concat(dependencies);\n }\n\n /**\n * @description\n * Returns copy of object with normalized keys.\n *\n * @param {Object} values - The object to normalize.\n * @return {Object} The object with normalized keys.\n *\n * @example\n * var serializer = new Serializer();\n * var values = { test_value: 0 };\n * serializer.normalize(values); // => { testValue: 0 }\n */\n normalize(values) {\n const attributes = {};\n for (let [key, value] of entries(values)) {\n let name = camelcase(key);\n attributes[name] = value;\n }\n\n return attributes;\n }\n\n /**\n * @description\n * Extracts root object from JSON object returned by adapter.\n *\n * @param {String} kind - The kind.\n * @param {Object} json - The JSON object.\n *\n * @return {Object} The extracted root object.\n */\n getRoot(kind, json) {\n const key = underscore(kind);\n return json[key];\n }\n\n _resolveRelationships(klass, attributes) {\n const self = this;\n const dependencies = [];\n\n // hasMany relationships\n // NOTE: need to rescue with empty array due to unsupported inheritance of static\n // properties in IE <= 10\n (klass.hasMany || []).forEach((name) => {\n let children = self._resolveHasManyRelationship(name, attributes);\n dependencies.push(...children);\n });\n\n // hasOne relationships\n // NOTE: need to rescue with empty array due to unsupported inheritance of static\n // properties in IE <= 10\n (klass.hasOne || []).forEach((name) => {\n const child = self._resolveHasOneRelationship(name, attributes);\n if (child) {\n dependencies.push(child);\n }\n });\n\n return flatten(dependencies);\n }\n\n _resolveHasManyRelationship(name, attributes) {\n const [attributeName, kinds] = name.split(':');\n const childrenRoot = attributes[attributeName] || [];\n const kind = singularize(kinds);\n const children = childrenRoot.map((root) => this.deserialize(kind, root));\n const flattenedChildren = flatten(children);\n\n attributes[attributeName] = children.map((child) => child[0].id);\n\n return flatten(flattenedChildren);\n }\n\n _resolveHasOneRelationship(name, attributes) {\n const [attributeName, kind] = name.split(':');\n const root = attributes[attributeName];\n if (!root) {\n return;\n }\n\n const child = this.deserialize(kind, root)[0];\n attributes[attributeName] = child.id;\n\n return child;\n }\n}\n\nexport default Serializer;\n","import BaseObject from 'core/base-object';\nimport Store from 'core/store';\nimport Adapter from 'core/adapter';\nimport Serializer from 'core/serializer';\nimport VC from 'versacommerce';\n\n/**\n * @description\n * Class for accessing product and collections of a single shop.\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * // create a client\n * var client = new Client({\n * shopName: 'mein-test-shop'\n * });\n */\nclass Client extends BaseObject {\n /**\n * @description\n * Creates a new Client instance.\n *\n * @param {Object} options\n * @param {String} options.shopName - The shop name (subdomain of the\n * shop).\n * @param {Boolean} [options.ssl=true] - Sets whether requests are send via\n * https (instead of http).\n * @param {String} [options.trackingCode=null] - The tracking code (e.g.\n * Google Analytics) appended to each request.\n * @param {String} [options.salesChannel=null] - The sales channel which is appended to\n * each request.\n */\n constructor({ shopName = null, ssl = true, trackingCode = null, salesChannel = null }) {\n const properties = {};\n const protocol = ssl ? 'https' : 'http';\n\n if (typeof shopName !== 'string' || shopName.length === 0) {\n const msg = `Cannot create Client with invalid shop name '${shopName}'`;\n VC.Logger.error(msg);\n throw new Error(msg);\n }\n\n properties.baseUrl = `${protocol}://${shopName}.versacommerce.de/js-api`;\n super(properties);\n\n let queryParams = {};\n\n if (trackingCode) {\n queryParams.utm_source = trackingCode;\n }\n\n if (salesChannel) {\n queryParams.channel = salesChannel;\n }\n\n this.adapter = new Adapter({\n baseUrl: this.baseUrl,\n queryParams\n });\n this.serializer = new Serializer();\n this.store = new Store({ client: this });\n }\n\n /**\n * @description\n * Finds a single product by id.\n *\n * @param {Number} - The id of the product.\n * @return {Promise} Promise that resolves with the product.\n *\n * @example\n * client.findProduct(1).then(function(product) {\n * console.log(product.id); // => 1\n * }).catch(function() {\n * console.log('product not found');\n * });\n */\n findProduct(id) {\n return this.store.find('product', id);\n }\n\n /**\n * @description\n * Finds a single collection by id.\n *\n * @param {Number} - The id of the collection.\n * @return {Promise} Promise that resolves with the collection.\n *\n * @example\n * client.findCollection(1).then(function(collection) {\n * console.log(collection.id); // => 1\n * }).catch(function() {\n * console.log('collection not found');\n * });\n */\n findCollection(id) {\n return this.store.find('collection', id);\n }\n\n /**\n * @description\n * Returns Promise which resolves with cart.\n *\n * @return {Promise} Promise that resolves with the cart.\n */\n getCart() {\n return this.store.find('cart');\n }\n\n // ==========================================\n // Shop\n // ==========================================\n\n /**\n * @description\n * Returns Promise which resolves with shop metadata.\n *\n * @return {Promise} Promise that resolves with the shop.\n *\n * @example\n * client.getShop().then(function(shop) {\n * console.log(shop.name); // => \"Björn's Einkaufswelt\"\n * console.log(shop.productsCount); // => 15\n * console.log(shop.currency); // => \"EUR\"\n * });\n */\n getShop() {\n return this.store.find('shop');\n }\n\n // ==========================================\n // Pages\n // ==========================================\n\n /**\n * @description\n * Returns Promise which resolves with all pages.\n *\n * @return {Promise} Promise that resolves with array of pages.\n *\n * @example\n * client.getPages().then(function(pages) {\n * pages.forEach(function(page) {\n * console.log(page.handle, page.title);\n * });\n * });\n */\n getPages() {\n return this.store.findAll('page');\n }\n\n /**\n * @description\n * Finds a single page by handle.\n *\n * @param {String} handle - The handle/slug of the page.\n * @return {Promise} Promise that resolves with the page.\n *\n * @example\n * client.findPage('impressum').then(function(page) {\n * console.log(page.title); // => \"Impressum\"\n * console.log(page.content); // => \"<h2>Verantwortlich</h2>...\"\n * });\n */\n findPage(handle) {\n return this.store.findByHandle('page', handle);\n }\n\n // ==========================================\n // Blogs\n // ==========================================\n\n /**\n * @description\n * Returns Promise which resolves with all blogs.\n *\n * @return {Promise} Promise that resolves with array of blogs.\n *\n * @example\n * client.getBlogs().then(function(blogs) {\n * blogs.forEach(function(blog) {\n * console.log(blog.handle, blog.title);\n * });\n * });\n */\n getBlogs() {\n return this.store.findAll('blog');\n }\n\n /**\n * @description\n * Finds a single blog by handle.\n *\n * @param {String} handle - The handle/slug of the blog.\n * @return {Promise} Promise that resolves with the blog.\n *\n * @example\n * client.findBlog('mein-blog').then(function(blog) {\n * console.log(blog.title); // => \"Mein Blog\"\n * console.log(blog.articlesCount); // => 5\n * });\n */\n findBlog(handle) {\n return this.store.findByHandle('blog', handle);\n }\n\n /**\n * @description\n * Finds a single article by blog handle and article handle.\n *\n * @param {String} blogHandle - The handle/slug of the blog.\n * @param {String} articleHandle - The handle/slug of the article.\n * @return {Promise} Promise that resolves with the article.\n *\n * @example\n * client.findArticle('mein-blog', 'mein-artikel').then(function(article) {\n * console.log(article.title); // => \"Mein Artikel\"\n * console.log(article.author); // => \"Max Mustermann\"\n * console.log(article.publishedAt); // => \"2025-01-01T12:00:00+01:00\"\n * });\n */\n findArticle(blogHandle, articleHandle) {\n return this.store.findArticle(blogHandle, articleHandle);\n }\n\n // ==========================================\n // Linklists (Navigation)\n // ==========================================\n\n /**\n * @description\n * Returns Promise which resolves with all linklists.\n *\n * @return {Promise} Promise that resolves with array of linklists.\n *\n * @example\n * client.getLinklists().then(function(linklists) {\n * linklists.forEach(function(linklist) {\n * console.log(linklist.handle, linklist.title);\n * });\n * });\n */\n getLinklists() {\n return this.store.findAll('linklist');\n }\n\n /**\n * @description\n * Finds a single linklist (navigation) by handle.\n *\n * @param {String} handle - The handle/slug of the linklist.\n * @return {Promise} Promise that resolves with the linklist.\n *\n * @example\n * client.findLinklist('haupt-navigation').then(function(nav) {\n * console.log(nav.title); // => \"Haupt-Navigation\"\n * nav.rootLinks.forEach(function(link) {\n * console.log(link.title, link.url);\n * link.children.forEach(function(child) {\n * console.log(' -', child.title);\n * });\n * });\n * });\n */\n findLinklist(handle) {\n return this.store.findByHandle('linklist', handle);\n }\n\n // ==========================================\n // Collections (extended)\n // ==========================================\n\n /**\n * @description\n * Returns Promise which resolves with all collections.\n *\n * @return {Promise} Promise that resolves with array of collections.\n *\n * @example\n * client.getCollections().then(function(collections) {\n * collections.forEach(function(collection) {\n * console.log(collection.handle, collection.title);\n * });\n * });\n */\n getCollections() {\n return this.store.findAll('collection');\n }\n\n /**\n * @description\n * Finds a single collection by handle.\n *\n * @param {String} handle - The handle/slug of the collection.\n * @return {Promise} Promise that resolves with the collection.\n *\n * @example\n * client.findCollectionByHandle('sale').then(function(collection) {\n * console.log(collection.title);\n * collection.products.forEach(function(product) {\n * console.log(product.title);\n * });\n * });\n */\n findCollectionByHandle(handle) {\n return this.store.findByHandle('collection', handle);\n }\n\n // ==========================================\n // Products (extended)\n // ==========================================\n\n /**\n * @description\n * Finds a single product by handle.\n *\n * @param {String} handle - The handle/slug of the product.\n * @return {Promise} Promise that resolves with the product.\n *\n * @example\n * client.findProductByHandle('ball-in-vielen-farben').then(function(product) {\n * console.log(product.title); // => \"Ball\"\n * console.log(product.price); // => 5.95\n * });\n */\n findProductByHandle(handle) {\n return this.store.findByHandle('product', handle);\n }\n\n static get displayName() {\n return 'Client';\n }\n}\n\nexport default Client;\n","import BaseObject from 'core/base-object';\n\n/**\n * @description\n * Abstract class used for registering model constructors and singeltons (e.g.\n * adapters).\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * // create a new registry\n * var registry = new Registry();\n *\n * // register a value\n * registry.register('test/value', 'test');\n *\n * // access registered value\n * registry.lookup('test/value'); // => 'test'\n */\nclass Registry extends BaseObject {\n /**\n * @description\n * Creates a new Registry instance.\n */\n constructor() {\n super({\n _db: new BaseObject()\n });\n }\n\n /**\n * @description\n * Registers a new value under given path.\n *\n * @param {String} path - The path.\n * @param {*} value - The value.\n *\n * @example\n * var registry = new Registry();\n * registry.register('test/value', 'test');\n * registry.lookup('test/value'); // => 'test'\n */\n register(path, value) {\n this._db.bury(value, ...path.split('/'));\n }\n\n /**\n * @description\n * Looks up a value under given path.\n *\n * @param {String} path - The path.\n * @return {*} - The value.\n *\n * @example\n * var registry = new Registry();\n * registry.register('test/value', 'test');\n * registry.lookup('test/value'); // => 'test'\n */\n lookup(path) {\n return this._db.dig(...path.split('/'));\n }\n}\n\nexport default Registry;\n","/*eslint no-console: 0*/\n\nconst silent = true;\n\nexport default {\n silent,\n\n info(msg) {\n if (this.silent) {\n return;\n }\n\n console.log(`VersaCommerce: ${msg}`);\n },\n\n warn(msg) {\n if (this.silent) {\n return;\n }\n\n console.warn(`VersaCommerce [Warning]: ${msg}`);\n },\n\n error(msg) {\n if (this.silent) {\n return;\n }\n\n console.error(`VersaCommerce [Error]: ${msg}`);\n }\n};\n","import decapitalize from './decapitalize';\n\nexport default (str) => {\n return decapitalize(str)\n .replace(/[A-Z]/g, (s) => {\n return '-' + s.toLowerCase();\n })\n .replace(/_/g, '-');\n};\n","import BaseObject from 'core/base-object';\nimport dasherize from 'utils/dasherize';\nimport pluralize from 'utils/pluralize';\n\n/**\n * @description\n * Abstrac class used as parent for all models.\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * // create a model\n * var model = new Model({\n * id: 1,\n * title: 'Test'\n * });\n *\n * // access id of model\n * model.id; // => 1\n */\nclass Model extends BaseObject {\n /**\n * @description\n * Creates a new Model instance.\n *\n * @param {Object} [attributes={}] - Model attributes which are set on creation.\n */\n constructor(attributes = {}) {\n super({\n attributes: attributes\n });\n\n this._defineRelationshipProperties();\n }\n\n /**\n * @description\n * Alias for attributes.id.\n *\n * @type {Number}\n *\n * @example\n * var model = new Model({ id: 1 });\n * model.id; // => 1\n */\n get id() {\n return this.attributes.id;\n }\n\n /**\n * @description\n * Key(s) used in the database of the store.\n *\n * @type {Array}\n */\n get storeKey() {\n const kind = dasherize(this.constructor.displayName);\n return [pluralize(kind), this.id];\n }\n\n /**\n * @description\n * Updates attributes and clears cached properties.\n *\n * @param {Object} attributes - The attributes to update.\n */\n update(attrs) {\n const self = this;\n\n this.clearCachedProperties();\n Object.keys(attrs).forEach((key) => {\n self.attributes[key] = attrs[key];\n });\n }\n\n /**\n * @description\n * Refreshes attributes of the model from remote (using store).\n *\n * @return {Promise} - Promise that fulfills with refreshed model\n */\n refresh() {\n return this.store.refresh(...this.storeKey);\n }\n\n /**\n * @description\n * Converts model to string representation.\n *\n * @return {String} - The string represenation.\n */\n toString() {\n const className = this.constructor.displayName;\n return `${className} id:${this.id}`;\n }\n\n _defineRelationshipProperties() {\n // hasMany relationships\n // NOTE: need to rescue with empty array due to unsupported inheritance of static\n // properties in IE <= 10\n (this.constructor.hasMany || []).forEach((name) => {\n let [attributeName, kind] = name.split(':');\n this._defineHasManyProperties(kind, attributeName);\n });\n\n // hasOne relationships\n // NOTE: need to rescue with empty array due to unsupported inheritance of static\n // properties in IE <= 10\n (this.constructor.hasOne || []).forEach((name) => {\n let [attributeName, kind] = name.split(':');\n this._defineHasOneProperties(kind, attributeName);\n });\n }\n\n _defineHasManyProperties(kind, attributeName) {\n this.defineCachedProperty(attributeName, function () {\n const self = this;\n const ids = this.attributes[attributeName];\n\n return ids ? ids.map((id) => self.store.findSync(kind, id)) : undefined;\n });\n }\n\n _defineHasOneProperties(kind, attributeName) {\n this.defineCachedProperty(attributeName, function () {\n const id = this.attributes[attributeName];\n return id ? this.store.findSync(kind, id) : undefined;\n });\n }\n\n /**\n * @description\n * Returns the one-to-many relationships.\n *\n * @type {Array}\n */\n static get hasMany() {\n return [];\n }\n\n /**\n * @description\n * Returns the one-to-one relationships.\n *\n * @type {Array}\n */\n static get hasOne() {\n return [];\n }\n\n /**\n * @const {String}\n *\n * @default 'Model'\n *\n * @example\n * var model = new Model();\n * model.constructor.displayName; // => 'Model'\n */\n static get displayName() {\n return 'Model';\n }\n}\n\nexport default Model;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model representing a blog article.\n *\n * @extends Model\n * @memberof module:models\n *\n * @example\n * client.findArticle('mein-blog', 'mein-artikel').then(article => {\n * console.log(article.title); // => \"Mein Artikel\"\n * console.log(article.author); // => \"Max Mustermann\"\n * console.log(article.publishedAt); // => \"2025-01-01T12:00:00+01:00\"\n * });\n */\nclass Article extends Model {\n /**\n * @description\n * Article handle (URL slug)\n *\n * @type {String}\n */\n get handle() {\n return this.attributes.handle;\n }\n\n /**\n * @description\n * Article title\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Article content (HTML)\n *\n * @type {String}\n */\n get content() {\n return this.attributes.content;\n }\n\n /**\n * @description\n * Article author name\n *\n * @type {String}\n */\n get author() {\n return this.attributes.author;\n }\n\n /**\n * @description\n * Article URL path\n *\n * @type {String}\n */\n get url() {\n return this.attributes.url;\n }\n\n /**\n * @description\n * Article creation date\n *\n * @type {String}\n */\n get createdAt() {\n return this.attributes.createdAt;\n }\n\n /**\n * @description\n * Article publication date\n *\n * @type {String}\n */\n get publishedAt() {\n return this.attributes.publishedAt;\n }\n\n /**\n * @description\n * Number of comments\n *\n * @type {Number}\n */\n get commentsCount() {\n return this.attributes.commentsCount;\n }\n\n /**\n * @description\n * Whether comments are enabled\n *\n * @type {Boolean}\n */\n get commentsEnabled() {\n return this.attributes.commentsEnabled;\n }\n\n /**\n * @description\n * URL for posting comments\n *\n * @type {String}\n */\n get commentPostUrl() {\n return this.attributes.commentPostUrl;\n }\n\n /**\n * @description\n * Store key using id\n *\n * @type {Array}\n */\n get storeKey() {\n return ['articles', this.id];\n }\n\n /**\n * @description\n * One-to-one relationships\n *\n * @type {Array}\n */\n static get hasOne() {\n return ['blog:blog'];\n }\n\n /**\n * @const {String}\n * @default 'Article'\n */\n static get displayName() {\n return 'Article';\n }\n}\n\nexport default Article;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model representing a blog.\n *\n * @extends Model\n * @memberof module:models\n *\n * @example\n * client.findBlog('mein-blog').then(blog => {\n * console.log(blog.title); // => \"Mein Blog\"\n * console.log(blog.articlesCount); // => 5\n * blog.articles.forEach(article => {\n * console.log(article.title);\n * });\n * });\n */\nclass Blog extends Model {\n /**\n * @description\n * Blog handle (URL slug)\n *\n * @type {String}\n */\n get handle() {\n return this.attributes.handle;\n }\n\n /**\n * @description\n * Blog title\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Blog URL path\n *\n * @type {String}\n */\n get url() {\n return this.attributes.url;\n }\n\n /**\n * @description\n * Full blog URL path\n *\n * @type {String}\n */\n get fullUrl() {\n return this.attributes.fullUrl;\n }\n\n /**\n * @description\n * Number of articles in this blog\n *\n * @type {Number}\n */\n get articlesCount() {\n return this.attributes.articlesCount;\n }\n\n /**\n * @description\n * Whether comments are enabled\n *\n * @type {Boolean}\n */\n get commentsEnabled() {\n return this.attributes.commentsEnabled;\n }\n\n /**\n * @description\n * Whether comments are moderated\n *\n * @type {Boolean}\n */\n get moderated() {\n return this.attributes.moderated;\n }\n\n /**\n * @description\n * Store key using handle\n *\n * @type {Array}\n */\n get storeKey() {\n return ['blogs', this.handle];\n }\n\n /**\n * @description\n * One-to-many relationships\n *\n * @type {Array}\n */\n static get hasMany() {\n return ['articles:article'];\n }\n\n /**\n * @const {String}\n * @default 'Blog'\n */\n static get displayName() {\n return 'Blog';\n }\n}\n\nexport default Blog;\n","import BaseObject from 'core/base-object';\nimport VC from 'versacommerce';\n\n/**\n * @description\n * Abstract class for registering and triggering events.\n *\n * @extends BaseObject\n * @memberof module:core\n *\n * @example\n * // create emitter\n * var emitter = new EventEmitter('change', 'notify');\n *\n * // register events\n * emitter.on('change', function() { ... });\n * emitter.on('notify', function() { ... });\n *\n * // trigger event\n * emitter.trigger('change', 'some', 'argument');\n */\nclass EventEmitter extends BaseObject {\n /**\n * @description\n * Creates a new EventEmitter instance.\n *\n * @param {String[]} [events=[]] - Events which can be emitted.\n * @param {Object} [callee=null] - Argument passed as this to listeners.\n */\n constructor(events = [], callee = null) {\n super();\n\n const listeners = {};\n (events || []).forEach((evt) => {\n listeners[evt] = [];\n });\n\n this._listeners = listeners;\n this._callee = callee || {};\n }\n\n /**\n * @description\n * Registers a new event listener.\n *\n * @param {String} event - The name of the event.\n * @param {Function} listener - The callback function.\n */\n on(evt, listener) {\n const eventListeners = this._listeners[evt];\n\n if (!eventListeners) {\n VC.Logger.warn(`Trying to register a listener for an unknown event (${event})`);\n return;\n }\n\n if (eventListeners.indexOf(listener) > -1) {\n VC.Logger.warn(`Trying to register a listener that has been registered before (${event})`);\n return;\n }\n\n if (typeof listener !== 'function') {\n VC.Logger.warn(`Trying to register a listener that is not callable (${event})`);\n return;\n }\n\n eventListeners.push(listener);\n }\n\n /**\n * @description\n * Removes an existing event listener.\n *\n * @param {String} event - The name of the event.\n * @param {Function} listener - The callback function.\n */\n off(evt, listener) {\n const eventListeners = this._listeners[evt];\n\n if (!eventListeners) {\n VC.Logger.warn(`Trying to unregister a listener for an unknown event (${event})`);\n return;\n }\n\n const index = eventListeners.indexOf(listener);\n if (index == -1) {\n VC.Logger.warn(`Trying to unregister an unknown listener (${event})`);\n return;\n }\n\n eventListeners.splice(index, 1);\n }\n\n /**\n * @description\n * Emits an event.\n *\n * @param {String} event - The name of the event.\n * @param {...*} arguments - The arguments passed to the listener functions.\n */\n emit(evt, ...args) {\n const eventListeners = this._listeners[evt];\n const callee = this._callee;\n\n if (!eventListeners) {\n VC.Logger.warn(`Trying to trigger an unknown event (${event})`);\n return;\n }\n\n eventListeners.forEach((listener) => listener.call(callee, ...args));\n }\n\n /**\n * @description\n * Supported events\n */\n get events() {\n return Object.keys(this._listeners);\n }\n}\n\nexport default EventEmitter;\n","import Model from 'core/model';\nimport EventEmitter from 'core/event-emitter';\n/**\n * @description\n * Model for the shopping cart.\n *\n * @extends Model\n * @memeberof module:models\n */\nclass Cart extends Model {\n constructor() {\n super(...arguments);\n\n const events = [\n 'willAdd',\n 'hasAdded',\n 'willClear',\n 'hasCleared',\n 'willChange',\n 'hasChanged',\n 'willUpdate',\n 'hasUpdated'\n ];\n this._eventEmitter = new EventEmitter(events, this);\n }\n\n /**\n * @description\n * Removes all line items from the cart.\n *\n * @return {Promise} - Promise that resolves with refreshed cart.\n */\n clearItems() {\n const ee = this._eventEmitter;\n\n ee.emit('willClear');\n return this._postCartUrl('clear.json').then((cart) => {\n ee.emit('hasCleared');\n return cart;\n });\n }\n\n /**\n * @description\n * Adds a variant to the cart.\n *\n * @param {Variant} variant - The variant to add to the cart.\n * @return {Promise} Promise that resolves with refreshed card.\n */\n addItem(variant, quantity = 1) {\n const ee = this._eventEmitter;\n\n ee.emit('willAdd', variant, quantity);\n return this._postCartUrl('add.json', {\n id: variant.id,\n quantity: quantity\n }).then((cart) => {\n ee.emit('hasAdded', variant, quantity);\n return cart;\n });\n }\n\n /**\n * @description\n * Removes a line item from the cart.\n *\n * @param {LineItem} lineItem - The line item to remove.\n * @return {Promise} - Promise that resolves with refreshed card.\n */\n removeItem(lineItem) {\n return this.changeItem(lineItem, 0);\n }\n\n /**\n * @description\n * Changes quantity or optionas of a line item in the cart.\n *\n * @param {LineItem} lineItem - The line item to remove.\n * @param {number} quantity - The new quantity (optional).\n * @param {object} options - The new options (optional).\n * @return {Promise} - Promise that resolves with refreshed card.\n */\n changeItem(lineItem, ...args) {\n const ee = this._eventEmitter;\n\n const id = lineItem.id;\n let quantity;\n let options;\n let data;\n\n if (args.length == 2) {\n quantity = args[0];\n options = args[1];\n data = { id, quantity, options };\n } else {\n if (isNaN(args[0])) {\n options = args[0];\n data = { id, options };\n } else {\n quantity = args[0];\n data = { id, quantity };\n }\n }\n\n if (data.options) {\n Object.keys(data.options).forEach(function (name) {\n data[`options[${name}]`] = data.options[name];\n });\n delete data.options;\n }\n\n ee.emit('willChange', lineItem, { quantity, options });\n return this._postCartUrl('update.json', data).then((cart) => {\n ee.emit('hasChanged', lineItem, { quantity, options });\n return cart;\n });\n }\n\n /**\n * @description\n * Updates the cart attributes for advanced features.\n *\n * @param {Object} attributes - The keys and values of the cart attributes\n * @return {Promise} - Promise that resolves with refreshed card.\n */\n updateCartAttributes(attributes) {\n const ee = this._eventEmitter;\n const params = {};\n\n Object.keys(attributes).forEach(function (name) {\n params[`attributes[${name}]`] = attributes[name];\n });\n\n ee.emit('willUpdate');\n return this._postCartUrl('update.json', params).then((cart) => {\n ee.emit('hasUpdated');\n return cart;\n });\n }\n\n /**\n * @description\n * Register a new event listener.\n *\n * @param\n * {('willAdd'|'hasAdded'|'willClear'|'hasCleared'|'willChange'|'hasChanged'|'willUpdate'|'hasUpdated')}\n * event - The name of the event.\n * @param {Function} listener - The listener callback function.\n */\n on(evt, listener) {\n this._eventEmitter.on(evt, listener);\n }\n\n /**\n * @description\n * Unregister an existing event listener.\n *\n * @param\n * {('willAdd'|'hasAdded'|'willClear'|'hasCleared'|'willChange'|'hasChanged'|'willUpdate'|'hasUpdated')}\n * event - The name of the event.\n * @param {Function} listener - The listener callback function.\n */\n off(evt, listener) {\n this._eventEmitter.off(evt, listener);\n }\n\n _postCartUrl(suffix, data = {}) {\n const adapter = this.store.adapter;\n const url = [adapter.baseUrl, 'cart', suffix].join('/');\n const self = this;\n\n return adapter.postJSON(url, data).then((responseData) => {\n return self.store.refreshWithData('cart', responseData);\n });\n }\n\n /**\n * @description\n * Id of cart which is undefined since the cart is a singelton.\n *\n * @default undefined\n */\n get id() {\n return undefined;\n }\n\n /**\n * @description\n * Total price\n *\n * @type {Number}\n */\n get totalPrice() {\n return this.attributes.totalPrice;\n }\n\n /**\n * @description\n * Subtotal price\n *\n * @type {Number}\n */\n get subtotalPrice() {\n return this.attributes.subtotalPrice;\n }\n\n /**\n * @description\n * Shipping cost\n *\n * @type {Number}\n */\n get shippingCost() {\n return this.attributes.shippingCost;\n }\n\n /**\n * @description\n * Tax amount\n *\n * @type {Number}\n */\n get taxAmount() {\n return this.attributes.taxAmount;\n }\n\n /**\n * @description\n * Tax rate\n *\n * Tax rate\n * @type {Number}\n */\n get taxRate() {\n return this.attributes.taxRate;\n }\n\n /**\n * @description\n * Extra cost\n *\n * @type {Number}\n */\n get extraPrice() {\n return this.attributes.extraPrice;\n }\n\n /**\n * @description\n * Cart attributes\n *\n * @type {Object}\n */\n get cartAttributes() {\n return this.attributes.cartAttributes;\n }\n\n /**\n * @description\n * Alias for lineItems\n *\n * @type {Array}\n */\n get items() {\n return this.lineItems;\n }\n\n /**\n * @description\n * True if cart does not contain any items.\n *\n * @type {Boolean}\n */\n get isEmpty() {\n return this.lineItems.length === 0;\n }\n\n get storeKey() {\n return ['cart'];\n }\n\n static get hasMany() {\n return ['lineItems:line-item'];\n }\n\n /**\n * @const {String}\n * @default 'Cart'\n */\n static get displayName() {\n return 'Cart';\n }\n}\n\nexport default Cart;\n","import Model from 'core/model';\n\n/**\n * @description\n * Class for collection of products.\n *\n * @extends Model\n * @memberof module:models\n */\nclass Collection extends Model {\n /**\n * @description\n * Title\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Description\n *\n * @type {String}\n */\n get description() {\n return this.attributes.description;\n }\n\n static get hasMany() {\n return ['products:product'];\n }\n\n /**\n * @const {String}\n * @default 'Collection'\n */\n static get displayName() {\n return 'Collection';\n }\n}\n\nexport default Collection;\n","export default (url, opts = {}) => {\n const options = Object.assign(\n {\n id: 1,\n width: 100,\n height: 100,\n progressive: false\n },\n opts\n );\n\n const dimensions = [options.width, options.height].join('x');\n url = url.replace(/^(https?:)?\\/\\//, '').replace(/^.+\\/\\+\\+\\//, '');\n\n return [\n `//img.versacommerce.io`,\n `progressive=${options.progressive}`,\n `resize=${dimensions}`,\n '++',\n url\n ].join('/');\n};\n","import Model from 'core/model';\nimport resizeImageUrl from 'utils/resize-image-url';\n\n/**\n * @description\n * Class for image of a product.\n *\n * @extends Model\n * @memberof module:models\n */\nclass Image extends Model {\n /**\n * @description\n * Height\n *\n * @type {Number}\n */\n get height() {\n return this.attributes.height;\n }\n\n /**\n * @description\n * Width\n *\n * @type {Number}\n */\n get width() {\n return this.attributes.width;\n }\n\n /**\n * @description\n * Aspect ratio\n *\n * @type {Number}\n */\n get aspectRatio() {\n return this.width / this.height;\n }\n\n /**\n * @description\n * Url\n *\n * @type {string}\n */\n get url() {\n return this.attributes.url;\n }\n\n /**\n * @description\n * Builds url to resized image.\n *\n * @param {Number} width - The target width.\n * @param {Number} height - The target height.\n * @param {Object} options\n * @param {Boolean options.progressive - Progressive resized image.\n * @return {String} The url to the resized image.\n *\n * @example\n * var image = new Image({\n * width: 100,\n * height: 100,\n * url: 'http://...'\n * });\n *\n * // url to image resized to 25x25px\n * image.resize(25, 25, { progressive: true });\n */\n resize(width, height, opts = {}) {\n if (typeof width !== 'number') {\n width = 100;\n }\n\n if (typeof height !== 'number') {\n height = 100;\n }\n\n const options = Object.assign(\n {\n id: this.id,\n width,\n height\n },\n opts\n );\n\n return resizeImageUrl(this.url, options);\n }\n\n /**\n * @description\n * Builds url to image that is resized to fit given dimensions (according to\n * the aspect ratio).\n *\n * @param {Number} width - The target width.\n * @param {Number} height - The target height.\n * @param {Object} options\n * @param {Boolean options.progressive - Progressive resized image.\n * @return {String} The url to the resized image\n */\n resizeToFit(width, height, opts = {}) {\n if (typeof width !== 'number') {\n width = 100;\n }\n\n if (typeof height !== 'number') {\n height = 100;\n }\n\n const targetAspectRatio = width / height;\n if (targetAspectRatio > this.aspectRatio) {\n width = height * this.aspectRatio;\n } else {\n height = width / this.aspectRatio;\n }\n\n const options = Object.assign(\n {\n id: this.id,\n width: Math.round(width),\n height: Math.round(height)\n },\n opts\n );\n\n return resizeImageUrl(this.url, options);\n }\n\n /**\n * @const {String}\n * @default 'Image'\n */\n static get displayName() {\n return 'Image';\n }\n}\n\nexport default Image;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model for line items in the shopping cart.\n *\n * @extends Model\n * @memberof module:models\n */\nclass LineItem extends Model {\n /**\n * @description\n * Title of variant\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * Options\n * @type {object}\n */\n get options() {\n return this.attributes.options || {};\n }\n\n /**\n * @description\n * Quantity\n *\n * @type {Number}\n */\n get quantity() {\n return this.attributes.quantity;\n }\n\n /**\n * @description\n * Price of variant\n *\n * @type {Number}\n */\n get price() {\n return this.attributes.price;\n }\n\n /**\n * @description\n * Line price\n *\n * @type {Number}\n */\n get linePrice() {\n return this.attributes.linePrice;\n }\n\n /**\n * @description\n * Compare at price of variant\n *\n * @type {Number}\n */\n get compareAtPrice() {\n return this.attributes.compareAtPrice;\n }\n\n static get hasOne() {\n return ['featuredImage:image', 'variant:variant'];\n }\n\n /**\n * @const {String}\n * @default 'LineItem'\n */\n static get displayName() {\n return 'LineItem';\n }\n}\n\nexport default LineItem;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model representing a navigation link.\n * Links can have nested children for sub-navigation.\n *\n * @extends Model\n * @memberof module:models\n *\n * @example\n * link.title; // => \"Startseite\"\n * link.url; // => \"/\"\n * link.hasSublinks; // => true\n * link.children.forEach(child => {\n * console.log(child.title);\n * });\n */\nclass Link extends Model {\n /**\n * @description\n * Link handle\n *\n * @type {String}\n */\n get handle() {\n return this.attributes.handle;\n }\n\n /**\n * @description\n * Link title (display text)\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Link title text (alternative text)\n *\n * @type {String|null}\n */\n get titleText() {\n return this.attributes.titleText;\n }\n\n /**\n * @description\n * Link URL\n *\n * @type {String}\n */\n get url() {\n return this.attributes.url;\n }\n\n /**\n * @description\n * Whether the link should auto-open (for dropdowns)\n *\n * @type {Boolean}\n */\n get autoOpen() {\n return this.attributes.autoOpen;\n }\n\n /**\n * @description\n * Whether this link has sub-links\n *\n * @type {Boolean}\n */\n get hasSublinks() {\n return this.attributes.hasSublinks;\n }\n\n /**\n * @description\n * Type of linked object (e.g. \"Index\", \"Collection\", \"Page\")\n *\n * @type {String}\n */\n get linkableType() {\n return this.attributes.linkableType;\n }\n\n /**\n * @description\n * Whether this is a JavaScript link\n *\n * @type {Boolean}\n */\n get javascriptLink() {\n return this.attributes.javascriptLink;\n }\n\n /**\n * @description\n * Link highlights/badges\n *\n * @type {String|null}\n */\n get highlights() {\n return this.attributes.highlights;\n }\n\n /**\n * @description\n * One-to-many relationships (nested children)\n *\n * @type {Array}\n */\n static get hasMany() {\n return ['children:link'];\n }\n\n /**\n * @const {String}\n * @default 'Link'\n */\n static get displayName() {\n return 'Link';\n }\n}\n\nexport default Link;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model representing a link list (navigation menu).\n *\n * @extends Model\n * @memberof module:models\n *\n * @example\n * client.findLinklist('haupt-navigation').then(linklist => {\n * console.log(linklist.title); // => \"Haupt-Navigation\"\n * linklist.rootLinks.forEach(link => {\n * console.log(link.title, link.url);\n * link.children.forEach(child => {\n * console.log(' -', child.title);\n * });\n * });\n * });\n */\nclass Linklist extends Model {\n /**\n * @description\n * Linklist handle (URL slug)\n *\n * @type {String}\n */\n get handle() {\n return this.attributes.handle;\n }\n\n /**\n * @description\n * Linklist title\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Store key using handle\n *\n * @type {Array}\n */\n get storeKey() {\n return ['linklists', this.handle];\n }\n\n /**\n * @description\n * One-to-many relationships\n *\n * @type {Array}\n */\n static get hasMany() {\n return ['rootLinks:link'];\n }\n\n /**\n * @const {String}\n * @default 'Linklist'\n */\n static get displayName() {\n return 'Linklist';\n }\n}\n\nexport default Linklist;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model representing a CMS page.\n *\n * @extends Model\n * @memberof module:models\n *\n * @example\n * client.findPage('impressum').then(page => {\n * console.log(page.title); // => \"Impressum\"\n * console.log(page.content); // => \"<h2>Verantwortlich</h2>...\"\n * });\n */\nclass Page extends Model {\n /**\n * @description\n * Page handle (URL slug)\n *\n * @type {String}\n */\n get handle() {\n return this.attributes.handle;\n }\n\n /**\n * @description\n * Page title\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Page content (HTML)\n *\n * @type {String}\n */\n get content() {\n return this.attributes.content;\n }\n\n /**\n * @description\n * Page URL path\n *\n * @type {String}\n */\n get url() {\n return this.attributes.url;\n }\n\n /**\n * @description\n * Full page URL path\n *\n * @type {String}\n */\n get fullUrl() {\n return this.attributes.fullUrl;\n }\n\n /**\n * @description\n * Store key using handle instead of id for handle-based lookups\n *\n * @type {Array}\n */\n get storeKey() {\n return ['pages', this.handle];\n }\n\n /**\n * @const {String}\n * @default 'Page'\n */\n static get displayName() {\n return 'Page';\n }\n}\n\nexport default Page;\n","import Model from 'core/model';\n\n/**\n * @description\n * Abstract class for Products and Variants.\n *\n * @extends Model\n * @memberof module:models\n */\nclass BaseProduct extends Model {\n /**\n * @description\n * Title\n *\n * @type {String}\n */\n get title() {\n return this.attributes.title;\n }\n\n /**\n * @description\n * Subtitle\n *\n * @type {String}\n */\n get subtitle() {\n return this.attributes.subtitle;\n }\n\n /**\n * @description\n * True if subtitle is not empty\n *\n * @type {Boolean}\n */\n get hasSubtitle() {\n return (this.subtitle || '').length > 0;\n }\n\n /**\n * @description\n * Availability\n *\n * @type {Boolean}\n */\n get available() {\n return this.attributes.available;\n }\n\n /**\n * @description\n * Price\n *\n * @type {Number}\n */\n get price() {\n return this.attributes.price;\n }\n\n /**\n * @description\n * Base price\n *\n * @type {Array}\n *\n * @example\n * [7.25, \"Piece\"]\n */\n get basePrice() {\n return this.attributes.basePrice;\n }\n\n /**\n * @description\n * True if base price is defined otherwise false.\n *\n * @type {Boolean}\n */\n get hasBasePrice() {\n return this.basePrice !== null;\n }\n\n /**\n * @description\n * Compare at price\n *\n * @type {Number}\n */\n get compareAtPrice() {\n return this.attributes.compareAtPrice;\n }\n\n /**\n * @description\n * True if compare at price is defined otherwise false.\n *\n * @type {Boolean}\n */\n get hasCompareAtPrice() {\n return this.compareAtPrice !== null;\n }\n\n /**\n * @description\n * Stock count if stock is considered and infinity otherwise.\n *\n * @type {Number}\n */\n get stock() {\n return this.memoize('stock', function () {\n let considersStock = this.attributes.considersStock;\n return considersStock ? this.attributes.stock : Infinity;\n });\n }\n\n /**\n * @description\n * Tax rate\n *\n * @type {Number}\n */\n get taxRate() {\n return this.memoize('taxRate', function () {\n return this.attributes.taxRate / 100;\n });\n }\n\n /**\n * @description\n * Show stock amount\n *\n * @type {Boolean}\n */\n get showsStockAmount() {\n return this.attributes.showsStockAmount;\n }\n\n /**\n * @description\n * Sorted bulk discounts\n *\n * @type {Object}\n */\n get bulkDiscounts() {\n if (!this.attributes.bulkDiscounts) {\n return null;\n }\n\n return this.memoize('bulkDiscounts', function () {\n return this.attributes.bulkDiscounts.sort((a, b) => a.quantity - b.quantity);\n });\n }\n\n /**\n * @description\n * Bulk discounts active\n *\n * @type {Boolean}\n */\n get hasBulkDiscounts() {\n return this.bulkDiscounts !== null;\n }\n\n priceForQuantity(quantity = 1) {\n if (!this.hasBulkDiscounts) {\n return this.price;\n }\n\n const discounts = this.bulkDiscounts;\n const count = discounts.length;\n let pos = Math.floor(count / 2);\n let left, right, result, d;\n\n while (!result) {\n // no bulk discount for this quantity (too small)\n if (pos <= 0) {\n break;\n }\n\n // maximum bulk discount for this quantity (too large)\n if (pos >= count) {\n result = discounts[count - 1];\n break;\n }\n\n // define left and right boundaries of interval\n left = discounts[pos - 1].quantity;\n right = discounts[pos].quantity;\n d = Math.floor((pos > 2 ? pos : 2) / 2);\n\n // quantity is smaller than current interval\n if (quantity < left) {\n pos -= d;\n continue;\n }\n\n // quantity is larger than current interval\n if (quantity > right) {\n pos += d;\n continue;\n }\n\n // quantity is in current interval\n // make sure we select the correct bulk discount if quantity is on the right\n // edge of the inverval\n result = discounts[quantity === right ? pos : pos - 1];\n }\n\n return result ? result.price : this.price;\n }\n}\n\nexport default BaseProduct;\n","import BaseProduct from 'models/base-product';\nimport entries from 'utils/entries';\n\n/**\n * @description\n * Class for product\n *\n * @extends BaseProduct\n * @memberof module:models\n */\nclass Product extends BaseProduct {\n /**\n * @description\n * Subtitle\n *\n * @type {String}\n */\n get subtitle() {\n return this.attributes.subtitle;\n }\n\n /**\n * @description\n * True if subtitle is not empty\n *\n * @type {Boolean}\n */\n get hasSubtitle() {\n return (this.subtitle || '').length > 0;\n }\n\n /**\n * @description\n * Description\n *\n * @type {String}\n */\n get description() {\n return this.attributes.description;\n }\n\n /**\n * @description\n * Options\n *\n * @type {Array}\n */\n get optionNames() {\n return this.attributes.optionNames;\n }\n\n /**\n * @description\n * Unique option values for all variants\n *\n * @type {Object}\n *\n * @example\n * product.optionValues\n * // => { Size: [ 'small', 'medium', ... ], ... }\n */\n get optionValues() {\n const self = this;\n\n return this.memoize('optionValues', () => {\n const optionValues = {};\n\n self.optionNames.forEach((option, i) => {\n optionValues[option] = self.variants\n .map((variant) => {\n return variant.options[i];\n })\n .filter((value, j, a) => {\n // filter null and duplicate elements\n return value !== null && a.indexOf(value) === j;\n });\n });\n\n return optionValues;\n });\n }\n\n /**\n * @description\n * Find variants by given options\n *\n * @param {Object} options - The options.\n * @return {Variant[]} Array of variants that match the options.\n */\n findVariantsByOptions(opts) {\n const options = {};\n for (let [name, value] of entries(opts)) {\n let i = this.optionNames.indexOf(name);\n options[i] = value;\n }\n\n return this.variants.filter((variant) => {\n for (let [i, value] of entries(options)) {\n if (variant.options[i] !== value) {\n return false;\n }\n }\n\n return true;\n });\n }\n\n /**\n * @description\n * Finds variant by id\n *\n * @param {String} - The id.\n * @return {Variant} The variant with the given id.\n */\n findVariantById(id) {\n const self = this;\n return this.memoize('variants:' + id, () => {\n for (let variant of self.variants) {\n if (variant.id === id) {\n return variant;\n }\n }\n return undefined;\n });\n }\n\n static get hasMany() {\n return ['images:image', 'variants:variant'];\n }\n\n static get hasOne() {\n return ['featuredImage:image'];\n }\n\n /**\n * @const {String}\n * @default 'Product'\n */\n static get displayName() {\n return 'Product';\n }\n}\n\nexport default Product;\n","import Model from 'core/model';\n\n/**\n * @description\n * Model representing shop metadata.\n * This is a singleton model - only one shop exists per client.\n *\n * @extends Model\n * @memberof module:models\n *\n * @example\n * client.getShop().then(shop => {\n * console.log(shop.name); // => \"Björn's Einkaufswelt\"\n * console.log(shop.productsCount); // => 15\n * console.log(shop.currency); // => \"EUR\"\n * });\n */\nclass Shop extends Model {\n /**\n * @description\n * Shop handle (internal identifier)\n *\n * @type {String}\n */\n get handle() {\n return this.attributes.handle;\n }\n\n /**\n * @description\n * Shop name\n *\n * @type {String}\n */\n get name() {\n return this.attributes.name;\n }\n\n /**\n * @description\n * Shop logo URL\n *\n * @type {String|null}\n */\n get logoUrl() {\n return this.attributes.logoUrl;\n }\n\n /**\n * @description\n * Checkout logo URL\n *\n * @type {String}\n */\n get checkoutLogoUrl() {\n return this.attributes.checkoutLogoUrl;\n }\n\n /**\n * @description\n * Shop URL\n *\n * @type {String}\n */\n get url() {\n return this.attributes.url;\n }\n\n /**\n * @description\n * Shop domain\n *\n * @type {String}\n */\n get domain() {\n return this.attributes.domain;\n }\n\n /**\n * @description\n * Shop subdomain\n *\n * @type {String}\n */\n get subdomain() {\n return this.attributes.subdomain;\n }\n\n /**\n * @description\n * Default host name\n *\n * @type {String}\n */\n get defaultHostName() {\n return this.attributes.defaultHostName;\n }\n\n /**\n * @description\n * Checkout host name\n *\n * @type {String}\n */\n get checkoutHostName() {\n return this.attributes.checkoutHostName;\n }\n\n /**\n * @description\n * Shop locale (e.g. \"de\", \"en\")\n *\n * @type {String}\n */\n get locale() {\n return this.attributes.locale;\n }\n\n /**\n * @description\n * Shop version number\n *\n * @type {Number}\n */\n get version() {\n return this.attributes.version;\n }\n\n /**\n * @description\n * Shop design/theme name\n *\n * @type {String}\n */\n get design() {\n return this.attributes.design;\n }\n\n /**\n * @description\n * Currency code (e.g. \"EUR\", \"USD\")\n *\n * @type {String}\n */\n get currencyCode() {\n return this.attributes.currencyCode;\n }\n\n /**\n * @description\n * Currency (alias for currencyCode)\n *\n * @type {String}\n */\n get currency() {\n return this.attributes.currency;\n }\n\n /**\n * @description\n * Whether the shop is password protected\n *\n * @type {Boolean}\n */\n get passwordProtected() {\n return this.attributes.passwordProtected;\n }\n\n /**\n * @description\n * Whether prices include tax\n *\n * @type {Boolean}\n */\n get priceIncludesTax() {\n return this.attributes.priceIncludesTax;\n }\n\n /**\n * @description\n * Total number of products (including hidden)\n *\n * @type {Number}\n */\n get allProductsCount() {\n return this.attributes.allProductsCount;\n }\n\n /**\n * @description\n * Number of visible products\n *\n * @type {Number}\n */\n get productsCount() {\n return this.attributes.productsCount;\n }\n\n /**\n * @description\n * Number of collections\n *\n * @type {Number}\n */\n get collectionsCount() {\n return this.attributes.collectionsCount;\n }\n\n /**\n * @description\n * Singleton store key (no id needed)\n *\n * @type {Array}\n */\n get storeKey() {\n return ['shop'];\n }\n\n /**\n * @const {String}\n * @default 'Shop'\n */\n static get displayName() {\n return 'Shop';\n }\n}\n\nexport default Shop;\n","import BaseProduct from 'models/base-product';\n\n/**\n * @description\n * Class for variant of a product.\n *\n * @extends BaseProduct\n * @memberof module:models\n */\nclass Variant extends BaseProduct {\n /**\n * @description\n * First, second, and third option as array.\n *\n * @type {Array}\n */\n get options() {\n return this.memoize('options', function () {\n return [this.attributes.option01, this.attributes.option02, this.attributes.option03].map(\n (option) => (option && option.length > 0 ? option : null)\n );\n });\n }\n\n static get hasOne() {\n return ['featuredImage:image'];\n }\n\n /**\n * @const {String}\n * @default 'Variant'\n */\n static get displayName() {\n return 'Variant';\n }\n}\n\nexport default Variant;\n","export default '0.5.0';\n","import Client from 'core/client';\nimport Registry from 'core/registry';\nimport Logger from 'utils/logger';\nimport dasherize from 'utils/dasherize';\nimport entries from 'utils/entries';\nimport * as models from 'models';\nimport version from 'version';\n\n/**\n * @namespace\n *\n * @description\n * Global object for access to Client class.\n *\n * @example\n * // create a new client\n * var client = VersaCommerce.createClient({\n * shopName: 'mein-test-shop'\n * });\n *\n * // use client to find a product\n * client.findProduct(1).then(function(product) {\n * console.log(product);\n * });\n */\nconst VersaCommerce = {\n /**\n * @description\n * Alias for {@link Client.constructor}. Ensures only a single client is created for\n * a given shopName.\n *\n * @instance\n * @param {Opject} options\n * @param {String} options.shopName - The shop name (subdomain of the\n * shop).\n *\n * @return {Client} The client\n */\n createClient({ shopName = null }) {\n const path = ['clients', shopName].join('/');\n let client = this.lookup(path);\n\n if (!client) {\n client = new Client(...arguments);\n this.register(path, client);\n }\n\n return client;\n },\n\n /**\n * @description\n * Alias for {@link Registry.lookup}. Looks up a value in the global registry.\n *\n * @instance\n */\n lookup() {\n return this._registry.lookup(...arguments);\n },\n\n /**\n * @description\n * Alias for {@link Registry.register}. Registers a value in the global registry.\n *\n * @instance\n */\n register() {\n return this._registry.register(...arguments);\n },\n\n _setupRegistry() {\n delete this._registry; // ensure possible pre-existing registry is destroyed\n this._registry = new Registry();\n\n // register models\n for (let [name, model] of entries(models)) {\n let path = ['models', dasherize(name)].join('/');\n this.register(path, model);\n }\n },\n\n _registry: null,\n\n /**\n * @description\n * Global logger\n *\n * @instance\n */\n Logger,\n\n version\n};\n\nVersaCommerce._setupRegistry();\n\nexport default VersaCommerce;\n","import VersaCommerce from 'versacommerce';\n\nif (!window.VersaCommerce) {\n window.VersaCommerce = VersaCommerce;\n}\n"],"names":["entries","obj","key","dig","hash","components","current","component","bury","value","lastComponent","BaseObject","properties","name","getter","func","self","memoized","pluralize","str","Store","kind","id","local","result","model","reason","VC","data","dependencies","handle","blogHandle","articleHandle","pluralizedKind","items","models","item","capitalize","queryParams","appendQueryParams","url","params","hasQueryParams","isStatusOk","code","Adapter","baseUrl","customUrlGenerator","variant","quantity","product","resolve","reject","xhr","DONE","query","response","content","match","camelcase","s","singularize","decapitalize","underscore","flatten","array","a","b","Serializer","json","root","attributes","Klass","values","klass","children","child","attributeName","kinds","childrenRoot","flattenedChildren","Client","shopName","ssl","trackingCode","salesChannel","protocol","msg","Registry","path","silent","Logger","dasherize","Model","attrs","ids","Article","Blog","EventEmitter","events","callee","listeners","evt","listener","eventListeners","index","args","Cart","ee","cart","lineItem","options","suffix","adapter","responseData","Collection","resizeImageUrl","opts","dimensions","Image","width","height","LineItem","Link","Linklist","Page","BaseProduct","discounts","count","pos","left","right","d","Product","optionValues","option","i","j","Shop","Variant","version","VersaCommerce","client"],"mappings":";AAAe,UAAAA,EAAWC,GAAK;AAC7B,WAASC,KAAO,OAAO,KAAKD,CAAG;AAC7B,UAAM,CAACC,GAAKD,EAAIC,CAAG,CAAC;AAExB;ACJA,MAAAC,IAAe,CAACC,GAAMC,MAAe;AACnC,MAAIC,IAAUF;AAEd,SAAAC,EAAW,QAAQ,CAACE,MAAc;AAChC,IAAID,MAAY,WAIhBA,IAAUA,EAAQC,CAAS;AAAA,EAC7B,CAAC,GAEMD;AACT,GCZAE,IAAe,CAACJ,GAAMK,GAAOJ,MAAe;AAC1C,QAAMK,IAAgBL,EAAW,IAAG;AACpC,MAAIC,IAAUF;AAEd,EAAAC,EAAW,QAAQ,CAACE,MAAc;AAChC,IAAID,EAAQC,CAAS,MAAM,WACzBD,EAAQC,CAAS,IAAI,CAAA,IAGvBD,IAAUA,EAAQC,CAAS;AAAA,EAC7B,CAAC,GAEDD,EAAQI,CAAa,IAAID;AAC3B;ACMA,MAAME,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,YAAYC,IAAa,IAAI;AAC3B,aAAS,CAACV,GAAKO,CAAK,KAAKT,EAAQY,CAAU;AACzC,WAAKV,CAAG,IAAIO;AAAA,EAEhB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAOJ,GAAY;AACjB,WAAOF,EAAI,MAAME,CAAU;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAKI,MAAUJ,GAAY;AACzB,IAAAG,EAAK,MAAMC,GAAOJ,CAAU;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,uBAAuBQ,GAAMC,GAAQ;AACnC,WAAO,eAAe,MAAMD,GAAM;AAAA,MAChC,KAAKC;AAAA,IACX,CAAK;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQD,GAAME,GAAM;AAElB,IAAK,KAAK,cACR,KAAK,YAAY,CAAA;AAGnB,QAAIN,IAAQ,KAAK,IAAI,aAAaI,CAAI;AACtC,WAAIJ,MAAU,WACZA,IAAQM,EAAK,KAAK,IAAI,GACtB,KAAK,KAAKN,GAAO,aAAaI,CAAI,IAG7BJ;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,qBAAqBI,GAAME,GAAM;AAC/B,QAAIC,IAAO;AACX,SAAK,uBAAuBH,GAAM,MAAMG,EAAK,QAAQH,GAAME,CAAI,CAAC;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAoBF,GAAM;AACxB,SAAK,KAAK,QAAW,aAAaA,CAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwB;AACtB,UAAMI,IAAW,KAAK,aAAa,CAAA;AAEnC,aAAS,CAACJ,CAAI,KAAKb,EAAQiB,CAAQ;AACjC,WAAK,oBAAoBJ,CAAI;AAAA,EAEjC;AACF;AC3HA,MAAAK,IAAe,CAACC,MACPA,IAAM;ACwBf,MAAMC,UAAcT,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,cAAc;AACZ,UAAM,GAAG,SAAS,GAElB,KAAK,MAAM,IAAIA,EAAU;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,KAAKU,GAAMC,GAAI;AACb,UAAMN,IAAO,MACPO,IAAQ,KAAK,SAASF,GAAMC,CAAE;AAEpC,WAAIC,IACK,QAAQ,QAAQA,CAAK,IAGvB,KAAK,KAAKF,GAAMC,CAAE,EACtB,KAAK,CAACE,OACLA,EAAO,QAAQ,CAACC,MAAUT,EAAK,KAAKS,CAAK,CAAC,GACnCT,EAAK,SAASK,GAAMC,CAAE,EAC9B,EACA,MAAM,CAACI,OACNC,EAAG,OAAO,MAAM,eAAeN,CAAI,IAAIC,IAAK,WAAWA,CAAE,MAAM,EAAE,IAAII,CAAM,GAAG,GACvE,QAAQ,OAAOA,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQL,GAAMC,GAAI;AAChB,UAAMN,IAAO;AAEb,WAAO,KAAK,KAAKK,GAAMC,CAAE,EACtB,KAAK,CAACE,MAAWR,EAAK,yBAAyBK,GAAMG,CAAM,CAAC,EAC5D,MAAM,CAACE,OACNC,EAAG,OAAO,MAAM,kBAAkBN,CAAI,IAAIC,IAAK,WAAWA,CAAE,MAAM,EAAE,IAAII,CAAM,GAAG,GAC1E,QAAQ,OAAOA,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,gBAAgBL,GAAMO,GAAM;AAC1B,UAAMJ,IAAS,KAAK,SAASH,GAAMO,CAAI;AACvC,WAAO,KAAK,yBAAyBP,GAAMG,CAAM;AAAA,EACnD;AAAA,EAEA,yBAAyBH,GAAMG,GAAQ;AACrC,UAAMR,IAAO,MACPS,IAAQD,EAAO,CAAC,GAChBK,IAAeL,EAAO,MAAM,CAAC;AAGnC,WAFcR,EAAK,SAASK,GAAMI,EAAM,EAAE,EAEpC,OAAOA,EAAM,UAAU,GAC7BI,EAAa,QAAQ,CAACJ,MAAUT,EAAK,KAAKS,CAAK,CAAC,GAEzCT,EAAK,SAASK,GAAMI,EAAM,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,SAASJ,GAAMC,GAAI;AACjB,WAAIA,IACK,KAAK,IAAI,IAAIJ,EAAUG,CAAI,GAAGC,CAAE,IAGhC,KAAK,IAAI,IAAID,CAAI;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,KAAKA,GAAMC,GAAI;AACb,UAAMN,IAAO;AACb,WAAO,KAAK,QAAQ,aAAaK,GAAMC,CAAE,EAAE,KAAK,CAACM,MAASZ,EAAK,SAASK,GAAMO,CAAI,CAAC;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,aAAaP,GAAMS,GAAQ;AACzB,UAAMd,IAAO,MACPO,IAAQ,KAAK,iBAAiBF,GAAMS,CAAM;AAEhD,WAAIP,IACK,QAAQ,QAAQA,CAAK,IAGvB,KAAK,aAAaF,GAAMS,CAAM,EAClC,KAAK,CAACN,OACLA,EAAO,QAAQ,CAACC,MAAUT,EAAK,KAAKS,CAAK,CAAC,GACnCT,EAAK,iBAAiBK,GAAMS,CAAM,EAC1C,EACA,MAAM,CAACJ,OACNC,EAAG,OAAO,MAAM,eAAeN,CAAI,iBAAiBS,CAAM,MAAMJ,CAAM,GAAG,GAClE,QAAQ,OAAOA,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAiBL,GAAMS,GAAQ;AAC7B,WAAO,KAAK,IAAI,IAAIZ,EAAUG,CAAI,GAAGS,CAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAaT,GAAMS,GAAQ;AACzB,UAAMd,IAAO;AACb,WAAO,KAAK,QACT,qBAAqBK,GAAMS,CAAM,EACjC,KAAK,CAACF,MAASZ,EAAK,SAASK,GAAMO,CAAI,CAAC;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,YAAYG,GAAYC,GAAe;AACrC,UAAMhB,IAAO;AAEb,WAAO,KAAK,QACT,WAAWe,GAAYC,CAAa,EACpC,KAAK,CAACJ,MAAS;AACd,YAAMJ,IAASR,EAAK,SAAS,WAAWY,CAAI;AAC5C,aAAAJ,EAAO,QAAQ,CAACC,MAAUT,EAAK,KAAKS,CAAK,CAAC,GACnCD,EAAO,CAAC;AAAA,IACjB,CAAC,EACA,MAAM,CAACE,OACNC,EAAG,OAAO;AAAA,MACR,wBAAwBK,CAAa,cAAcD,CAAU,MAAML,CAAM;AAAA,IACnF,GACe,QAAQ,OAAOA,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,QAAQL,GAAM;AACZ,UAAML,IAAO;AAEb,WAAO,KAAK,QACT,QAAQK,CAAI,EACZ,KAAK,CAACO,MAASZ,EAAK,cAAcK,GAAMO,CAAI,CAAC,EAC7C,MAAM,CAACF,OACNC,EAAG,OAAO,MAAM,eAAeN,CAAI,UAAUK,CAAM,GAAG,GAC/C,QAAQ,OAAOA,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAcL,GAAMO,GAAM;AACxB,UAAMZ,IAAO,MACPiB,IAAiBf,EAAUG,CAAI,GAC/Ba,IAAQN,EAAKK,CAAc,KAAK,CAAA,GAChCE,IAAS,CAAA;AAEf,WAAAD,EAAM,QAAQ,CAACE,MAAS;AAEtB,YAAMZ,IAASR,EAAK,SAASK,GAAMe,CAAI;AACvC,MAAAZ,EAAO,QAAQ,CAACC,MAAUT,EAAK,KAAKS,CAAK,CAAC,GAC1CU,EAAO,KAAKX,EAAO,CAAC,CAAC;AAAA,IACvB,CAAC,GAEMW;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,SAASd,GAAMO,GAAM;AAEnB,WADmB,KAAK,OAAO,WACb,YAAYP,GAAMO,CAAI;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,KAAKH,GAAO;AACV,IAAAA,EAAM,QAAQ,MACd,KAAK,IAAI,KAAKA,GAAO,GAAGA,EAAM,QAAQ;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;ACtVA,MAAAY,IAAe,CAAClB,MACPA,EAAI,OAAO,CAAC,EAAE,YAAW,IAAKA,EAAI,MAAM,CAAC,GCDlDmB,IAAe,CAACV,IAAO,CAAA,MACd,OAAO,KAAKA,CAAI,EACpB,IAAI,CAAC1B,MAAQ,GAAGA,CAAG,IAAI0B,EAAK1B,CAAG,CAAC,EAAE,EAClC,KAAK,GAAG,GCDbqC,IAAe,CAACC,GAAKZ,IAAO,OAAO;AACjC,MAAI,OAAO,KAAKA,CAAI,EAAE,WAAW;AAC/B,WAAOY;AAGT,QAAMC,IAASH,EAAYV,CAAI,GACzBc,IAAiBF,EAAI,MAAM,cAAc;AAE/C,SAAO,CAACA,GAAKC,CAAM,EAAE,KAAKC,IAAiB,MAAM,GAAG;AACtD,GCJMC,IAAa,CAACC,MAASA,KAAQ,OAAOA,IAAO;AAcnD,MAAMC,UAAgBlC,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU/B,YAAY,EAAE,SAAAmC,IAAU,IAAI,aAAAR,IAAc,CAAA,EAAE,GAAI;AAC9C,UAAK,GAEL,KAAK,UAAUQ,EAAQ,QAAQ,OAAO,EAAE,GACxC,KAAK,eAAeR;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,aAAajB,GAAMC,GAAI;AACrB,UAAMkB,IAAM,KAAK,gBAAgBnB,GAAMC,CAAE;AACzC,WAAO,KAAK,QAAQkB,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,gBAAgBnB,GAAMC,GAAI;AACxB,UAAMyB,IAAqB,KAAK,YAAYV,EAAWhB,CAAI,CAAC;AAC5D,QAAI0B;AACF,aAAOA,EAAmB,MAAM,MAAM,SAAS;AAGjD,UAAMd,IAAiBf,EAAUG,CAAI;AACrC,WAAO,CAAC,KAAK,SAASY,GAAgBX,IAAK,OAAO,EAAE,KAAK,GAAG;AAAA,EAC9D;AAAA,EAEA,cAAc;AACZ,WAAO,CAAC,KAAK,SAAS,WAAW,EAAE,KAAK,GAAG;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc;AACZ,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYD,GAAMS,GAAQ;AACxB,WAAO,KAAK,UAAU,YAAYA,IAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYT,GAAMS,GAAQ;AACxB,WAAO,KAAK,UAAU,YAAYA,IAAS;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAeT,GAAMU,GAAYC,GAAe;AAC9C,WAAO,KAAK,UAAU,YAAYD,IAAa,MAAMC,IAAgB;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgBX,GAAMS,GAAQ;AAC5B,WAAO,KAAK,UAAU,gBAAgBA,IAAS;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,qBAAqBT,GAAMS,GAAQ;AACjC,UAAMU,IAAM,KAAK,gBAAgBnB,GAAMS,CAAM;AAC7C,WAAO,KAAK,QAAQU,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,WAAWT,GAAYC,GAAe;AACpC,UAAMQ,IAAM,KAAK,eAAe,WAAWT,GAAYC,CAAa;AACpE,WAAO,KAAK,QAAQQ,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,QAAQnB,GAAM;AACZ,UAAMmB,IAAM,KAAK,YAAYnB,CAAI;AACjC,WAAO,KAAK,QAAQmB,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYnB,GAAM;AAChB,UAAMY,IAAiBf,EAAUG,CAAI;AACrC,WAAO,KAAK,UAAU,MAAMY,IAAiB;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmBH,GAAQ;AACzB,UAAMU,IAAM,KAAK,UAAU,eAAeV,IAAS;AACnD,WAAO,KAAK,QAAQU,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAsBV,GAAQ;AAC5B,UAAMU,IAAM,KAAK,UAAU,kBAAkBV,IAAS;AACtD,WAAO,KAAK,QAAQU,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,sBAAsBQ,GAASC,IAAW,GAAGR,IAAS,CAAA,GAAI;AACxD,QAAID,IAAM,CAAC,KAAK,SAAS,QAAQ,KAAK,EAAE,KAAK,GAAG;AAEhD,WAAAC,IAAS,OAAO;AAAA,MACd;AAAA,QACE,OAAO;AAAA,QACP,WAAW,mBAAmB,WAAW;AAAA,QACzC,kBAAkBO,EAAQ;AAAA,QAC1B,wBAAwBC;AAAA,MAChC;AAAA,MACMR;AAAA,IACN,GACID,IAAMD,EAAkBC,GAAKC,CAAM,GAE5B,KAAK,QAAQD,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,uBAAuBQ,GAASC,IAAW,GAAGR,IAAS,CAAA,GAAI;AACzD,QAAID,IAAM,CAAC,KAAK,SAAS,QAAQ,KAAK,EAAE,KAAK,GAAG;AAEhD,WAAAC,IAAS,OAAO;AAAA,MACd;AAAA,QACE,kBAAkBO,EAAQ;AAAA,QAC1B,wBAAwBC;AAAA,MAChC;AAAA,MACMR;AAAA,IACN,GACID,IAAMD,EAAkBC,GAAKC,CAAM,GAE5B,KAAK,QAAQD,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,cAAcU,GAAST,IAAS,IAAI;AAClC,QAAID,IAAM,CAAC,KAAK,SAAS,YAAYU,EAAQ,EAAE,EAAE,KAAK,GAAG;AAEzD,WAAAV,IAAMD,EAAkBC,GAAKC,CAAM,GAE5B,KAAK,QAAQD,CAAG;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,IAAIA,GAAK;AACP,WAAAA,IAAM,KAAK,QAAQA,CAAG,GAEf,IAAI,QAAQ,CAACW,GAASC,MAAW;AACtC,YAAMC,IAAM,IAAI,eAAc,GACxBC,IAAO;AACb,MAAAD,EAAI,KAAK,OAAOb,CAAG,GACnBa,EAAI,kBAAkB,IACtBA,EAAI,qBAAqB,MAAM;AAC7B,YAAIA,EAAI,eAAeC,GAIvB;AAAA,cAAI,CAACX,EAAWU,EAAI,MAAM,GAAG;AAC3B1B,YAAAA,EAAG,OAAO,MAAM,oBAAoBa,CAAG,KAAKa,EAAI,MAAM,GAAG,GACzDD,EAAOC,EAAI,MAAM;AACjB;AAAA,UACF;AAEA,UAAAF,EAAQE,EAAI,YAAY;AAAA;AAAA,MAC1B,GACAA,EAAI,KAAK,IAAI;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,KAAKb,GAAKZ,IAAO,IAAI;AACnB,UAAM2B,IAAQjB,EAAYV,CAAI;AAC9B,WAAAY,IAAM,KAAK,QAAQA,CAAG,GAEf,IAAI,QAAQ,CAACW,GAASC,MAAW;AACtC,YAAMC,IAAM,IAAI,eAAc,GACxBC,IAAO;AAEb,MAAAD,EAAI,KAAK,QAAQb,CAAG,GACpBa,EAAI,kBAAkB,IACtBA,EAAI,iBAAiB,gBAAgB,mCAAmC,GACxEA,EAAI,qBAAqB,MAAM;AAC7B,YAAIA,EAAI,eAAeC,GAIvB;AAAA,cAAI,CAACX,EAAWU,EAAI,MAAM,GAAG;AAC3B1B,YAAAA,EAAG,OAAO,MAAM,oBAAoBa,CAAG,KAAKa,EAAI,MAAM,GAAG,GACzDD,EAAOC,EAAI,MAAM;AACjB;AAAA,UACF;AAEA,UAAAF,EAAQE,EAAI,YAAY;AAAA;AAAA,MAC1B,GAEAA,EAAI,KAAKE,CAAK;AAAA,IAChB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,QAAQf,GAAK;AACX,UAAMxB,IAAO;AACb,WAAO,KAAK,IAAIwB,CAAG,EAChB,KAAK,CAACgB,MAAaxC,EAAK,WAAWwC,CAAQ,CAAC,EAC5C,MAAM,CAAC9B,OACFA,MAAW,kBACbC,EAAG,OAAO,MAAM,sBAAsBa,CAAG,GAAG,GAGvC,QAAQ,OAAOd,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,SAASc,GAAKZ,IAAO,IAAI;AACvB,UAAMZ,IAAO;AACb,WAAO,KAAK,KAAKwB,GAAKZ,CAAI,EACvB,KAAK,CAAC4B,MAAaxC,EAAK,WAAWwC,CAAQ,CAAC,EAC5C,MAAM,CAAC9B,OACFA,MAAW,kBACbC,EAAG,OAAO,MAAM,sBAAsBa,CAAG,GAAG,GAGvC,QAAQ,OAAOd,CAAM,EAC7B;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQc,GAAK;AACX,WAAOD,EAAkBC,GAAK,KAAK,YAAY;AAAA,EACjD;AAAA,EAEA,WAAWiB,GAAS;AAClB,QAAI;AACF,YAAM7B,IAAO,KAAK,MAAM6B,CAAO;AAC/B,aAAO,QAAQ,QAAQ7B,CAAI;AAAA,IAC7B,QAAQ;AACN,aAAO,QAAQ,OAAO,cAAc;AAAA,IACtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,UAAMkB,IAAU,KAAK,SACfY,IAAQZ,EAAQ,MAAM,4BAA4B;AAExD,WAAOY,IAAQA,EAAM,CAAC,IAAIZ;AAAA,EAC5B;AACF;ACjcA,MAAAa,IAAe,CAACxC,MACPA,EAAI,QAAQ,kBAAkB,CAACyC,MAC7BA,EAAE,UAAU,GAAG,CAAC,EAAE,YAAW,CACrC,GCHHC,IAAe,CAAC1C,MACPA,EAAI,QAAQ,MAAM,EAAE,GCD7B2C,IAAe,CAAC3C,MACPA,EAAI,OAAO,CAAC,EAAE,YAAW,IAAKA,EAAI,MAAM,CAAC,GCClD4C,IAAe,CAAC5C,MACP2C,EAAa3C,CAAG,EACpB,QAAQ,UAAU,CAACyC,MACX,MAAMA,EAAE,YAAW,CAC3B,EACA,QAAQ,MAAM,GAAG;ACPtB,IAAII,IAAU,CAACC,MACNA,EAAM,OAAO,CAACC,GAAGC,MACfD,EAAE,OAAO,MAAM,QAAQC,CAAC,IAAIH,EAAQG,CAAC,IAAIA,CAAC,GAChD,CAAA,CAAE;ACoBP,MAAMC,UAAmBzD,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBlC,YAAYU,GAAMgD,GAAM;AACtB,UAAMC,IAAO,KAAK,QAAQjD,GAAMgD,CAAI,GAC9BE,IAAa,KAAK,UAAUD,CAAI,GAChCE,IAAQ7C,EAAG,OAAO,CAAC,UAAUN,CAAI,EAAE,KAAK,GAAG,CAAC,GAC5CQ,IAAe,KAAK,sBAAsB2C,GAAOD,CAAU;AAGjE,WAAO,CAFO,IAAIC,EAAMD,CAAU,CAErB,EAAE,OAAO1C,CAAY;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,UAAU4C,GAAQ;AAChB,UAAMF,IAAa,CAAA;AACnB,aAAS,CAACrE,GAAKO,CAAK,KAAKT,EAAQyE,CAAM,GAAG;AACxC,UAAI5D,IAAO8C,EAAUzD,CAAG;AACxB,MAAAqE,EAAW1D,CAAI,IAAIJ;AAAA,IACrB;AAEA,WAAO8D;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQlD,GAAMgD,GAAM;AAClB,UAAMnE,IAAM6D,EAAW1C,CAAI;AAC3B,WAAOgD,EAAKnE,CAAG;AAAA,EACjB;AAAA,EAEA,sBAAsBwE,GAAOH,GAAY;AACvC,UAAMvD,IAAO,MACPa,IAAe,CAAA;AAKrB,YAAC6C,EAAM,WAAW,CAAA,GAAI,QAAQ,CAAC7D,MAAS;AACtC,UAAI8D,IAAW3D,EAAK,4BAA4BH,GAAM0D,CAAU;AAChE,MAAA1C,EAAa,KAAK,GAAG8C,CAAQ;AAAA,IAC/B,CAAC,IAKAD,EAAM,UAAU,CAAA,GAAI,QAAQ,CAAC7D,MAAS;AACrC,YAAM+D,IAAQ5D,EAAK,2BAA2BH,GAAM0D,CAAU;AAC9D,MAAIK,KACF/C,EAAa,KAAK+C,CAAK;AAAA,IAE3B,CAAC,GAEMZ,EAAQnC,CAAY;AAAA,EAC7B;AAAA,EAEA,4BAA4BhB,GAAM0D,GAAY;AAC5C,UAAM,CAACM,GAAeC,CAAK,IAAIjE,EAAK,MAAM,GAAG,GACvCkE,IAAeR,EAAWM,CAAa,KAAK,CAAA,GAC5CxD,IAAOwC,EAAYiB,CAAK,GACxBH,IAAWI,EAAa,IAAI,CAACT,MAAS,KAAK,YAAYjD,GAAMiD,CAAI,CAAC,GAClEU,IAAoBhB,EAAQW,CAAQ;AAE1C,WAAAJ,EAAWM,CAAa,IAAIF,EAAS,IAAI,CAACC,MAAUA,EAAM,CAAC,EAAE,EAAE,GAExDZ,EAAQgB,CAAiB;AAAA,EAClC;AAAA,EAEA,2BAA2BnE,GAAM0D,GAAY;AAC3C,UAAM,CAACM,GAAexD,CAAI,IAAIR,EAAK,MAAM,GAAG,GACtCyD,IAAOC,EAAWM,CAAa;AACrC,QAAI,CAACP;AACH;AAGF,UAAMM,IAAQ,KAAK,YAAYvD,GAAMiD,CAAI,EAAE,CAAC;AAC5C,WAAAC,EAAWM,CAAa,IAAID,EAAM,IAE3BA;AAAA,EACT;AACF;ACvHA,MAAMK,UAAetE,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe9B,YAAY,EAAE,UAAAuE,IAAW,MAAM,KAAAC,IAAM,IAAM,cAAAC,IAAe,MAAM,cAAAC,IAAe,QAAQ;AACrF,UAAMzE,IAAa,CAAA,GACb0E,IAAWH,IAAM,UAAU;AAEjC,QAAI,OAAOD,KAAa,YAAYA,EAAS,WAAW,GAAG;AACzD,YAAMK,IAAM,gDAAgDL,CAAQ;AACpEvD,YAAAA,EAAG,OAAO,MAAM4D,CAAG,GACb,IAAI,MAAMA,CAAG;AAAA,IACrB;AAEA,IAAA3E,EAAW,UAAU,GAAG0E,CAAQ,MAAMJ,CAAQ,4BAC9C,MAAMtE,CAAU;AAEhB,QAAI0B,IAAc,CAAA;AAElB,IAAI8C,MACF9C,EAAY,aAAa8C,IAGvBC,MACF/C,EAAY,UAAU+C,IAGxB,KAAK,UAAU,IAAIxC,EAAQ;AAAA,MACzB,SAAS,KAAK;AAAA,MACd,aAAAP;AAAA,IACN,CAAK,GACD,KAAK,aAAa,IAAI8B,EAAU,GAChC,KAAK,QAAQ,IAAIhD,EAAM,EAAE,QAAQ,KAAI,CAAE;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,YAAYE,GAAI;AACd,WAAO,KAAK,MAAM,KAAK,WAAWA,CAAE;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,eAAeA,GAAI;AACjB,WAAO,KAAK,MAAM,KAAK,cAAcA,CAAE;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU;AACR,WAAO,KAAK,MAAM,KAAK,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,UAAU;AACR,WAAO,KAAK,MAAM,KAAK,MAAM;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,WAAW;AACT,WAAO,KAAK,MAAM,QAAQ,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAASQ,GAAQ;AACf,WAAO,KAAK,MAAM,aAAa,QAAQA,CAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,WAAW;AACT,WAAO,KAAK,MAAM,QAAQ,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,SAASA,GAAQ;AACf,WAAO,KAAK,MAAM,aAAa,QAAQA,CAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,YAAYC,GAAYC,GAAe;AACrC,WAAO,KAAK,MAAM,YAAYD,GAAYC,CAAa;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,eAAe;AACb,WAAO,KAAK,MAAM,QAAQ,UAAU;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBA,aAAaF,GAAQ;AACnB,WAAO,KAAK,MAAM,aAAa,YAAYA,CAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,iBAAiB;AACf,WAAO,KAAK,MAAM,QAAQ,YAAY;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,uBAAuBA,GAAQ;AAC7B,WAAO,KAAK,MAAM,aAAa,cAAcA,CAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,oBAAoBA,GAAQ;AAC1B,WAAO,KAAK,MAAM,aAAa,WAAWA,CAAM;AAAA,EAClD;AAAA,EAEA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC1TA,MAAM0D,UAAiB7E,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhC,cAAc;AACZ,UAAM;AAAA,MACJ,KAAK,IAAIA,EAAU;AAAA,IACzB,CAAK;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS8E,GAAMhF,GAAO;AACpB,SAAK,IAAI,KAAKA,GAAO,GAAGgF,EAAK,MAAM,GAAG,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAOA,GAAM;AACX,WAAO,KAAK,IAAI,IAAI,GAAGA,EAAK,MAAM,GAAG,CAAC;AAAA,EACxC;AACF;AC5DA,MAAMC,IAAS,IAEfC,IAAe;AAAA,EACb,QAAAD;AAAA,EAEA,KAAKH,GAAK;AACR,IAAI,KAAK,UAIT,QAAQ,IAAI,kBAAkBA,CAAG,EAAE;AAAA,EACrC;AAAA,EAEA,KAAKA,GAAK;AACR,IAAI,KAAK,UAIT,QAAQ,KAAK,4BAA4BA,CAAG,EAAE;AAAA,EAChD;AAAA,EAEA,MAAMA,GAAK;AACT,IAAI,KAAK,UAIT,QAAQ,MAAM,0BAA0BA,CAAG,EAAE;AAAA,EAC/C;AACF,GC5BAK,IAAe,CAACzE,MACP2C,EAAa3C,CAAG,EACpB,QAAQ,UAAU,CAACyC,MACX,MAAMA,EAAE,YAAW,CAC3B,EACA,QAAQ,MAAM,GAAG;ACctB,MAAMiC,UAAclF,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,YAAY4D,IAAa,IAAI;AAC3B,UAAM;AAAA,MACJ,YAAYA;AAAA,IAClB,CAAK,GAED,KAAK,8BAA6B;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,KAAK;AACP,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,UAAMlD,IAAOuE,EAAU,KAAK,YAAY,WAAW;AACnD,WAAO,CAAC1E,EAAUG,CAAI,GAAG,KAAK,EAAE;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAOyE,GAAO;AACZ,UAAM9E,IAAO;AAEb,SAAK,sBAAqB,GAC1B,OAAO,KAAK8E,CAAK,EAAE,QAAQ,CAAC5F,MAAQ;AAClC,MAAAc,EAAK,WAAWd,CAAG,IAAI4F,EAAM5F,CAAG;AAAA,IAClC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAU;AACR,WAAO,KAAK,MAAM,QAAQ,GAAG,KAAK,QAAQ;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AAET,WAAO,GADW,KAAK,YAAY,WAChB,OAAO,KAAK,EAAE;AAAA,EACnC;AAAA,EAEA,gCAAgC;AAI9B,KAAC,KAAK,YAAY,WAAW,CAAA,GAAI,QAAQ,CAACW,MAAS;AACjD,UAAI,CAACgE,GAAexD,CAAI,IAAIR,EAAK,MAAM,GAAG;AAC1C,WAAK,yBAAyBQ,GAAMwD,CAAa;AAAA,IACnD,CAAC,IAKA,KAAK,YAAY,UAAU,CAAA,GAAI,QAAQ,CAAChE,MAAS;AAChD,UAAI,CAACgE,GAAexD,CAAI,IAAIR,EAAK,MAAM,GAAG;AAC1C,WAAK,wBAAwBQ,GAAMwD,CAAa;AAAA,IAClD,CAAC;AAAA,EACH;AAAA,EAEA,yBAAyBxD,GAAMwD,GAAe;AAC5C,SAAK,qBAAqBA,GAAe,WAAY;AACnD,YAAM7D,IAAO,MACP+E,IAAM,KAAK,WAAWlB,CAAa;AAEzC,aAAOkB,IAAMA,EAAI,IAAI,CAACzE,MAAON,EAAK,MAAM,SAASK,GAAMC,CAAE,CAAC,IAAI;AAAA,IAChE,CAAC;AAAA,EACH;AAAA,EAEA,wBAAwBD,GAAMwD,GAAe;AAC3C,SAAK,qBAAqBA,GAAe,WAAY;AACnD,YAAMvD,IAAK,KAAK,WAAWuD,CAAa;AACxC,aAAOvD,IAAK,KAAK,MAAM,SAASD,GAAMC,CAAE,IAAI;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,UAAU;AACnB,WAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,SAAS;AAClB,WAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;ACnJA,MAAM0E,UAAgBH,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1B,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAM;AACR,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAgB;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,kBAAkB;AACpB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,iBAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,CAAC,YAAY,KAAK,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,SAAS;AAClB,WAAO,CAAC,WAAW;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC9HA,MAAMI,UAAaJ,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAM;AACR,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAgB;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,kBAAkB;AACpB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,CAAC,SAAS,KAAK,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,UAAU;AACnB,WAAO,CAAC,kBAAkB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC/FA,MAAMK,UAAqBvF,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQpC,YAAYwF,IAAS,IAAIC,IAAS,MAAM;AACtC,UAAK;AAEL,UAAMC,IAAY,CAAA;AAClB,KAACF,KAAU,CAAA,GAAI,QAAQ,CAACG,MAAQ;AAC9B,MAAAD,EAAUC,CAAG,IAAI,CAAA;AAAA,IACnB,CAAC,GAED,KAAK,aAAaD,GAClB,KAAK,UAAUD,KAAU,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GAAGE,GAAKC,GAAU;AAChB,UAAMC,IAAiB,KAAK,WAAWF,CAAG;AAE1C,QAAI,CAACE,GAAgB;AACnB7E,MAAAA,EAAG,OAAO,KAAK,uDAAuD,KAAK,GAAG;AAC9E;AAAA,IACF;AAEA,QAAI6E,EAAe,QAAQD,CAAQ,IAAI,IAAI;AACzC5E,MAAAA,EAAG,OAAO,KAAK,kEAAkE,KAAK,GAAG;AACzF;AAAA,IACF;AAEA,QAAI,OAAO4E,KAAa,YAAY;AAClC5E,MAAAA,EAAG,OAAO,KAAK,uDAAuD,KAAK,GAAG;AAC9E;AAAA,IACF;AAEA,IAAA6E,EAAe,KAAKD,CAAQ;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAID,GAAKC,GAAU;AACjB,UAAMC,IAAiB,KAAK,WAAWF,CAAG;AAE1C,QAAI,CAACE,GAAgB;AACnB7E,MAAAA,EAAG,OAAO,KAAK,yDAAyD,KAAK,GAAG;AAChF;AAAA,IACF;AAEA,UAAM8E,IAAQD,EAAe,QAAQD,CAAQ;AAC7C,QAAIE,KAAS,IAAI;AACf9E,MAAAA,EAAG,OAAO,KAAK,6CAA6C,KAAK,GAAG;AACpE;AAAA,IACF;AAEA,IAAA6E,EAAe,OAAOC,GAAO,CAAC;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,KAAKH,MAAQI,GAAM;AACjB,UAAMF,IAAiB,KAAK,WAAWF,CAAG,GACpCF,IAAS,KAAK;AAEpB,QAAI,CAACI,GAAgB;AACnB7E,MAAAA,EAAG,OAAO,KAAK,uCAAuC,KAAK,GAAG;AAC9D;AAAA,IACF;AAEA,IAAA6E,EAAe,QAAQ,CAACD,MAAaA,EAAS,KAAKH,GAAQ,GAAGM,CAAI,CAAC;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,SAAS;AACX,WAAO,OAAO,KAAK,KAAK,UAAU;AAAA,EACpC;AACF;AC9GA,MAAMC,UAAad,EAAM;AAAA,EACvB,cAAc;AACZ,UAAM,GAAG,SAAS;AAElB,UAAMM,IAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACN;AACI,SAAK,gBAAgB,IAAID,EAAaC,GAAQ,IAAI;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAa;AACX,UAAMS,IAAK,KAAK;AAEhB,WAAAA,EAAG,KAAK,WAAW,GACZ,KAAK,aAAa,YAAY,EAAE,KAAK,CAACC,OAC3CD,EAAG,KAAK,YAAY,GACbC,EACR;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ7D,GAASC,IAAW,GAAG;AAC7B,UAAM2D,IAAK,KAAK;AAEhB,WAAAA,EAAG,KAAK,WAAW5D,GAASC,CAAQ,GAC7B,KAAK,aAAa,YAAY;AAAA,MACnC,IAAID,EAAQ;AAAA,MACZ,UAAUC;AAAA,IAChB,CAAK,EAAE,KAAK,CAAC4D,OACPD,EAAG,KAAK,YAAY5D,GAASC,CAAQ,GAC9B4D,EACR;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAWC,GAAU;AACnB,WAAO,KAAK,WAAWA,GAAU,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAWA,MAAaJ,GAAM;AAC5B,UAAME,IAAK,KAAK,eAEVtF,IAAKwF,EAAS;AACpB,QAAI7D,GACA8D,GACAnF;AAEJ,WAAI8E,EAAK,UAAU,KACjBzD,IAAWyD,EAAK,CAAC,GACjBK,IAAUL,EAAK,CAAC,GAChB9E,IAAO,EAAE,IAAAN,GAAI,UAAA2B,GAAU,SAAA8D,EAAO,KAE1B,MAAML,EAAK,CAAC,CAAC,KACfK,IAAUL,EAAK,CAAC,GAChB9E,IAAO,EAAE,IAAAN,GAAI,SAAAyF,EAAO,MAEpB9D,IAAWyD,EAAK,CAAC,GACjB9E,IAAO,EAAE,IAAAN,GAAI,UAAA2B,EAAQ,IAIrBrB,EAAK,YACP,OAAO,KAAKA,EAAK,OAAO,EAAE,QAAQ,SAAUf,GAAM;AAChD,MAAAe,EAAK,WAAWf,CAAI,GAAG,IAAIe,EAAK,QAAQf,CAAI;AAAA,IAC9C,CAAC,GACD,OAAOe,EAAK,UAGdgF,EAAG,KAAK,cAAcE,GAAU,EAAE,UAAA7D,GAAU,SAAA8D,GAAS,GAC9C,KAAK,aAAa,eAAenF,CAAI,EAAE,KAAK,CAACiF,OAClDD,EAAG,KAAK,cAAcE,GAAU,EAAE,UAAA7D,GAAU,SAAA8D,GAAS,GAC9CF,EACR;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,qBAAqBtC,GAAY;AAC/B,UAAMqC,IAAK,KAAK,eACVnE,IAAS,CAAA;AAEf,kBAAO,KAAK8B,CAAU,EAAE,QAAQ,SAAU1D,GAAM;AAC9C,MAAA4B,EAAO,cAAc5B,CAAI,GAAG,IAAI0D,EAAW1D,CAAI;AAAA,IACjD,CAAC,GAED+F,EAAG,KAAK,YAAY,GACb,KAAK,aAAa,eAAenE,CAAM,EAAE,KAAK,CAACoE,OACpDD,EAAG,KAAK,YAAY,GACbC,EACR;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,GAAGP,GAAKC,GAAU;AAChB,SAAK,cAAc,GAAGD,GAAKC,CAAQ;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAID,GAAKC,GAAU;AACjB,SAAK,cAAc,IAAID,GAAKC,CAAQ;AAAA,EACtC;AAAA,EAEA,aAAaS,GAAQpF,IAAO,IAAI;AAC9B,UAAMqF,IAAU,KAAK,MAAM,SACrBzE,IAAM,CAACyE,EAAQ,SAAS,QAAQD,CAAM,EAAE,KAAK,GAAG,GAChDhG,IAAO;AAEb,WAAOiG,EAAQ,SAASzE,GAAKZ,CAAI,EAAE,KAAK,CAACsF,MAChClG,EAAK,MAAM,gBAAgB,QAAQkG,CAAY,CACvD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,KAAK;AAAA,EAET;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,aAAa;AACf,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAgB;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,eAAe;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,aAAa;AACf,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,iBAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,UAAU,WAAW;AAAA,EACnC;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,CAAC,MAAM;AAAA,EAChB;AAAA,EAEA,WAAW,UAAU;AACnB,WAAO,CAAC,qBAAqB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC3RA,MAAMC,UAAmBtB,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO7B,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,WAAW,UAAU;AACnB,WAAO,CAAC,kBAAkB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;ACzCA,MAAAuB,IAAe,CAAC5E,GAAK6E,IAAO,OAAO;AACjC,QAAMN,IAAU,OAAO;AAAA,IACrB;AAAA,MACE,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,aAAa;AAAA,IACnB;AAAA,IACIM;AAAA,EACJ,GAEQC,IAAa,CAACP,EAAQ,OAAOA,EAAQ,MAAM,EAAE,KAAK,GAAG;AAC3D,SAAAvE,IAAMA,EAAI,QAAQ,mBAAmB,EAAE,EAAE,QAAQ,eAAe,EAAE,GAE3D;AAAA,IACL;AAAA,IACA,eAAeuE,EAAQ,WAAW;AAAA,IAClC,UAAUO,CAAU;AAAA,IACpB;AAAA,IACA9E;AAAA,EACJ,EAAI,KAAK,GAAG;AACZ;ACXA,MAAM+E,UAAc1B,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAM;AACR,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,OAAO2B,GAAOC,GAAQJ,IAAO,CAAA,GAAI;AAC/B,IAAI,OAAOG,KAAU,aACnBA,IAAQ,MAGN,OAAOC,KAAW,aACpBA,IAAS;AAGX,UAAMV,IAAU,OAAO;AAAA,MACrB;AAAA,QACE,IAAI,KAAK;AAAA,QACT,OAAAS;AAAA,QACA,QAAAC;AAAA,MACR;AAAA,MACMJ;AAAA,IACN;AAEI,WAAOD,EAAe,KAAK,KAAKL,CAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,YAAYS,GAAOC,GAAQJ,IAAO,CAAA,GAAI;AACpC,IAAI,OAAOG,KAAU,aACnBA,IAAQ,MAGN,OAAOC,KAAW,aACpBA,IAAS,MAGeD,IAAQC,IACV,KAAK,cAC3BD,IAAQC,IAAS,KAAK,cAEtBA,IAASD,IAAQ,KAAK;AAGxB,UAAMT,IAAU,OAAO;AAAA,MACrB;AAAA,QACE,IAAI,KAAK;AAAA,QACT,OAAO,KAAK,MAAMS,CAAK;AAAA,QACvB,QAAQ,KAAK,MAAMC,CAAM;AAAA,MACjC;AAAA,MACMJ;AAAA,IACN;AAEI,WAAOD,EAAe,KAAK,KAAKL,CAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;ACjIA,MAAMW,UAAiB7B,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW,WAAW,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,iBAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,WAAW,SAAS;AAClB,WAAO,CAAC,uBAAuB,iBAAiB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC7DA,MAAM8B,UAAa9B,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAM;AACR,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,eAAe;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,iBAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,aAAa;AACf,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,UAAU;AACnB,WAAO,CAAC,eAAe;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC1GA,MAAM+B,UAAiB/B,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3B,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,CAAC,aAAa,KAAK,MAAM;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,UAAU;AACnB,WAAO,CAAC,gBAAgB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;ACrDA,MAAMgC,UAAahC,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAM;AACR,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,CAAC,SAAS,KAAK,MAAM;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC1EA,MAAMiC,UAAoBjC,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,YAAQ,KAAK,YAAY,IAAI,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,eAAe;AACjB,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,iBAAiB;AACnB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,oBAAoB;AACtB,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,QAAQ,SAAS,WAAY;AAEvC,aADqB,KAAK,WAAW,iBACb,KAAK,WAAW,QAAQ;AAAA,IAClD,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,QAAQ,WAAW,WAAY;AACzC,aAAO,KAAK,WAAW,UAAU;AAAA,IACnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAgB;AAClB,WAAK,KAAK,WAAW,gBAId,KAAK,QAAQ,iBAAiB,WAAY;AAC/C,aAAO,KAAK,WAAW,cAAc,KAAK,CAAC3B,GAAGC,MAAMD,EAAE,WAAWC,EAAE,QAAQ;AAAA,IAC7E,CAAC,IALQ;AAAA,EAMX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAAA,EAEA,iBAAiBlB,IAAW,GAAG;AAC7B,QAAI,CAAC,KAAK;AACR,aAAO,KAAK;AAGd,UAAM8E,IAAY,KAAK,eACjBC,IAAQD,EAAU;AACxB,QAAIE,IAAM,KAAK,MAAMD,IAAQ,CAAC,GAC1BE,GAAMC,GAAO3G,GAAQ4G;AAEzB,WAAO,CAAC5G,KAEF,EAAAyG,KAAO,MAFG;AAOd,UAAIA,KAAOD,GAAO;AAChB,QAAAxG,IAASuG,EAAUC,IAAQ,CAAC;AAC5B;AAAA,MACF;AAQA,UALAE,IAAOH,EAAUE,IAAM,CAAC,EAAE,UAC1BE,IAAQJ,EAAUE,CAAG,EAAE,UACvBG,IAAI,KAAK,OAAOH,IAAM,IAAIA,IAAM,KAAK,CAAC,GAGlChF,IAAWiF,GAAM;AACnB,QAAAD,KAAOG;AACP;AAAA,MACF;AAGA,UAAInF,IAAWkF,GAAO;AACpB,QAAAF,KAAOG;AACP;AAAA,MACF;AAKA,MAAA5G,IAASuG,EAAU9E,MAAakF,IAAQF,IAAMA,IAAM,CAAC;AAAA,IACvD;AAEA,WAAOzG,IAASA,EAAO,QAAQ,KAAK;AAAA,EACtC;AACF;ACzMA,MAAM6G,UAAgBP,EAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,IAAI,WAAW;AACb,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,YAAQ,KAAK,YAAY,IAAI,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,IAAI,eAAe;AACjB,UAAM9G,IAAO;AAEb,WAAO,KAAK,QAAQ,gBAAgB,MAAM;AACxC,YAAMsH,IAAe,CAAA;AAErB,aAAAtH,EAAK,YAAY,QAAQ,CAACuH,GAAQC,MAAM;AACtC,QAAAF,EAAaC,CAAM,IAAIvH,EAAK,SACzB,IAAI,CAACgC,MACGA,EAAQ,QAAQwF,CAAC,CACzB,EACA,OAAO,CAAC/H,GAAOgI,GAAG,MAEVhI,MAAU,QAAQ,EAAE,QAAQA,CAAK,MAAMgI,CAC/C;AAAA,MACL,CAAC,GAEMH;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAsBjB,GAAM;AAC1B,UAAMN,IAAU,CAAA;AAChB,aAAS,CAAClG,GAAMJ,CAAK,KAAKT,EAAQqH,CAAI,GAAG;AACvC,UAAImB,IAAI,KAAK,YAAY,QAAQ3H,CAAI;AACrC,MAAAkG,EAAQyB,CAAC,IAAI/H;AAAA,IACf;AAEA,WAAO,KAAK,SAAS,OAAO,CAACuC,MAAY;AACvC,eAAS,CAACwF,GAAG/H,CAAK,KAAKT,EAAQ+G,CAAO;AACpC,YAAI/D,EAAQ,QAAQwF,CAAC,MAAM/H;AACzB,iBAAO;AAIX,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,gBAAgBa,GAAI;AAClB,UAAMN,IAAO;AACb,WAAO,KAAK,QAAQ,cAAcM,GAAI,MAAM;AAC1C,eAAS0B,KAAWhC,EAAK;AACvB,YAAIgC,EAAQ,OAAO1B;AACjB,iBAAO0B;AAAA,IAIb,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,UAAU;AACnB,WAAO,CAAC,gBAAgB,kBAAkB;AAAA,EAC5C;AAAA,EAEA,WAAW,SAAS;AAClB,WAAO,CAAC,qBAAqB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;AC5HA,MAAM0F,UAAa7C,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,OAAO;AACT,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,kBAAkB;AACpB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,MAAM;AACR,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,YAAY;AACd,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,kBAAkB;AACpB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAU;AACZ,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,SAAS;AACX,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,eAAe;AACjB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,oBAAoB;AACtB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,gBAAgB;AAClB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,mBAAmB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,WAAW;AACb,WAAO,CAAC,MAAM;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;ACxNA,MAAM8C,UAAgBb,EAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,IAAI,UAAU;AACZ,WAAO,KAAK,QAAQ,WAAW,WAAY;AACzC,aAAO,CAAC,KAAK,WAAW,UAAU,KAAK,WAAW,UAAU,KAAK,WAAW,QAAQ,EAAE;AAAA,QACpF,CAACS,MAAYA,KAAUA,EAAO,SAAS,IAAIA,IAAS;AAAA,MAC5D;AAAA,IACI,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,SAAS;AAClB,WAAO,CAAC,qBAAqB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,cAAc;AACvB,WAAO;AAAA,EACT;AACF;;;;;;;;;;;;;;;8CCnCAK,IAAe,SCyBTC,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAapB,aAAa,EAAE,UAAA3D,IAAW,QAAQ;AAChC,UAAMO,IAAO,CAAC,WAAWP,CAAQ,EAAE,KAAK,GAAG;AAC3C,QAAI4D,IAAS,KAAK,OAAOrD,CAAI;AAE7B,WAAKqD,MACHA,IAAS,IAAI7D,EAAO,GAAG,SAAS,GAChC,KAAK,SAASQ,GAAMqD,CAAM,IAGrBA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS;AACP,WAAO,KAAK,UAAU,OAAO,GAAG,SAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW;AACT,WAAO,KAAK,UAAU,SAAS,GAAG,SAAS;AAAA,EAC7C;AAAA,EAEA,iBAAiB;AACf,WAAO,KAAK,WACZ,KAAK,YAAY,IAAItD,EAAQ;AAG7B,aAAS,CAAC3E,GAAMY,CAAK,KAAKzB,EAAQmC,CAAM,GAAG;AACzC,UAAIsD,IAAO,CAAC,UAAUG,EAAU/E,CAAI,CAAC,EAAE,KAAK,GAAG;AAC/C,WAAK,SAAS4E,GAAMhE,CAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQX,QAAAkE;AAAA,EAEA,SAAAiD;AACF;AAEAC,EAAc,eAAc;AC5FvB,OAAO,kBACV,OAAO,gBAAgBA;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(h){typeof define=="function"&&define.amd?define(h):h()})((function(){"use strict";/*! @versacommerce/versacommerce-js-sdk v0.4.0 | (c) VersaCommerce | UNLICENSED */function*h(i){for(let t of Object.keys(i))yield[t,i[t]]}const k=(i,t)=>{let e=i;return t.forEach(r=>{e!==void 0&&(e=e[r])}),e},j=(i,t,e)=>{const r=e.pop();let s=i;e.forEach(n=>{s[n]===void 0&&(s[n]={}),s=s[n]}),s[r]=t};class d{constructor(t={}){for(let[e,r]of h(t))this[e]=r}dig(...t){return k(this,t)}bury(t,...e){j(this,t,e)}defineReadOnlyProperty(t,e){Object.defineProperty(this,t,{get:e})}memoize(t,e){this._memoized||(this._memoized={});let r=this.dig("_memoized",t);return r===void 0&&(r=e.call(this),this.bury(r,"_memoized",t)),r}defineCachedProperty(t,e){let r=this;this.defineReadOnlyProperty(t,()=>r.memoize(t,e))}clearCachedProperty(t){this.bury(void 0,"_memoized",t)}clearCachedProperties(){const t=this._memoized||{};for(let[e]of h(t))this.clearCachedProperty(e)}}const g=i=>i+"s";class w extends d{constructor(){super(...arguments),this._db=new d}find(t,e){const r=this,s=this.findSync(t,e);return s?Promise.resolve(s):this.load(t,e).then(n=>(n.forEach(o=>r.push(o)),r.findSync(t,e))).catch(n=>(u.Logger.error(`Cannot find ${t} ${e?`with id ${e} `:""}(${n})`),Promise.reject(n)))}refresh(t,e){const r=this;return this.load(t,e).then(s=>r._refreshWithDeserialized(t,s)).catch(s=>(u.Logger.error(`Cannot refresh ${t} ${e?`with id ${e} `:""}(${s})`),Promise.reject(s)))}refreshWithData(t,e){const r=this.loadData(t,e);return this._refreshWithDeserialized(t,r)}_refreshWithDeserialized(t,e){const r=this,s=e[0],n=e.slice(1);return r.findSync(t,s.id).update(s.attributes),n.forEach(a=>r.push(a)),r.findSync(t,s.id)}findSync(t,e){return e?this._db.dig(g(t),e):this._db.dig(t)}load(t,e){const r=this;return this.adapter.getRessource(t,e).then(s=>r.loadData(t,s))}findByHandle(t,e){const r=this,s=this.findSyncByHandle(t,e);return s?Promise.resolve(s):this.loadByHandle(t,e).then(n=>(n.forEach(o=>r.push(o)),r.findSyncByHandle(t,e))).catch(n=>(u.Logger.error(`Cannot find ${t} with handle '${e}' (${n})`),Promise.reject(n)))}findSyncByHandle(t,e){return this._db.dig(g(t),e)}loadByHandle(t,e){const r=this;return this.adapter.getRessourceByHandle(t,e).then(s=>r.loadData(t,s))}findArticle(t,e){const r=this;return this.adapter.getArticle(t,e).then(s=>{const n=r.loadData("article",s);return n.forEach(o=>r.push(o)),n[0]}).catch(s=>(u.Logger.error(`Cannot find article '${e}' in blog '${t}' (${s})`),Promise.reject(s)))}findAll(t){const e=this;return this.adapter.getList(t).then(r=>e._loadListData(t,r)).catch(r=>(u.Logger.error(`Cannot find ${t} list (${r})`),Promise.reject(r)))}_loadListData(t,e){const r=this,s=g(t),n=e[s]||[],o=[];return n.forEach(a=>{const l=r.loadData(t,a);l.forEach(p=>r.push(p)),o.push(l[0])}),o}loadData(t,e){return this.client.serializer.deserialize(t,e)}push(t){t.store=this,this._db.bury(t,...t.storeKey)}get adapter(){return this.client.adapter}}const O=i=>i.charAt(0).toUpperCase()+i.slice(1),b=(i={})=>Object.keys(i).map(t=>`${t}=${i[t]}`).join("&"),f=(i,t={})=>{if(Object.keys(t).length===0)return i;const e=b(t),r=i.match(/\?[^?=]+=.+$/);return[i,e].join(r?"&":"?")},y=i=>i>=200&&i<300;class U extends d{constructor({baseUrl:t="",queryParams:e={}}){super(),this.baseUrl=t.replace(/\/$/,""),this._queryParams=e}getRessource(t,e){const r=this.urlForRessource(t,e);return this.getJSON(r)}urlForRessource(t,e){const r=this["_urlFor"+O(t)];if(r)return r.apply(this,arguments);const s=g(t);return[this.baseUrl,s,e+".json"].join("/")}_urlForCart(){return[this.baseUrl,"cart.json"].join("/")}_urlForShop(){return this.rootUrl+"/shop.json"}_urlForPage(t,e){return this.rootUrl+"/pages/"+e+".json"}_urlForBlog(t,e){return this.rootUrl+"/blogs/"+e+".json"}_urlForArticle(t,e,r){return this.rootUrl+"/blogs/"+e+"/"+r+".json"}_urlForLinklist(t,e){return this.rootUrl+"/linklists/"+e+".json"}getRessourceByHandle(t,e){const r=this.urlForRessource(t,e);return this.getJSON(r)}getArticle(t,e){const r=this._urlForArticle("article",t,e);return this.getJSON(r)}getList(t){const e=this._urlForList(t);return this.getJSON(e)}_urlForList(t){const e=g(t);return this.rootUrl+"/"+e+".json"}getProductByHandle(t){const e=this.rootUrl+"/products/"+t+".json";return this.getJSON(e)}getCollectionByHandle(t){const e=this.rootUrl+"/collections/"+t+".json";return this.getJSON(e)}checkoutUrlForVariant(t,e=1,r={}){let s=[this.rootUrl,"cart","add"].join("/");return r=Object.assign({clear:1,return_to:encodeURIComponent("/checkout"),"products[][id]":t.id,"products[][quantity]":e},r),s=f(s,r),this.makeUrl(s)}addToCartUrlForVariant(t,e=1,r={}){let s=[this.rootUrl,"cart","add"].join("/");return r=Object.assign({"products[][id]":t.id,"products[][quantity]":e},r),s=f(s,r),this.makeUrl(s)}urlForProduct(t,e={}){let r=[this.rootUrl,"products",t.id].join("/");return r=f(r,e),this.makeUrl(r)}get(t){return t=this.makeUrl(t),new Promise((e,r)=>{const s=new XMLHttpRequest,n=4;s.open("GET",t),s.withCredentials=!0,s.onreadystatechange=()=>{if(s.readyState===n){if(!y(s.status)){u.Logger.error(`Error retrieving ${t} (${s.status})`),r(s.status);return}e(s.responseText)}},s.send(null)})}post(t,e={}){const r=b(e);return t=this.makeUrl(t),new Promise((s,n)=>{const o=new XMLHttpRequest,a=4;o.open("POST",t),o.withCredentials=!0,o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.onreadystatechange=()=>{if(o.readyState===a){if(!y(o.status)){u.Logger.error(`Error retrieving ${t} (${o.status})`),n(o.status);return}s(o.responseText)}},o.send(r)})}getJSON(t){const e=this;return this.get(t).then(r=>e._parseJSON(r)).catch(r=>(r==="invalid json"&&u.Logger.error(`Cannot parse JSON (${t})`),Promise.reject(r)))}postJSON(t,e={}){const r=this;return this.post(t,e).then(s=>r._parseJSON(s)).catch(s=>(s==="invalid json"&&u.Logger.error(`Cannot parse JSON (${t})`),Promise.reject(s)))}makeUrl(t){return f(t,this._queryParams)}_parseJSON(t){try{const e=JSON.parse(t);return Promise.resolve(e)}catch{return Promise.reject("invalid json")}}get rootUrl(){const t=this.baseUrl,e=t.match(/^(?:https?:)?\/\/(?:[^/]+)/);return e?e[0]:t}}const S=i=>i.replace(/(_|-)[A-z0-9]/g,t=>t.substring(1,2).toUpperCase()),A=i=>i.replace(/s$/,""),_=i=>i.charAt(0).toLowerCase()+i.slice(1),L=i=>_(i).replace(/[A-Z]/g,t=>"_"+t.toLowerCase()).replace(/-/g,"_");let m=i=>i.reduce((t,e)=>t.concat(Array.isArray(e)?m(e):e),[]);class $ extends d{deserialize(t,e){const r=this.getRoot(t,e),s=this.normalize(r),n=u.lookup(["models",t].join("/")),o=this._resolveRelationships(n,s);return[new n(s)].concat(o)}normalize(t){const e={};for(let[r,s]of h(t)){let n=S(r);e[n]=s}return e}getRoot(t,e){const r=L(t);return e[r]}_resolveRelationships(t,e){const r=this,s=[];return(t.hasMany||[]).forEach(n=>{let o=r._resolveHasManyRelationship(n,e);s.push(...o)}),(t.hasOne||[]).forEach(n=>{const o=r._resolveHasOneRelationship(n,e);o&&s.push(o)}),m(s)}_resolveHasManyRelationship(t,e){const[r,s]=t.split(":"),n=e[r]||[],o=A(s),a=n.map(p=>this.deserialize(o,p)),l=m(a);return e[r]=a.map(p=>p[0].id),m(l)}_resolveHasOneRelationship(t,e){const[r,s]=t.split(":"),n=e[r];if(!n)return;const o=this.deserialize(s,n)[0];return e[r]=o.id,o}}class x extends d{constructor({shopName:t=null,ssl:e=!0,trackingCode:r=null,salesChannel:s=null}){const n={},o=e?"https":"http";if(typeof t!="string"||t.length===0){const l=`Cannot create Client with invalid shop name '${t}'`;throw u.Logger.error(l),new Error(l)}n.baseUrl=`${o}://${t}.versacommerce.de/js-api`,super(n);let a={};r&&(a.utm_source=r),s&&(a.channel=s),this.adapter=new U({baseUrl:this.baseUrl,queryParams:a}),this.serializer=new $,this.store=new w({client:this})}findProduct(t){return this.store.find("product",t)}findCollection(t){return this.store.find("collection",t)}getCart(){return this.store.find("cart")}getShop(){return this.store.find("shop")}getPages(){return this.store.findAll("page")}findPage(t){return this.store.findByHandle("page",t)}getBlogs(){return this.store.findAll("blog")}findBlog(t){return this.store.findByHandle("blog",t)}findArticle(t,e){return this.store.findArticle(t,e)}getLinklists(){return this.store.findAll("linklist")}findLinklist(t){return this.store.findByHandle("linklist",t)}getCollections(){return this.store.findAll("collection")}findCollectionByHandle(t){return this.store.findByHandle("collection",t)}findProductByHandle(t){return this.store.findByHandle("product",t)}static get displayName(){return"Client"}}class N extends d{constructor(){super({_db:new d})}register(t,e){this._db.bury(e,...t.split("/"))}lookup(t){return this._db.dig(...t.split("/"))}}const z={silent:!0,info(i){this.silent||console.log(`VersaCommerce: ${i}`)},warn(i){this.silent||console.warn(`VersaCommerce [Warning]: ${i}`)},error(i){this.silent||console.error(`VersaCommerce [Error]: ${i}`)}},C=i=>_(i).replace(/[A-Z]/g,t=>"-"+t.toLowerCase()).replace(/_/g,"-");class c extends d{constructor(t={}){super({attributes:t}),this._defineRelationshipProperties()}get id(){return this.attributes.id}get storeKey(){const t=C(this.constructor.displayName);return[g(t),this.id]}update(t){const e=this;this.clearCachedProperties(),Object.keys(t).forEach(r=>{e.attributes[r]=t[r]})}refresh(){return this.store.refresh(...this.storeKey)}toString(){return`${this.constructor.displayName} id:${this.id}`}_defineRelationshipProperties(){(this.constructor.hasMany||[]).forEach(t=>{let[e,r]=t.split(":");this._defineHasManyProperties(r,e)}),(this.constructor.hasOne||[]).forEach(t=>{let[e,r]=t.split(":");this._defineHasOneProperties(r,e)})}_defineHasManyProperties(t,e){this.defineCachedProperty(e,function(){const r=this,s=this.attributes[e];return s?s.map(n=>r.store.findSync(t,n)):void 0})}_defineHasOneProperties(t,e){this.defineCachedProperty(e,function(){const r=this.attributes[e];return r?this.store.findSync(t,r):void 0})}static get hasMany(){return[]}static get hasOne(){return[]}static get displayName(){return"Model"}}class E extends c{get handle(){return this.attributes.handle}get title(){return this.attributes.title}get content(){return this.attributes.content}get author(){return this.attributes.author}get url(){return this.attributes.url}get createdAt(){return this.attributes.createdAt}get publishedAt(){return this.attributes.publishedAt}get commentsCount(){return this.attributes.commentsCount}get commentsEnabled(){return this.attributes.commentsEnabled}get commentPostUrl(){return this.attributes.commentPostUrl}get storeKey(){return["articles",this.id]}static get hasOne(){return["blog:blog"]}static get displayName(){return"Article"}}class R extends c{get handle(){return this.attributes.handle}get title(){return this.attributes.title}get url(){return this.attributes.url}get fullUrl(){return this.attributes.fullUrl}get articlesCount(){return this.attributes.articlesCount}get commentsEnabled(){return this.attributes.commentsEnabled}get moderated(){return this.attributes.moderated}get storeKey(){return["blogs",this.handle]}static get hasMany(){return["articles:article"]}static get displayName(){return"Blog"}}class H extends d{constructor(t=[],e=null){super();const r={};(t||[]).forEach(s=>{r[s]=[]}),this._listeners=r,this._callee=e||{}}on(t,e){const r=this._listeners[t];if(!r){u.Logger.warn(`Trying to register a listener for an unknown event (${event})`);return}if(r.indexOf(e)>-1){u.Logger.warn(`Trying to register a listener that has been registered before (${event})`);return}if(typeof e!="function"){u.Logger.warn(`Trying to register a listener that is not callable (${event})`);return}r.push(e)}off(t,e){const r=this._listeners[t];if(!r){u.Logger.warn(`Trying to unregister a listener for an unknown event (${event})`);return}const s=r.indexOf(e);if(s==-1){u.Logger.warn(`Trying to unregister an unknown listener (${event})`);return}r.splice(s,1)}emit(t,...e){const r=this._listeners[t],s=this._callee;if(!r){u.Logger.warn(`Trying to trigger an unknown event (${event})`);return}r.forEach(n=>n.call(s,...e))}get events(){return Object.keys(this._listeners)}}class B extends c{constructor(){super(...arguments);const t=["willAdd","hasAdded","willClear","hasCleared","willChange","hasChanged","willUpdate","hasUpdated"];this._eventEmitter=new H(t,this)}clearItems(){const t=this._eventEmitter;return t.emit("willClear"),this._postCartUrl("clear.json").then(e=>(t.emit("hasCleared"),e))}addItem(t,e=1){const r=this._eventEmitter;return r.emit("willAdd",t,e),this._postCartUrl("add.json",{id:t.id,quantity:e}).then(s=>(r.emit("hasAdded",t,e),s))}removeItem(t){return this.changeItem(t,0)}changeItem(t,...e){const r=this._eventEmitter,s=t.id;let n,o,a;return e.length==2?(n=e[0],o=e[1],a={id:s,quantity:n,options:o}):isNaN(e[0])?(o=e[0],a={id:s,options:o}):(n=e[0],a={id:s,quantity:n}),a.options&&(Object.keys(a.options).forEach(function(l){a[`options[${l}]`]=a.options[l]}),delete a.options),r.emit("willChange",t,{quantity:n,options:o}),this._postCartUrl("update.json",a).then(l=>(r.emit("hasChanged",t,{quantity:n,options:o}),l))}updateCartAttributes(t){const e=this._eventEmitter,r={};return Object.keys(t).forEach(function(s){r[`attributes[${s}]`]=t[s]}),e.emit("willUpdate"),this._postCartUrl("update.json",r).then(s=>(e.emit("hasUpdated"),s))}on(t,e){this._eventEmitter.on(t,e)}off(t,e){this._eventEmitter.off(t,e)}_postCartUrl(t,e={}){const r=this.store.adapter,s=[r.baseUrl,"cart",t].join("/"),n=this;return r.postJSON(s,e).then(o=>n.store.refreshWithData("cart",o))}get id(){}get totalPrice(){return this.attributes.totalPrice}get subtotalPrice(){return this.attributes.subtotalPrice}get shippingCost(){return this.attributes.shippingCost}get taxAmount(){return this.attributes.taxAmount}get taxRate(){return this.attributes.taxRate}get extraPrice(){return this.attributes.extraPrice}get cartAttributes(){return this.attributes.cartAttributes}get items(){return this.lineItems}get isEmpty(){return this.lineItems.length===0}get storeKey(){return["cart"]}static get hasMany(){return["lineItems:line-item"]}static get displayName(){return"Cart"}}class D extends c{get title(){return this.attributes.title}get description(){return this.attributes.description}static get hasMany(){return["products:product"]}static get displayName(){return"Collection"}}const P=(i,t={})=>{const e=Object.assign({id:1,width:100,height:100,progressive:!1},t),r=[e.width,e.height].join("x");return i=i.replace(/^(https?:)?\/\//,"").replace(/^.+\/\+\+\//,""),["//img.versacommerce.io",`progressive=${e.progressive}`,`resize=${r}`,"++",i].join("/")};class M extends c{get height(){return this.attributes.height}get width(){return this.attributes.width}get aspectRatio(){return this.width/this.height}get url(){return this.attributes.url}resize(t,e,r={}){typeof t!="number"&&(t=100),typeof e!="number"&&(e=100);const s=Object.assign({id:this.id,width:t,height:e},r);return P(this.url,s)}resizeToFit(t,e,r={}){typeof t!="number"&&(t=100),typeof e!="number"&&(e=100),t/e>this.aspectRatio?t=e*this.aspectRatio:e=t/this.aspectRatio;const n=Object.assign({id:this.id,width:Math.round(t),height:Math.round(e)},r);return P(this.url,n)}static get displayName(){return"Image"}}class T extends c{get title(){return this.attributes.title}get options(){return this.attributes.options||{}}get quantity(){return this.attributes.quantity}get price(){return this.attributes.price}get linePrice(){return this.attributes.linePrice}get compareAtPrice(){return this.attributes.compareAtPrice}static get hasOne(){return["featuredImage:image","variant:variant"]}static get displayName(){return"LineItem"}}class I extends c{get handle(){return this.attributes.handle}get title(){return this.attributes.title}get titleText(){return this.attributes.titleText}get url(){return this.attributes.url}get autoOpen(){return this.attributes.autoOpen}get hasSublinks(){return this.attributes.hasSublinks}get linkableType(){return this.attributes.linkableType}get javascriptLink(){return this.attributes.javascriptLink}get highlights(){return this.attributes.highlights}static get hasMany(){return["children:link"]}static get displayName(){return"Link"}}class F extends c{get handle(){return this.attributes.handle}get title(){return this.attributes.title}get storeKey(){return["linklists",this.handle]}static get hasMany(){return["rootLinks:link"]}static get displayName(){return"Linklist"}}class J extends c{get handle(){return this.attributes.handle}get title(){return this.attributes.title}get content(){return this.attributes.content}get url(){return this.attributes.url}get fullUrl(){return this.attributes.fullUrl}get storeKey(){return["pages",this.handle]}static get displayName(){return"Page"}}class v extends c{get title(){return this.attributes.title}get subtitle(){return this.attributes.subtitle}get hasSubtitle(){return(this.subtitle||"").length>0}get available(){return this.attributes.available}get price(){return this.attributes.price}get basePrice(){return this.attributes.basePrice}get hasBasePrice(){return this.basePrice!==null}get compareAtPrice(){return this.attributes.compareAtPrice}get hasCompareAtPrice(){return this.compareAtPrice!==null}get stock(){return this.memoize("stock",function(){return this.attributes.considersStock?this.attributes.stock:1/0})}get taxRate(){return this.memoize("taxRate",function(){return this.attributes.taxRate/100})}get showsStockAmount(){return this.attributes.showsStockAmount}get bulkDiscounts(){return this.attributes.bulkDiscounts?this.memoize("bulkDiscounts",function(){return this.attributes.bulkDiscounts.sort((t,e)=>t.quantity-e.quantity)}):null}get hasBulkDiscounts(){return this.bulkDiscounts!==null}priceForQuantity(t=1){if(!this.hasBulkDiscounts)return this.price;const e=this.bulkDiscounts,r=e.length;let s=Math.floor(r/2),n,o,a,l;for(;!a&&!(s<=0);){if(s>=r){a=e[r-1];break}if(n=e[s-1].quantity,o=e[s].quantity,l=Math.floor((s>2?s:2)/2),t<n){s-=l;continue}if(t>o){s+=l;continue}a=e[t===o?s:s-1]}return a?a.price:this.price}}class V extends v{get subtitle(){return this.attributes.subtitle}get hasSubtitle(){return(this.subtitle||"").length>0}get description(){return this.attributes.description}get optionNames(){return this.attributes.optionNames}get optionValues(){const t=this;return this.memoize("optionValues",()=>{const e={};return t.optionNames.forEach((r,s)=>{e[r]=t.variants.map(n=>n.options[s]).filter((n,o,a)=>n!==null&&a.indexOf(n)===o)}),e})}findVariantsByOptions(t){const e={};for(let[r,s]of h(t)){let n=this.optionNames.indexOf(r);e[n]=s}return this.variants.filter(r=>{for(let[s,n]of h(e))if(r.options[s]!==n)return!1;return!0})}findVariantById(t){const e=this;return this.memoize("variants:"+t,()=>{for(let r of e.variants)if(r.id===t)return r})}static get hasMany(){return["images:image","variants:variant"]}static get hasOne(){return["featuredImage:image"]}static get displayName(){return"Product"}}class q extends c{get handle(){return this.attributes.handle}get name(){return this.attributes.name}get logoUrl(){return this.attributes.logoUrl}get checkoutLogoUrl(){return this.attributes.checkoutLogoUrl}get url(){return this.attributes.url}get domain(){return this.attributes.domain}get subdomain(){return this.attributes.subdomain}get defaultHostName(){return this.attributes.defaultHostName}get checkoutHostName(){return this.attributes.checkoutHostName}get locale(){return this.attributes.locale}get version(){return this.attributes.version}get design(){return this.attributes.design}get currencyCode(){return this.attributes.currencyCode}get currency(){return this.attributes.currency}get passwordProtected(){return this.attributes.passwordProtected}get priceIncludesTax(){return this.attributes.priceIncludesTax}get allProductsCount(){return this.attributes.allProductsCount}get productsCount(){return this.attributes.productsCount}get collectionsCount(){return this.attributes.collectionsCount}get storeKey(){return["shop"]}static get displayName(){return"Shop"}}class K extends v{get options(){return this.memoize("options",function(){return[this.attributes.option01,this.attributes.option02,this.attributes.option03].map(t=>t&&t.length>0?t:null)})}static get hasOne(){return["featuredImage:image"]}static get displayName(){return"Variant"}}const W=Object.freeze(Object.defineProperty({__proto__:null,Article:E,Blog:R,Cart:B,Collection:D,Image:M,LineItem:T,Link:I,Linklist:F,Page:J,Product:V,Shop:q,Variant:K},Symbol.toStringTag,{value:"Module"})),u={createClient({shopName:i=null}){const t=["clients",i].join("/");let e=this.lookup(t);return e||(e=new x(...arguments),this.register(t,e)),e},lookup(){return this._registry.lookup(...arguments)},register(){return this._registry.register(...arguments)},_setupRegistry(){delete this._registry,this._registry=new N;for(let[i,t]of h(W)){let e=["models",C(i)].join("/");this.register(e,t)}},_registry:null,Logger:z,version:"0.5.0"};u._setupRegistry(),window.VersaCommerce||(window.VersaCommerce=u)}));
|
|
2
|
+
//# sourceMappingURL=versacommerce-js-sdk.umd.cjs.map
|