From e0ca67c56a3aa579ef40b8314dfd83da4832602c Mon Sep 17 00:00:00 2001 From: Siar <83523212+Siar416@users.noreply.github.com> Date: Thu, 25 May 2023 04:22:41 -0400 Subject: [PATCH 1/2] Updated the getState (#19) * Updated the getState function to return an array similiar to how useState hook works * Minor adjustment, instead of passing setState we are now passing a lister function instead. --- src/context.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/context.js b/src/context.js index c928bf2..c291680 100644 --- a/src/context.js +++ b/src/context.js @@ -94,7 +94,7 @@ export default (function () { function getState(key) { if (typeof store[key] === 'undefined') _initState(key, null); var listener = new ListenerConstructor(key); - return { value: store[key], onchange: listener }; + return [store[key], listener]; } /** From db0c48c42b94ef0f10520ed927790c2508871d18 Mon Sep 17 00:00:00 2001 From: Rabis Naqvi Date: Thu, 25 May 2023 13:38:01 +0500 Subject: [PATCH 2/2] Update getState to return an array, which could be extracted like react useState.#14 Updated unit tests to match the updated response from Astral.context.getState. --- dist/astral.min.js | 2 +- dist/astral.min.js.map | 2 +- specs/context.spec.js | 24 ++++++++++---------- src/context.js | 51 ++++++++++++++++++++++-------------------- 4 files changed, 41 insertions(+), 38 deletions(-) diff --git a/dist/astral.min.js b/dist/astral.min.js index 19c506a..43368ca 100644 --- a/dist/astral.min.js +++ b/dist/astral.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Astral=e():t.Astral=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{context:()=>r,default:()=>o,event:()=>n,layout:()=>i});const n=function(){const t={};let e=!1;function n(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}function i(t){e&&console.debug("Astral.event $:",t)}return{subscribe:function(e,n){Array.isArray(t[e])||(t[e]=[],i("Event: "+e+" subcribers list initialized")),-1===t[e].indexOf(n)&&(t[e].push(n),i("Event: "+e))},publish:function(e,n){Array.isArray(t[e])?t[e].forEach((function(t){t(n),i("Event: "+e+"\nData: "+JSON.stringify(n))})):i("Event: "+e+"\nData: "+JSON.stringify(n)+"\nAction: No subscribers found")},unsubscribe:function(e,r){if(Array.isArray(t[e])){for(var o=0;o=i.minWidth&&t.WIDTH<=i.maxWidth&&t.HEIGHT>=i.minHeight)return i}throw new Error("Astral.layout: No breakpoint found for screen size: "+t.WIDTH+"x"+t.HEIGHT)}function f(){try{return window.screen.orientation.type}catch(t){if(window.matchMedia)return window.matchMedia("(orientation: portrait)").matches?"portrait":"landscape";throw new Error("Astral.layout: No orientation found",t)}}return function(){if(window.addEventListener("resize",c),window.screen&&window.screen.orientation)window.screen.orientation.addEventListener("change",(function(){u()}));else if(window.matchMedia){const t=window.matchMedia("(orientation: portrait)");u(),t.addListener((function(){u()}))}}(),{config:function(t){if(!t||!t.breakpoints)throw new Error("Astral.layout: Invalid configuration");e=t,i=Object.keys(e.breakpoints).reduce(((t,e)=>(t[e]=e,t)),{})},getWindowSize:s,getOrientation:f,getBreakpoint:d,getBreakpointFromLabel:l,applyIf:function(t,e,i,d){if(!i||0===i.length||!t)throw new Error("Astral.layout: No conditions or callbackSuccess provided");function f(){let n=!1;for(let t=0;t=":n.WIDTH>=t.minWidth&&(o=!0);break;case"<":n.WIDTH":n.WIDTH>t.minWidth&&(o=!0);break;default:n.WIDTH>=t.minWidth&&n.WIDTH<=t.maxWidth&&n.HEIGHT>=t.minHeight&&(o=!0)}}if("function"==typeof e&&(o=e.call()),r=`Condition ${t} matched: ${o}`,a&&console.debug(`Astral.layout $: ${r}`),o&&(n=!0),n&&d&&o&&(n=!0),n&&d&&!o&&(n=!1),d&&!o){n=!1;break}if(!d&&o){n=!0;break}}var r;n?t.call():e.call()}var b;b=f,n.subscribe(r,b),c(),function(t){n.subscribe(o,t),u()}(f)},getBreakpointLabels:function(){return i},setDebugMode:function(t){a=t}}}(),r=function(){var t={},e=!1;function i(e,n){if(void 0!==t[e])throw Error("Astral.context: State already initialized");t[e]=null,a("State: "+e+"\nValue: "+n+"\nAction: Initialized"),r(e,n)}function r(e,o){if("object"!=typeof e||null===e){void 0===t[e]&&i(e,null);var c=t[e];t[e]=o,a("State: "+e+"\nValue: "+o+"\nAction: Updated"),n.publish("ASTRAL_CONTEXT_UPDATED_INTERNAL_"+e,{prevState:c,newState:t[e]})}else for(const t in e)r(t,e[t])}function o(t){return function(e){n.subscribe("ASTRAL_CONTEXT_UPDATED_INTERNAL_"+t,(function(t){e.call(null,t.prevState,t.newState)}))}}function a(t){e&&console.debug("Astral.context $:",t)}return{getState:function(e){void 0===t[e]&&i(e,null);var n=new o(e);return{value:t[e],onchange:n}},updateState:r,setDebugMode:function(t){e=t}}}(),o={event:n,layout:i,context:r};return e})())); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Astral=e():t.Astral=e()}(self,(()=>(()=>{"use strict";var t={d:(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{context:()=>r,default:()=>o,event:()=>n,layout:()=>i});const n=function(){const t={};let e=!1;function n(t,e){var n=t.indexOf(e);n>-1&&t.splice(n,1)}function i(t){e&&console.debug("Astral.event $:",t)}return{subscribe:function(e,n){Array.isArray(t[e])||(t[e]=[],i("Event: "+e+" subcribers list initialized")),-1===t[e].indexOf(n)&&(t[e].push(n),i("Event: "+e))},publish:function(e,n){Array.isArray(t[e])?t[e].forEach((function(t){t(n),i("Event: "+e+"\nData: "+JSON.stringify(n))})):i("Event: "+e+"\nData: "+JSON.stringify(n)+"\nAction: No subscribers found")},unsubscribe:function(e,r){if(Array.isArray(t[e])){for(var o=0;o=i.minWidth&&t.WIDTH<=i.maxWidth&&t.HEIGHT>=i.minHeight)return i}throw new Error("Astral.layout: No breakpoint found for screen size: "+t.WIDTH+"x"+t.HEIGHT)}function f(){try{return window.screen.orientation.type}catch(t){if(window.matchMedia)return window.matchMedia("(orientation: portrait)").matches?"portrait":"landscape";throw new Error("Astral.layout: No orientation found",t)}}return function(){if(window.addEventListener("resize",c),window.screen&&window.screen.orientation)window.screen.orientation.addEventListener("change",(function(){s()}));else if(window.matchMedia){const t=window.matchMedia("(orientation: portrait)");s(),t.addListener((function(){s()}))}}(),{config:function(t){if(!t||!t.breakpoints)throw new Error("Astral.layout: Invalid configuration");e=t,i=Object.keys(e.breakpoints).reduce(((t,e)=>(t[e]=e,t)),{})},getWindowSize:u,getOrientation:f,getBreakpoint:d,getBreakpointFromLabel:l,applyIf:function(t,e,i,d){if(!i||0===i.length||!t)throw new Error("Astral.layout: No conditions or callbackSuccess provided");function f(){let n=!1;for(let t=0;t=":n.WIDTH>=t.minWidth&&(o=!0);break;case"<":n.WIDTH":n.WIDTH>t.minWidth&&(o=!0);break;default:n.WIDTH>=t.minWidth&&n.WIDTH<=t.maxWidth&&n.HEIGHT>=t.minHeight&&(o=!0)}}if("function"==typeof e&&(o=e.call()),r=`Condition ${t} matched: ${o}`,a&&console.debug(`Astral.layout $: ${r}`),o&&(n=!0),n&&d&&o&&(n=!0),n&&d&&!o&&(n=!1),d&&!o){n=!1;break}if(!d&&o){n=!0;break}}var r;n?t.call():e.call()}var b;b=f,n.subscribe(r,b),c(),function(t){n.subscribe(o,t),s()}(f)},getBreakpointLabels:function(){return i},setDebugMode:function(t){a=t}}}(),r=function(){var t={},e=!1;function i(e,n){if(void 0!==t[e])throw Error("Astral.context: State already initialized");t[e]=null,a("State: "+e+"\nValue: "+n+"\nAction: Initialized"),r(e,n)}function r(e,o){if("object"!=typeof e||null===e){void 0===t[e]&&i(e,null);var c=t[e];t[e]=o,a("State: "+e+"\nValue: "+o+"\nAction: Updated"),n.publish("ASTRAL_CONTEXT_UPDATED_INTERNAL_"+e,{prevState:c,newState:t[e]})}else for(const t in e)r(t,e[t])}function o(t){return function(e){n.subscribe("ASTRAL_CONTEXT_UPDATED_INTERNAL_"+t,(function(t){e.call(null,t.prevState,t.newState)}))}}function a(t){e&&console.debug("Astral.context $:",t)}return{getState:function(e){void 0===t[e]&&i(e,null);var n=new o(e);return[t[e],n]},updateState:r,setDebugMode:function(t){e=t}}}(),o={event:n,layout:i,context:r};return e})())); //# sourceMappingURL=astral.min.js.map \ No newline at end of file diff --git a/dist/astral.min.js.map b/dist/astral.min.js.map index 538cecd..fd74f64 100644 --- a/dist/astral.min.js.map +++ b/dist/astral.min.js.map @@ -1 +1 @@ -{"version":3,"file":"astral.min.js","mappings":"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","sources":["webpack://Astral/webpack/universalModuleDefinition","webpack://Astral/webpack/bootstrap","webpack://Astral/webpack/runtime/define property getters","webpack://Astral/webpack/runtime/hasOwnProperty shorthand","webpack://Astral/webpack/runtime/make namespace object","webpack://Astral/./src/event.js","webpack://Astral/./src/layout.js","webpack://Astral/./src/context.js","webpack://Astral/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Astral\"] = factory();\n\telse\n\t\troot[\"Astral\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @namespace Astral.event\n * @desc Event handling\n * @memberof! Astral\n * @public\n * @example Astral.event.subscribe('eventName', function(data){ console.log(data) });\n * @example Astral.event.publish('eventName', {foo: 'bar'});\n * @example Astral.event.unsubscribe('eventName', callback);\n * @example Astral.event.unsubscribeAll('eventName');\n * @example Astral.event.setDebugMode(true);\n * @example Astral.event.setDebugMode(false);\n */\nexport default (function () {\n /**\n * @desc Event subscribers\n * @memberof! Astral.event\n * @private\n * @type {Object}\n * @name _eventSubscribers\n */\n\n const _eventSubscribers = {};\n\n /**\n * @desc Debug mode\n * @memberof! Astral.event\n * @private\n * @type {Boolean}\n * @name _debugMode\n * @default false\n * @example Astral.event.setDebugMode(true);\n * @example Astral.event.setDebugMode(false);\n */\n let _debugMode = false;\n\n function _removeFromArray(array, element) {\n var index = array.indexOf(element);\n if (index > -1) array.splice(index, 1);\n }\n\n // public methods\n\n /**\n * Subscribe to an event\n * @param {String} eventName Name of the event to listen to\n * @param {Function} callback Function to trigger upon event\n * @memberof! Astral.event\n * @returns {void}\n * @public\n * @example Astral.event.subscribe('eventName', function(data){ console.log(data) });\n */\n\n function subscribe(eventName, callback) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n _eventSubscribers[eventName] = [];\n _debugLog('Event: ' + eventName + ' subcribers list initialized');\n }\n if (_eventSubscribers[eventName].indexOf(callback) === -1) {\n _eventSubscribers[eventName].push(callback);\n _debugLog('Event: ' + eventName, '\\nCallback:', callback, '\\nAction: callback added (subscribed)');\n }\n }\n\n /**\n * Publish an event to trigger subscribed callbacks\n * @param {String} eventName Name of the event to publish\n * @param {Any} data Data to be passed to the event's callbacks.\n * @returns {void}\n * @memberof! Astral.event\n * @public\n * @example Astral.event.publish('eventName', {foo: 'bar'});\n * @example Astral.event.publish('eventName', 'foo');\n */\n function publish(eventName, data) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n _debugLog('Event: ' + eventName + '\\nData: ' + JSON.stringify(data) + '\\nAction: No subscribers found');\n return;\n }\n _eventSubscribers[eventName].forEach(function (callback) {\n callback(data);\n _debugLog('Event: ' + eventName + '\\nData: ' + JSON.stringify(data), '\\nCallback: ', callback, '\\nAction: callback executed');\n });\n }\n\n /**\n * Remove an event subscription\n * @param {String} eventName Event Name\n * @param {Function} callback Function to remove\n * @memberof! Astral.event\n * @returns {void}\n * @public\n * @example Astral.event.unsubscribe('eventName', callback);\n */\n function unsubscribe(eventName, callback) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n _debugLog('Event: ' + eventName + ' | No subscribers found to unsubscribe');\n return;\n }\n\n for (var i = 0; i < _eventSubscribers[eventName].length; i++) {\n if (_eventSubscribers[eventName][i] === callback) _removeFromArray(_eventSubscribers[eventName], callback);\n }\n _debugLog('Event: ' + eventName, '\\nCallback:', callback, '\\nAction: callback removed (unsubscribed)');\n }\n\n /**\n * Remove all events from a subscription\n * @param {String} eventName Event Name\n * @memberof! Astral.event\n * @returns {void}\n * @public\n * @example Astral.event.unsubscribeAll('eventName');\n */\n function unsubscribeAll(eventName) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n for (var key in _eventSubscribers) {\n _removeFromArray(_eventSubscribers[key], _eventSubscribers[key]);\n }\n _debugLog('Removed all subscriptions because no event name was given to unsubscribeAll function');\n return;\n }\n\n for (var i = 0; i < _eventSubscribers[eventName].length; i++) {\n _removeFromArray(_eventSubscribers[eventName], _eventSubscribers[eventName][i]);\n }\n _debugLog('Event: ' + eventName + '\\nAction: All callbacks removed (unsubscribed)');\n }\n\n /**\n * @desc Set debug mode\n * @memberof! Astral.event\n * @param {Boolean} debugMode\n * @returns {void}\n * @public\n * @name setDebugMode\n * @example Astral.event.setDebugMode(true);\n * @example Astral.event.setDebugMode(false);\n */\n function setDebugMode(debugMode) {\n _debugMode = debugMode;\n _debugLog('Debug mode set to: ' + debugMode);\n }\n\n /**\n * @desc Log debug messages\n * @memberof! Astral.event\n * @param {String} msg\n * @returns {void}\n * @param msg\n * @private\n * @name _debugLog\n */\n function _debugLog(msg) {\n if (_debugMode) console.debug('Astral.event $:', msg);\n }\n\n /**\n * @desc Public methods\n * @memberof! Astral.event\n * @public\n * @name publicMethods\n * @type {Object}\n * @property {Function} subscribe\n * @property {Function} publish\n * @property {Function} unsubscribe\n * @property {Function} unsubscribeAll\n * @property {Function} setDebugMode\n */\n return {\n subscribe: subscribe,\n publish: publish,\n unsubscribe: unsubscribe,\n unsubscribeAll: unsubscribeAll,\n setDebugMode: setDebugMode,\n };\n})();\n","import event from './event';\n\n/**\n * @namespace Astral.layout\n * @description Astral layout module\n * @public\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n * @memberof! Astral\n */\nexport default (function () {\n /**\n * @typedef {Object} Breakpoint\n * @property {Number} minWidth Minimum width of the breakpoint\n * @property {Number} maxWidth Maximum width of the breakpoint\n * @property {Number} minHeight Minimum height of the breakpoint\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n * @example Astral.layout.getBreakpointLabels();\n */\n\n /**\n * @typedef {Object} getBreakpointLabels\n * @property {String} extraLarge Extra large breakpoint label\n * @property {String} large Large breakpoint label\n * @property {String} medium Medium breakpoint label\n * @property {String} small Small breakpoint label\n * @property {String} extraSmall Extra small breakpoint label\n * @property {String} Other Other breakpoint label\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpointLabels();\n * @example Astral.layout.getBreakpointLabels().ExtraLarge;\n * @example Astral.layout.getBreakpointLabels().Large;\n * @example Astral.layout.getBreakpointLabels().Medium;\n * @example Astral.layout.getBreakpointLabels().Small;\n * @example Astral.layout.getBreakpointLabels().ExtraSmall;\n * @example Astral.layout.getBreakpointLabels().Other;\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n */\n\n /**\n * @typedef {Object} Config\n * @property {Breakpoints} breakpoints Breakpoints configuration\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n /**\n * @typedef {Object} WindowSize\n * @property {Number} WIDTH Width of the window\n * @property {Number} HEIGHT Height of the window\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getWindowSize();\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n */\n\n /**\n * @typedef {Object} Breakpoints\n * @property {Breakpoint} extraLarge Extra large breakpoint\n * @property {Breakpoint} large Large breakpoint\n * @property {Breakpoint} medium Medium breakpoint\n * @property {Breakpoint} small Small breakpoint\n * @property {Breakpoint} extraSmall Extra small breakpoint\n * @property {Breakpoint} Other Other breakpoint that is not matched by any defined breakpoint\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n *\n */\n /**\n * @typedef {Object} Orientation\n * @property {String} portrait Portrait orientation\n * @property {String} landscape Landscape orientation\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getOrientation();\n */\n\n /**\n * @desc Breakpoint labels\n * @memberof! Astral.layout\n * @private\n * @type {getBreakpointLabels}\n * @example Astral.layout.getBreakpointLabels();\n * @example Astral.layout.getBreakpointLabels().ExtraLarge;\n * @example Astral.layout.getBreakpointLabels().Large;\n * @example Astral.layout.getBreakpointLabels().Medium;\n * @example Astral.layout.getBreakpointLabels().Small;\n * @example Astral.layout.getBreakpointLabels().ExtraSmall;\n * @example Astral.layout.getBreakpointLabels().Other;\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n */\n const DEFAULT_BREAKPOINT_LABELS = {\n ExtraLarge: 'ExtraLarge',\n Large: 'Large',\n Medium: 'Medium',\n Small: 'Small',\n ExtraSmall: 'ExtraSmall',\n Other: 'Other',\n };\n\n /**\n * @desc Default breakpoints\n * @memberof! Astral.layout\n * @private\n * @type {Breakpoints}\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n */\n const DEFAULT_BREAKPOINTS = {\n [DEFAULT_BREAKPOINT_LABELS.ExtraLarge]: {\n minWidth: 1920,\n maxWidth: Infinity,\n minHeight: 840,\n },\n [DEFAULT_BREAKPOINT_LABELS.Large]: {\n minWidth: 1280,\n maxWidth: 1920,\n minHeight: 646,\n },\n [DEFAULT_BREAKPOINT_LABELS.Medium]: {\n minWidth: 960,\n maxWidth: 1280,\n minHeight: 380,\n },\n [DEFAULT_BREAKPOINT_LABELS.Small]: {\n minWidth: 600,\n maxWidth: 960,\n minHeight: 0,\n },\n [DEFAULT_BREAKPOINT_LABELS.ExtraSmall]: {\n minWidth: 0,\n maxWidth: 600,\n minHeight: 0,\n },\n [DEFAULT_BREAKPOINT_LABELS.Other]: {\n minWidth: 600,\n maxWidth: Infinity,\n minHeight: 0,\n },\n };\n\n /**\n * @desc Default configuration\n * @memberof! Astral.layout\n * @private\n * @type {Config}\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n const DEFAULT_CONFIG = {\n breakpoints: DEFAULT_BREAKPOINTS,\n };\n\n /**\n * @desc Configuration\n * @memberof! Astral.layout\n * @private\n * @type {Config}\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n let config = DEFAULT_CONFIG;\n\n let breakpointLabels = DEFAULT_BREAKPOINT_LABELS;\n\n /**\n * @desc Astral layout events\n * @memberof! Astral.layout\n * @private\n * @type {Object}\n * @name ASTRAL_LAYOUT_EVENTS\n * @property {String} SCREEN_RESIZE Screen resize event\n * @property {String} ORIENTATION_CHANGE Orientation change event\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n */\n const ASTRAL_LAYOUT_EVENTS = {\n SCREEN_RESIZE: 'astralInternalScreenResizeEvent',\n ORIENTATION_CHANGE: 'astralInternalOrientationChangeEvent',\n };\n\n /**\n * @desc Debug mode\n * @memberof! Astral.layout\n * @private\n * @type {Boolean}\n * @name debugMode\n * @default false\n * @example Astral.layout.setDebugMode(true);\n * @example Astral.layout.setDebugMode(false);\n */\n let debugMode = false;\n\n /** Private Functions */\n\n /**\n * @desc Subscribe to resize events on window\n * @memberof! Astral.layout\n * @private\n * @returns {void}\n */\n (function _setupResizeEvents() {\n window.addEventListener('resize', _publishResizeEvents);\n\n if (window.screen && window.screen.orientation) {\n window.screen.orientation.addEventListener('change', function () {\n _publishOrientationChangeEvents();\n });\n } else if (window.matchMedia) {\n /**\n * Handle outdated browsers, especially iOS Safari\n * The following code is outdated, and deprecated in most modern browsers\n * but is need to handle ios side of things regarding window orientation change.\n * mql = media query language\n */\n const mql = window.matchMedia('(orientation: portrait)');\n _publishOrientationChangeEvents();\n\n mql.addListener(function () {\n _publishOrientationChangeEvents();\n });\n }\n })();\n\n function _publishResizeEvents() {\n event.publish(ASTRAL_LAYOUT_EVENTS.SCREEN_RESIZE, getBreakpoint(getWindowSize()));\n }\n\n function _publishOrientationChangeEvents() {\n const orientation = getOrientation();\n event.publish(ASTRAL_LAYOUT_EVENTS.ORIENTATION_CHANGE, orientation);\n }\n\n function _resizeCallback(callback) {\n event.subscribe(ASTRAL_LAYOUT_EVENTS.SCREEN_RESIZE, callback);\n _publishResizeEvents();\n }\n\n function _orientationChangeCallback(callback) {\n event.subscribe(ASTRAL_LAYOUT_EVENTS.ORIENTATION_CHANGE, callback);\n _publishOrientationChangeEvents();\n }\n\n function _debugLog(message) {\n if (debugMode) console.debug(`Astral.layout $: ${message}`);\n }\n\n /** Public Functions */\n\n /**\n * Configure Astral layout module\n * @param {Config} newConfig New configuration\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n function configure(newConfig) {\n if (!newConfig || !newConfig.breakpoints) throw new Error('Astral.layout: Invalid configuration');\n config = newConfig;\n breakpointLabels = Object.keys(config.breakpoints).reduce((acc, key) => {\n acc[key] = key;\n return acc;\n }, {});\n }\n\n /**\n * Get window size\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getWindowSize();\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n * @returns {WindowSize} Window size\n */\n function getWindowSize() {\n return {\n WIDTH: window.innerWidth,\n HEIGHT: window.innerHeight,\n };\n }\n\n /**\n * Get breakpoint from label\n * @param {String} breakpoint Breakpoint label\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n * @returns {Breakpoint} Breakpoint\n * @throws {Error} No breakpoint found for label: \n */\n function getBreakpointFromLabel(breakpoint) {\n const match = config.breakpoints[breakpoint];\n if (match) return match;\n throw new Error('Astral.layout: No breakpoint found for label: ' + breakpoint);\n }\n\n /**\n * Get breakpoint\n * @param {WindowSize} screenSize Screen size\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n * @returns {Breakpoint} Breakpoint\n * @throws {Error} No breakpoint found for screen size\n */\n function getBreakpoint(screenSize) {\n for (const breakpoint in config.breakpoints) {\n const resObj = config.breakpoints[breakpoint];\n if (screenSize.WIDTH >= resObj.minWidth && screenSize.WIDTH <= resObj.maxWidth) {\n if (screenSize.HEIGHT >= resObj.minHeight) {\n return resObj;\n }\n }\n }\n throw new Error('Astral.layout: No breakpoint found for screen size: ' + screenSize.WIDTH + 'x' + screenSize.HEIGHT);\n }\n\n /**\n * Get orientation\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getOrientation();\n * @returns {Orientation} Orientation\n */\n function getOrientation() {\n try {\n return window.screen.orientation.type;\n } catch (e) {\n if (window.matchMedia) {\n const mql = window.matchMedia('(orientation: portrait)');\n if (mql.matches) {\n return 'portrait';\n } else {\n return 'landscape';\n }\n } else {\n throw new Error('Astral.layout: No orientation found', e);\n }\n }\n }\n\n /**\n * Apply callback if conditions are met\n * @param {Function} callbackSuccess Callback to execute if conditions are met\n * @param {Function} callbackFail Callback to execute if conditions are not met\n * @param {Array} conditions Conditions to check\n * @param {Boolean} areAllConditionsNecessary Are all conditions necessary to execute callbackSuccess\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n * @returns {void}\n * @throws {Error} No conditions or callbackSuccess provided\n * @throws {Error} No breakpoint found for screen size\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n */\n // TODO: we need to make this function more sophisticated\n function applyIf(callbackSuccess, callbackFail, conditions, areAllConditionsNecessary) {\n if (!conditions || conditions.length === 0 || !callbackSuccess)\n throw new Error('Astral.layout: No conditions or callbackSuccess provided');\n\n function _AstralJsMediaQuery() {\n let isMatched = false;\n\n for (let index = 0; index < conditions.length; index++) {\n let condition = conditions[index];\n let conditionMatched = false;\n if (typeof condition === 'object') {\n const matchedBreakpoint = getBreakpointFromLabel(condition.breakpoint);\n const windowSize = getWindowSize();\n\n switch (condition.selector) {\n case '<=':\n if (windowSize.WIDTH <= matchedBreakpoint.maxWidth) conditionMatched = true;\n break;\n\n case '>=':\n if (windowSize.WIDTH >= matchedBreakpoint.minWidth) conditionMatched = true;\n break;\n\n case '<':\n if (windowSize.WIDTH < matchedBreakpoint.maxWidth) conditionMatched = true;\n break;\n\n case '>':\n if (windowSize.WIDTH > matchedBreakpoint.minWidth) conditionMatched = true;\n break;\n\n case '=':\n default:\n if (\n windowSize.WIDTH >= matchedBreakpoint.minWidth &&\n windowSize.WIDTH <= matchedBreakpoint.maxWidth &&\n windowSize.HEIGHT >= matchedBreakpoint.minHeight\n )\n conditionMatched = true;\n break;\n }\n }\n\n if (typeof condition === 'function') {\n conditionMatched = condition.call();\n }\n\n _debugLog(`Condition ${index} matched: ${conditionMatched}`);\n\n if (conditionMatched) isMatched = true;\n\n if (isMatched && areAllConditionsNecessary && conditionMatched) {\n isMatched = true;\n }\n if (isMatched && areAllConditionsNecessary && !conditionMatched) {\n isMatched = false;\n }\n if (areAllConditionsNecessary && !conditionMatched) {\n isMatched = false;\n break;\n }\n if (!areAllConditionsNecessary && conditionMatched) {\n isMatched = true;\n break;\n }\n }\n\n if (isMatched) callbackSuccess.call();\n else callbackFail.call();\n }\n\n _resizeCallback(_AstralJsMediaQuery);\n _orientationChangeCallback(_AstralJsMediaQuery);\n }\n\n /**\n * Get breakpoint labels\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpointLabels();\n * @example Astral.layout.getBreakpointLabels().ExtraLarge;\n * @example Astral.layout.getBreakpointLabels().Large;\n * @example Astral.layout.getBreakpointLabels().Medium;\n * @example Astral.layout.getBreakpointLabels().Small;\n * @example Astral.layout.getBreakpointLabels().ExtraSmall;\n * @example Astral.layout.getBreakpointLabels().Other;\n * @returns {getBreakpointLabels} Breakpoint labels\n */\n function getBreakpointLabels() {\n return breakpointLabels;\n }\n\n /**\n * Set debug mode\n * @param {Boolean} value Debug mode\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.setDebugMode(true);\n * @returns {void}\n */\n function setDebugMode(value) {\n debugMode = value;\n }\n\n return {\n config: configure,\n getWindowSize: getWindowSize,\n getOrientation: getOrientation,\n getBreakpoint: getBreakpoint,\n getBreakpointFromLabel: getBreakpointFromLabel,\n applyIf: applyIf,\n getBreakpointLabels: getBreakpointLabels,\n setDebugMode: setDebugMode,\n };\n})();\n","import event from './event';\n\n/**\n * @desc Astral Context\n * @namespace Astral.context\n * @type {{getState: (function(*): {onchange: ((function(*): void)|*), value: *}), updateState: updateState, setDebugMode: setDebugMode}}\n * @example Astral.context.getState(\"myState\");\n * @example Astral.context.updateState(\"myState\", \"myValue\");\n * @example Astral.context.setDebugMode(true);\n * @example Astral.context.setDebugMode(false);\n * @example Astral.context.getState(\"myState\").onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @example Astral.context.getState(\"myState\").value;\n * @memberof! Astral\n * @public\n */\nexport default (function () {\n /**\n * @typedef {Object} State\n * @property {function} onchange - Callback function to trigger upon state change\n * @property {*} value - Current state value\n * @memberof! Astral.context\n * @public\n * @example Astral.context.getState(\"myState\");\n * @example Astral.context.getState(\"myState\").onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @example Astral.context.getState(\"myState\").value;\n */\n\n /**\n * @typedef {Object} StateChangeObj\n * @property {*} prevState - Previous state value\n * @property {*} newState - New state value\n * @memberof! Astral.context\n * @public\n * @example Astral.context.getState(\"myState\");\n * @example Astral.context.getState(\"myState\").onchange(function(prevState, newState) { console.log(prevState, newState) });\n */\n\n /**\n * @typedef {Object} Listener\n * @property {function} onchange - Callback function to trigger upon state change\n * @memberof! Astral.context\n * @public\n * @example Astral.context.getState(\"myState\").onchange(function(prevState, newState) { console.log(prevState, newState) });\n */\n\n /**\n * @desc Astral Context Store\n * @memberof! Astral.context\n * @private\n * @type {Object}\n * @name store\n */\n\n /**\n * @desc Debug mode\n * @memberof! Astral.context\n * @private\n * @type {Boolean}\n * @name _debugMode\n * @default false\n */\n\n // initialize store and debug mode\n var store = {},\n _debugMode = false;\n\n /**\n * @desc Initialize a state\n * @name _initState\n * @param {String} key State key\n * @param {*} val State value\n * @returns {void}\n * @private\n * @memberof! Astral.context\n */\n function _initState(key, val) {\n if (typeof store[key] !== 'undefined') throw Error('Astral.context: State already initialized');\n store[key] = null;\n _debugLog('State: ' + key + '\\nValue: ' + val + '\\nAction: Initialized');\n updateState(key, val);\n }\n\n /**\n * @desc Get a state\n * @name getState\n * @param {String} key State key\n * @public\n * @memberof! Astral.context\n * @example Astral.context.getState(\"myState\");\n * @example Astral.context.getState(\"myState\").onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @example Astral.context.getState(\"myState\").value;\n * @returns {State}\n */\n function getState(key) {\n if (typeof store[key] === 'undefined') _initState(key, null);\n var listener = new ListenerConstructor(key);\n return { value: store[key], onchange: listener };\n }\n\n /**\n * @desc Update a state\n * @name updateState\n * @returns {void}\n * @public\n * @param {String|Object} key - The key of the state to update, or an object containing key-value pairs to update multiple states.\n * @param {*} val - The value to update the state with (only applicable when key is a string).\n * @memberof! Astral.context\n * @example\n * // Update a single state\n * Astral.context.updateState(\"myState\", \"myValue\");\n *\n * // Update multiple states using an object\n * Astral.context.updateState({\n * state1: value1,\n * state2: value2,\n * });\n */\n function updateState(key, val) {\n if (typeof key === 'object' && key !== null) {\n // Update multiple states using an object\n for (const stateKey in key) {\n updateState(stateKey, key[stateKey]);\n }\n return;\n }\n\n if (typeof store[key] === 'undefined') {\n _initState(key, null);\n }\n\n var prevState = store[key];\n store[key] = val;\n\n _debugLog('State: ' + key + '\\nValue: ' + val + '\\nAction: Updated');\n event.publish('ASTRAL_CONTEXT_UPDATED_INTERNAL_' + key, {\n prevState: prevState,\n newState: store[key],\n });\n }\n\n /**\n * @desc Listener Constructor\n * @name ListenerConstructor\n * @param {String} key State key\n * @returns {function(*): void}\n * @private\n * @constructor\n * @memberof! Astral.context\n */\n function ListenerConstructor(key) {\n return function (callback) {\n event.subscribe('ASTRAL_CONTEXT_UPDATED_INTERNAL_' + key, function (stateChangeObj) {\n callback.call(null, stateChangeObj.prevState, stateChangeObj.newState);\n });\n };\n }\n\n /**\n * @desc Set debug mode\n * @name setDebugMode\n * @returns {void}\n * @public\n * @param {Boolean} mode\n * @memberof! Astral.context\n * @example Astral.context.setDebugMode(true);\n * @example Astral.context.setDebugMode(false);\n */\n function setDebugMode(mode) {\n _debugMode = mode;\n }\n\n /**\n * @desc Debug log\n * @name _debugLog\n * @returns {void}\n * @param {String} msg\n * @private\n * @memberof! Astral.context\n */\n function _debugLog(msg) {\n if (_debugMode) console.debug('Astral.context $:', msg);\n }\n\n /**\n * public methods\n * @memberof! Astral.context\n * @public\n * @type {Object}\n * @name context\n * @property {function} getState - Get a state\n * @property {function} updateState - Update a state\n * @property {function} setDebugMode - Set debug mode\n * @example Astral.context.getState(\"myState\");\n * @example Astral.context.updateState(\"myState\", \"myValue\");\n * @example Astral.context.setDebugMode(true);\n * @example Astral.context.setDebugMode(false);\n * @example Astral.context.getState(\"myState\").onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @example Astral.context.getState(\"myState\").value;\n */\n\n return {\n getState: getState,\n updateState: updateState,\n setDebugMode: setDebugMode,\n };\n})();\n","import event from './event';\nimport layout from './layout';\nimport context from './context';\n\n/**\n * @desc Astral namespace\n * @namespace Astral\n */\nconst Astral = { event, layout, context };\n\nexport { event, layout, context };\n\nexport default Astral;\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","_eventSubscribers","_debugMode","_removeFromArray","array","element","index","indexOf","splice","_debugLog","msg","console","debug","subscribe","eventName","callback","Array","isArray","push","publish","data","forEach","JSON","stringify","unsubscribe","i","length","unsubscribeAll","setDebugMode","debugMode","DEFAULT_BREAKPOINT_LABELS","ExtraLarge","Large","Medium","Small","ExtraSmall","Other","config","breakpoints","minWidth","maxWidth","Infinity","minHeight","breakpointLabels","ASTRAL_LAYOUT_EVENTS","_publishResizeEvents","getBreakpoint","getWindowSize","_publishOrientationChangeEvents","orientation","getOrientation","WIDTH","window","innerWidth","HEIGHT","innerHeight","getBreakpointFromLabel","breakpoint","match","Error","screenSize","resObj","screen","type","e","matchMedia","matches","addEventListener","mql","addListener","newConfig","keys","reduce","acc","applyIf","callbackSuccess","callbackFail","conditions","areAllConditionsNecessary","_AstralJsMediaQuery","isMatched","condition","conditionMatched","matchedBreakpoint","windowSize","selector","message","_orientationChangeCallback","getBreakpointLabels","store","_initState","val","updateState","prevState","newState","stateKey","ListenerConstructor","stateChangeObj","getState","listener","onchange","mode","event"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"astral.min.js","mappings":"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","sources":["webpack://Astral/webpack/universalModuleDefinition","webpack://Astral/webpack/bootstrap","webpack://Astral/webpack/runtime/define property getters","webpack://Astral/webpack/runtime/hasOwnProperty shorthand","webpack://Astral/webpack/runtime/make namespace object","webpack://Astral/./src/event.js","webpack://Astral/./src/layout.js","webpack://Astral/./src/context.js","webpack://Astral/./src/index.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Astral\"] = factory();\n\telse\n\t\troot[\"Astral\"] = factory();\n})(self, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * @namespace Astral.event\n * @desc Event handling\n * @memberof! Astral\n * @public\n * @example Astral.event.subscribe('eventName', function(data){ console.log(data) });\n * @example Astral.event.publish('eventName', {foo: 'bar'});\n * @example Astral.event.unsubscribe('eventName', callback);\n * @example Astral.event.unsubscribeAll('eventName');\n * @example Astral.event.setDebugMode(true);\n * @example Astral.event.setDebugMode(false);\n */\nexport default (function () {\n /**\n * @desc Event subscribers\n * @memberof! Astral.event\n * @private\n * @type {Object}\n * @name _eventSubscribers\n */\n\n const _eventSubscribers = {};\n\n /**\n * @desc Debug mode\n * @memberof! Astral.event\n * @private\n * @type {Boolean}\n * @name _debugMode\n * @default false\n * @example Astral.event.setDebugMode(true);\n * @example Astral.event.setDebugMode(false);\n */\n let _debugMode = false;\n\n function _removeFromArray(array, element) {\n var index = array.indexOf(element);\n if (index > -1) array.splice(index, 1);\n }\n\n // public methods\n\n /**\n * Subscribe to an event\n * @param {String} eventName Name of the event to listen to\n * @param {Function} callback Function to trigger upon event\n * @memberof! Astral.event\n * @returns {void}\n * @public\n * @example Astral.event.subscribe('eventName', function(data){ console.log(data) });\n */\n\n function subscribe(eventName, callback) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n _eventSubscribers[eventName] = [];\n _debugLog('Event: ' + eventName + ' subcribers list initialized');\n }\n if (_eventSubscribers[eventName].indexOf(callback) === -1) {\n _eventSubscribers[eventName].push(callback);\n _debugLog('Event: ' + eventName, '\\nCallback:', callback, '\\nAction: callback added (subscribed)');\n }\n }\n\n /**\n * Publish an event to trigger subscribed callbacks\n * @param {String} eventName Name of the event to publish\n * @param {Any} data Data to be passed to the event's callbacks.\n * @returns {void}\n * @memberof! Astral.event\n * @public\n * @example Astral.event.publish('eventName', {foo: 'bar'});\n * @example Astral.event.publish('eventName', 'foo');\n */\n function publish(eventName, data) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n _debugLog('Event: ' + eventName + '\\nData: ' + JSON.stringify(data) + '\\nAction: No subscribers found');\n return;\n }\n _eventSubscribers[eventName].forEach(function (callback) {\n callback(data);\n _debugLog('Event: ' + eventName + '\\nData: ' + JSON.stringify(data), '\\nCallback: ', callback, '\\nAction: callback executed');\n });\n }\n\n /**\n * Remove an event subscription\n * @param {String} eventName Event Name\n * @param {Function} callback Function to remove\n * @memberof! Astral.event\n * @returns {void}\n * @public\n * @example Astral.event.unsubscribe('eventName', callback);\n */\n function unsubscribe(eventName, callback) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n _debugLog('Event: ' + eventName + ' | No subscribers found to unsubscribe');\n return;\n }\n\n for (var i = 0; i < _eventSubscribers[eventName].length; i++) {\n if (_eventSubscribers[eventName][i] === callback) _removeFromArray(_eventSubscribers[eventName], callback);\n }\n _debugLog('Event: ' + eventName, '\\nCallback:', callback, '\\nAction: callback removed (unsubscribed)');\n }\n\n /**\n * Remove all events from a subscription\n * @param {String} eventName Event Name\n * @memberof! Astral.event\n * @returns {void}\n * @public\n * @example Astral.event.unsubscribeAll('eventName');\n */\n function unsubscribeAll(eventName) {\n if (!Array.isArray(_eventSubscribers[eventName])) {\n for (var key in _eventSubscribers) {\n _removeFromArray(_eventSubscribers[key], _eventSubscribers[key]);\n }\n _debugLog('Removed all subscriptions because no event name was given to unsubscribeAll function');\n return;\n }\n\n for (var i = 0; i < _eventSubscribers[eventName].length; i++) {\n _removeFromArray(_eventSubscribers[eventName], _eventSubscribers[eventName][i]);\n }\n _debugLog('Event: ' + eventName + '\\nAction: All callbacks removed (unsubscribed)');\n }\n\n /**\n * @desc Set debug mode\n * @memberof! Astral.event\n * @param {Boolean} debugMode\n * @returns {void}\n * @public\n * @name setDebugMode\n * @example Astral.event.setDebugMode(true);\n * @example Astral.event.setDebugMode(false);\n */\n function setDebugMode(debugMode) {\n _debugMode = debugMode;\n _debugLog('Debug mode set to: ' + debugMode);\n }\n\n /**\n * @desc Log debug messages\n * @memberof! Astral.event\n * @param {String} msg\n * @returns {void}\n * @param msg\n * @private\n * @name _debugLog\n */\n function _debugLog(msg) {\n if (_debugMode) console.debug('Astral.event $:', msg);\n }\n\n /**\n * @desc Public methods\n * @memberof! Astral.event\n * @public\n * @name publicMethods\n * @type {Object}\n * @property {Function} subscribe\n * @property {Function} publish\n * @property {Function} unsubscribe\n * @property {Function} unsubscribeAll\n * @property {Function} setDebugMode\n */\n return {\n subscribe: subscribe,\n publish: publish,\n unsubscribe: unsubscribe,\n unsubscribeAll: unsubscribeAll,\n setDebugMode: setDebugMode,\n };\n})();\n","import event from './event';\n\n/**\n * @namespace Astral.layout\n * @description Astral layout module\n * @public\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n * @memberof! Astral\n */\nexport default (function () {\n /**\n * @typedef {Object} Breakpoint\n * @property {Number} minWidth Minimum width of the breakpoint\n * @property {Number} maxWidth Maximum width of the breakpoint\n * @property {Number} minHeight Minimum height of the breakpoint\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n * @example Astral.layout.getBreakpointLabels();\n */\n\n /**\n * @typedef {Object} getBreakpointLabels\n * @property {String} extraLarge Extra large breakpoint label\n * @property {String} large Large breakpoint label\n * @property {String} medium Medium breakpoint label\n * @property {String} small Small breakpoint label\n * @property {String} extraSmall Extra small breakpoint label\n * @property {String} Other Other breakpoint label\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpointLabels();\n * @example Astral.layout.getBreakpointLabels().ExtraLarge;\n * @example Astral.layout.getBreakpointLabels().Large;\n * @example Astral.layout.getBreakpointLabels().Medium;\n * @example Astral.layout.getBreakpointLabels().Small;\n * @example Astral.layout.getBreakpointLabels().ExtraSmall;\n * @example Astral.layout.getBreakpointLabels().Other;\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n */\n\n /**\n * @typedef {Object} Config\n * @property {Breakpoints} breakpoints Breakpoints configuration\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n /**\n * @typedef {Object} WindowSize\n * @property {Number} WIDTH Width of the window\n * @property {Number} HEIGHT Height of the window\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getWindowSize();\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n */\n\n /**\n * @typedef {Object} Breakpoints\n * @property {Breakpoint} extraLarge Extra large breakpoint\n * @property {Breakpoint} large Large breakpoint\n * @property {Breakpoint} medium Medium breakpoint\n * @property {Breakpoint} small Small breakpoint\n * @property {Breakpoint} extraSmall Extra small breakpoint\n * @property {Breakpoint} Other Other breakpoint that is not matched by any defined breakpoint\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n *\n */\n /**\n * @typedef {Object} Orientation\n * @property {String} portrait Portrait orientation\n * @property {String} landscape Landscape orientation\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getOrientation();\n */\n\n /**\n * @desc Breakpoint labels\n * @memberof! Astral.layout\n * @private\n * @type {getBreakpointLabels}\n * @example Astral.layout.getBreakpointLabels();\n * @example Astral.layout.getBreakpointLabels().ExtraLarge;\n * @example Astral.layout.getBreakpointLabels().Large;\n * @example Astral.layout.getBreakpointLabels().Medium;\n * @example Astral.layout.getBreakpointLabels().Small;\n * @example Astral.layout.getBreakpointLabels().ExtraSmall;\n * @example Astral.layout.getBreakpointLabels().Other;\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n */\n const DEFAULT_BREAKPOINT_LABELS = {\n ExtraLarge: 'ExtraLarge',\n Large: 'Large',\n Medium: 'Medium',\n Small: 'Small',\n ExtraSmall: 'ExtraSmall',\n Other: 'Other',\n };\n\n /**\n * @desc Default breakpoints\n * @memberof! Astral.layout\n * @private\n * @type {Breakpoints}\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n */\n const DEFAULT_BREAKPOINTS = {\n [DEFAULT_BREAKPOINT_LABELS.ExtraLarge]: {\n minWidth: 1920,\n maxWidth: Infinity,\n minHeight: 840,\n },\n [DEFAULT_BREAKPOINT_LABELS.Large]: {\n minWidth: 1280,\n maxWidth: 1920,\n minHeight: 646,\n },\n [DEFAULT_BREAKPOINT_LABELS.Medium]: {\n minWidth: 960,\n maxWidth: 1280,\n minHeight: 380,\n },\n [DEFAULT_BREAKPOINT_LABELS.Small]: {\n minWidth: 600,\n maxWidth: 960,\n minHeight: 0,\n },\n [DEFAULT_BREAKPOINT_LABELS.ExtraSmall]: {\n minWidth: 0,\n maxWidth: 600,\n minHeight: 0,\n },\n [DEFAULT_BREAKPOINT_LABELS.Other]: {\n minWidth: 600,\n maxWidth: Infinity,\n minHeight: 0,\n },\n };\n\n /**\n * @desc Default configuration\n * @memberof! Astral.layout\n * @private\n * @type {Config}\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n const DEFAULT_CONFIG = {\n breakpoints: DEFAULT_BREAKPOINTS,\n };\n\n /**\n * @desc Configuration\n * @memberof! Astral.layout\n * @private\n * @type {Config}\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n let config = DEFAULT_CONFIG;\n\n let breakpointLabels = DEFAULT_BREAKPOINT_LABELS;\n\n /**\n * @desc Astral layout events\n * @memberof! Astral.layout\n * @private\n * @type {Object}\n * @name ASTRAL_LAYOUT_EVENTS\n * @property {String} SCREEN_RESIZE Screen resize event\n * @property {String} ORIENTATION_CHANGE Orientation change event\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n */\n const ASTRAL_LAYOUT_EVENTS = {\n SCREEN_RESIZE: 'astralInternalScreenResizeEvent',\n ORIENTATION_CHANGE: 'astralInternalOrientationChangeEvent',\n };\n\n /**\n * @desc Debug mode\n * @memberof! Astral.layout\n * @private\n * @type {Boolean}\n * @name debugMode\n * @default false\n * @example Astral.layout.setDebugMode(true);\n * @example Astral.layout.setDebugMode(false);\n */\n let debugMode = false;\n\n /** Private Functions */\n\n /**\n * @desc Subscribe to resize events on window\n * @memberof! Astral.layout\n * @private\n * @returns {void}\n */\n (function _setupResizeEvents() {\n window.addEventListener('resize', _publishResizeEvents);\n\n if (window.screen && window.screen.orientation) {\n window.screen.orientation.addEventListener('change', function () {\n _publishOrientationChangeEvents();\n });\n } else if (window.matchMedia) {\n /**\n * Handle outdated browsers, especially iOS Safari\n * The following code is outdated, and deprecated in most modern browsers\n * but is need to handle ios side of things regarding window orientation change.\n * mql = media query language\n */\n const mql = window.matchMedia('(orientation: portrait)');\n _publishOrientationChangeEvents();\n\n mql.addListener(function () {\n _publishOrientationChangeEvents();\n });\n }\n })();\n\n function _publishResizeEvents() {\n event.publish(ASTRAL_LAYOUT_EVENTS.SCREEN_RESIZE, getBreakpoint(getWindowSize()));\n }\n\n function _publishOrientationChangeEvents() {\n const orientation = getOrientation();\n event.publish(ASTRAL_LAYOUT_EVENTS.ORIENTATION_CHANGE, orientation);\n }\n\n function _resizeCallback(callback) {\n event.subscribe(ASTRAL_LAYOUT_EVENTS.SCREEN_RESIZE, callback);\n _publishResizeEvents();\n }\n\n function _orientationChangeCallback(callback) {\n event.subscribe(ASTRAL_LAYOUT_EVENTS.ORIENTATION_CHANGE, callback);\n _publishOrientationChangeEvents();\n }\n\n function _debugLog(message) {\n if (debugMode) console.debug(`Astral.layout $: ${message}`);\n }\n\n /** Public Functions */\n\n /**\n * Configure Astral layout module\n * @param {Config} newConfig New configuration\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.config({ breakpoints: { extraLarge: { minWidth: 1920, maxWidth: Infinity, minHeight: 840, }, large: { minWidth: 1280, maxWidth: 1920, minHeight: 646, }, medium: { minWidth: 960, maxWidth: 1280, minHeight: 380, }, small: { minWidth: 600, maxWidth: 960, minHeight: 0, }, extraSmall: { minWidth: 0, maxWidth: 600, minHeight: 0, }, Other: { minWidth: 600, maxWidth: Infinity, minHeight: 0, }, } });\n */\n function configure(newConfig) {\n if (!newConfig || !newConfig.breakpoints) throw new Error('Astral.layout: Invalid configuration');\n config = newConfig;\n breakpointLabels = Object.keys(config.breakpoints).reduce((acc, key) => {\n acc[key] = key;\n return acc;\n }, {});\n }\n\n /**\n * Get window size\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getWindowSize();\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n * @returns {WindowSize} Window size\n */\n function getWindowSize() {\n return {\n WIDTH: window.innerWidth,\n HEIGHT: window.innerHeight,\n };\n }\n\n /**\n * Get breakpoint from label\n * @param {String} breakpoint Breakpoint label\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpointFromLabel(Astral.layout.getBreakpointLabels().ExtraLarge);\n * @returns {Breakpoint} Breakpoint\n * @throws {Error} No breakpoint found for label: \n */\n function getBreakpointFromLabel(breakpoint) {\n const match = config.breakpoints[breakpoint];\n if (match) return match;\n throw new Error('Astral.layout: No breakpoint found for label: ' + breakpoint);\n }\n\n /**\n * Get breakpoint\n * @param {WindowSize} screenSize Screen size\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpoint(Astral.layout.getWindowSize());\n * @returns {Breakpoint} Breakpoint\n * @throws {Error} No breakpoint found for screen size\n */\n function getBreakpoint(screenSize) {\n for (const breakpoint in config.breakpoints) {\n const resObj = config.breakpoints[breakpoint];\n if (screenSize.WIDTH >= resObj.minWidth && screenSize.WIDTH <= resObj.maxWidth) {\n if (screenSize.HEIGHT >= resObj.minHeight) {\n return resObj;\n }\n }\n }\n throw new Error('Astral.layout: No breakpoint found for screen size: ' + screenSize.WIDTH + 'x' + screenSize.HEIGHT);\n }\n\n /**\n * Get orientation\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getOrientation();\n * @returns {Orientation} Orientation\n */\n function getOrientation() {\n try {\n return window.screen.orientation.type;\n } catch (e) {\n if (window.matchMedia) {\n const mql = window.matchMedia('(orientation: portrait)');\n if (mql.matches) {\n return 'portrait';\n } else {\n return 'landscape';\n }\n } else {\n throw new Error('Astral.layout: No orientation found', e);\n }\n }\n }\n\n /**\n * Apply callback if conditions are met\n * @param {Function} callbackSuccess Callback to execute if conditions are met\n * @param {Function} callbackFail Callback to execute if conditions are not met\n * @param {Array} conditions Conditions to check\n * @param {Boolean} areAllConditionsNecessary Are all conditions necessary to execute callbackSuccess\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n * @returns {void}\n * @throws {Error} No conditions or callbackSuccess provided\n * @throws {Error} No breakpoint found for screen size\n * @example Astral.layout.applyIf(successCallback, failCallback, [ {breakpoint: Astral.layout.getBreakpointLabels().ExtraLarge, selector: \"<=\"}, {breakpoint: Astral.layout.getBreakpointLabels().Large, selector: \">=\"} ], true);\n */\n // TODO: we need to make this function more sophisticated\n function applyIf(callbackSuccess, callbackFail, conditions, areAllConditionsNecessary) {\n if (!conditions || conditions.length === 0 || !callbackSuccess)\n throw new Error('Astral.layout: No conditions or callbackSuccess provided');\n\n function _AstralJsMediaQuery() {\n let isMatched = false;\n\n for (let index = 0; index < conditions.length; index++) {\n let condition = conditions[index];\n let conditionMatched = false;\n if (typeof condition === 'object') {\n const matchedBreakpoint = getBreakpointFromLabel(condition.breakpoint);\n const windowSize = getWindowSize();\n\n switch (condition.selector) {\n case '<=':\n if (windowSize.WIDTH <= matchedBreakpoint.maxWidth) conditionMatched = true;\n break;\n\n case '>=':\n if (windowSize.WIDTH >= matchedBreakpoint.minWidth) conditionMatched = true;\n break;\n\n case '<':\n if (windowSize.WIDTH < matchedBreakpoint.maxWidth) conditionMatched = true;\n break;\n\n case '>':\n if (windowSize.WIDTH > matchedBreakpoint.minWidth) conditionMatched = true;\n break;\n\n case '=':\n default:\n if (\n windowSize.WIDTH >= matchedBreakpoint.minWidth &&\n windowSize.WIDTH <= matchedBreakpoint.maxWidth &&\n windowSize.HEIGHT >= matchedBreakpoint.minHeight\n )\n conditionMatched = true;\n break;\n }\n }\n\n if (typeof condition === 'function') {\n conditionMatched = condition.call();\n }\n\n _debugLog(`Condition ${index} matched: ${conditionMatched}`);\n\n if (conditionMatched) isMatched = true;\n\n if (isMatched && areAllConditionsNecessary && conditionMatched) {\n isMatched = true;\n }\n if (isMatched && areAllConditionsNecessary && !conditionMatched) {\n isMatched = false;\n }\n if (areAllConditionsNecessary && !conditionMatched) {\n isMatched = false;\n break;\n }\n if (!areAllConditionsNecessary && conditionMatched) {\n isMatched = true;\n break;\n }\n }\n\n if (isMatched) callbackSuccess.call();\n else callbackFail.call();\n }\n\n _resizeCallback(_AstralJsMediaQuery);\n _orientationChangeCallback(_AstralJsMediaQuery);\n }\n\n /**\n * Get breakpoint labels\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.getBreakpointLabels();\n * @example Astral.layout.getBreakpointLabels().ExtraLarge;\n * @example Astral.layout.getBreakpointLabels().Large;\n * @example Astral.layout.getBreakpointLabels().Medium;\n * @example Astral.layout.getBreakpointLabels().Small;\n * @example Astral.layout.getBreakpointLabels().ExtraSmall;\n * @example Astral.layout.getBreakpointLabels().Other;\n * @returns {getBreakpointLabels} Breakpoint labels\n */\n function getBreakpointLabels() {\n return breakpointLabels;\n }\n\n /**\n * Set debug mode\n * @param {Boolean} value Debug mode\n * @memberof! Astral.layout\n * @public\n * @example Astral.layout.setDebugMode(true);\n * @returns {void}\n */\n function setDebugMode(value) {\n debugMode = value;\n }\n\n return {\n config: configure,\n getWindowSize: getWindowSize,\n getOrientation: getOrientation,\n getBreakpoint: getBreakpoint,\n getBreakpointFromLabel: getBreakpointFromLabel,\n applyIf: applyIf,\n getBreakpointLabels: getBreakpointLabels,\n setDebugMode: setDebugMode,\n };\n})();\n","import event from './event';\n\n/**\n * @desc Astral Context\n * @namespace Astral.context\n * @type {{getState: (function(*): {onchange: ((function(*): void)|*), value: *}), updateState: updateState, setDebugMode: setDebugMode}}\n * @example Astral.context.getState(\"myState\");\n * @example Astral.context.updateState(\"myState\", \"myValue\");\n * @example Astral.context.setDebugMode(true);\n * @example Astral.context.setDebugMode(false);\n * @example\n * var [value, onchange] = Astral.context.getState(\"myState\");\n * onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @memberof! Astral\n * @public\n */\nexport default (function () {\n /**\n * @typedef {Array} State\n * @property {function} onchange - Callback function to trigger upon state change\n * @property {*} value - Current state value\n * @memberof! Astral.context\n * @public\n * @example\n * var [value, onchange] = Astral.context.getState(\"myState\");\n * onchange(function(prevState, newState) { console.log(prevState, newState) });\n */\n\n /**\n * @typedef {Object} StateChangeObj\n * @property {*} prevState - Previous state value\n * @property {*} newState - New state value\n * @memberof! Astral.context\n * @public\n * @example\n * var [value, onchange] = Astral.context.getState(\"myState\");\n * onchange(function(prevState, newState) { console.log(prevState, newState) });\n */\n\n /**\n * @typedef {Object} Listener\n * @property {function} onchange - Callback function to trigger upon state change\n * @memberof! Astral.context\n * @public\n * @example\n * var [value, onchange] = Astral.context.getState(\"myState\");\n * onchange(function(prevState, newState) { console.log(prevState, newState) });\n */\n\n /**\n * @desc Astral Context Store\n * @memberof! Astral.context\n * @private\n * @type {Object}\n * @name store\n */\n\n // initialize store and debug mode\n var store = {},\n /**\n * @desc Debug mode\n * @memberof! Astral.context\n * @private\n * @type {Boolean}\n * @name _debugMode\n * @default false\n */\n _debugMode = false;\n\n /**\n * @desc Initialize a state\n * @name _initState\n * @param {String} key State key\n * @param {*} val State value\n * @returns {void}\n * @private\n * @memberof! Astral.context\n */\n function _initState(key, val) {\n if (typeof store[key] !== 'undefined') throw Error('Astral.context: State already initialized');\n store[key] = null;\n _debugLog('State: ' + key + '\\nValue: ' + val + '\\nAction: Initialized');\n updateState(key, val);\n }\n\n /**\n * @desc Get a state\n * @name getState\n * @param {String} key State key\n * @public\n * @memberof! Astral.context\n * @example\n * var [value, onchange] = Astral.context.getState(\"myState\");\n * onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @returns {State}\n */\n function getState(key) {\n if (typeof store[key] === 'undefined') _initState(key, null);\n var listener = new ListenerConstructor(key);\n return [store[key], listener];\n }\n\n /**\n * @desc Update a state\n * @name updateState\n * @returns {void}\n * @public\n * @param {String|Object} key - The key of the state to update, or an object containing key-value pairs to update multiple states.\n * @param {*} val - The value to update the state with (only applicable when key is a string).\n * @memberof! Astral.context\n * @example\n * // Update a single state\n * Astral.context.updateState(\"myState\", \"myValue\");\n *\n * // Update multiple states using an object\n * Astral.context.updateState({\n * state1: value1,\n * state2: value2,\n * });\n */\n function updateState(key, val) {\n if (typeof key === 'object' && key !== null) {\n // Update multiple states using an object\n for (const stateKey in key) {\n updateState(stateKey, key[stateKey]);\n }\n return;\n }\n\n if (typeof store[key] === 'undefined') {\n _initState(key, null);\n }\n\n var prevState = store[key];\n store[key] = val;\n\n _debugLog('State: ' + key + '\\nValue: ' + val + '\\nAction: Updated');\n event.publish('ASTRAL_CONTEXT_UPDATED_INTERNAL_' + key, {\n prevState: prevState,\n newState: store[key],\n });\n }\n\n /**\n * @desc Listener Constructor\n * @name ListenerConstructor\n * @param {String} key State key\n * @returns {function(*): void}\n * @private\n * @constructor\n * @memberof! Astral.context\n */\n function ListenerConstructor(key) {\n return function (callback) {\n event.subscribe('ASTRAL_CONTEXT_UPDATED_INTERNAL_' + key, function (stateChangeObj) {\n callback.call(null, stateChangeObj.prevState, stateChangeObj.newState);\n });\n };\n }\n\n /**\n * @desc Set debug mode\n * @name setDebugMode\n * @returns {void}\n * @public\n * @param {Boolean} mode\n * @memberof! Astral.context\n * @example Astral.context.setDebugMode(true);\n * @example Astral.context.setDebugMode(false);\n */\n function setDebugMode(mode) {\n _debugMode = mode;\n }\n\n /**\n * @desc Debug log\n * @name _debugLog\n * @returns {void}\n * @param {String} msg\n * @private\n * @memberof! Astral.context\n */\n function _debugLog(msg) {\n if (_debugMode) console.debug('Astral.context $:', msg);\n }\n\n /**\n * public methods\n * @memberof! Astral.context\n * @public\n * @type {Object}\n * @name context\n * @property {function} getState - Get a state\n * @property {function} updateState - Update a state\n * @property {function} setDebugMode - Set debug mode\n * @example\n * var [value, onchange] = Astral.context.getState(\"myState\");\n * onchange(function(prevState, newState) { console.log(prevState, newState) });\n * @example Astral.context.updateState(\"myState\", \"myValue\");\n * @example Astral.context.setDebugMode(true);\n * @example Astral.context.setDebugMode(false);\n */\n\n return {\n getState: getState,\n updateState: updateState,\n setDebugMode: setDebugMode,\n };\n})();\n","import event from './event';\nimport layout from './layout';\nimport context from './context';\n\n/**\n * @desc Astral namespace\n * @namespace Astral\n */\nconst Astral = { event, layout, context };\n\nexport { event, layout, context };\n\nexport default Astral;\n"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","_eventSubscribers","_debugMode","_removeFromArray","array","element","index","indexOf","splice","_debugLog","msg","console","debug","subscribe","eventName","callback","Array","isArray","push","publish","data","forEach","JSON","stringify","unsubscribe","i","length","unsubscribeAll","setDebugMode","debugMode","DEFAULT_BREAKPOINT_LABELS","ExtraLarge","Large","Medium","Small","ExtraSmall","Other","config","breakpoints","minWidth","maxWidth","Infinity","minHeight","breakpointLabels","ASTRAL_LAYOUT_EVENTS","_publishResizeEvents","getBreakpoint","getWindowSize","_publishOrientationChangeEvents","orientation","getOrientation","WIDTH","window","innerWidth","HEIGHT","innerHeight","getBreakpointFromLabel","breakpoint","match","Error","screenSize","resObj","screen","type","e","matchMedia","matches","addEventListener","mql","addListener","newConfig","keys","reduce","acc","applyIf","callbackSuccess","callbackFail","conditions","areAllConditionsNecessary","_AstralJsMediaQuery","isMatched","condition","conditionMatched","matchedBreakpoint","windowSize","selector","message","_orientationChangeCallback","getBreakpointLabels","store","_initState","val","updateState","prevState","newState","stateKey","ListenerConstructor","stateChangeObj","getState","listener","mode","event"],"sourceRoot":""} \ No newline at end of file diff --git a/specs/context.spec.js b/specs/context.spec.js index bab5d97..48081bd 100644 --- a/specs/context.spec.js +++ b/specs/context.spec.js @@ -8,9 +8,9 @@ describe('ContextService', () => { it('getState should initialize and return the state', () => { const stateKey = 'myState'; - const state = ContextService.getState(stateKey); + const [stateValue] = ContextService.getState(stateKey); - expect(state.value).toBeNull(); + expect(stateValue).toBeNull(); }); it('getState should return the existing state', () => { @@ -20,9 +20,9 @@ describe('ContextService', () => { // Initialize the state ContextService.updateState(stateKey, stateValue); - const state = ContextService.getState(stateKey); + const [state] = ContextService.getState(stateKey); - expect(state.value).toBe(stateValue); + expect(state).toBe(stateValue); }); it('getState should trigger onchange callback upon state change', () => { @@ -31,8 +31,8 @@ describe('ContextService', () => { const onChangeCallback = jest.fn(); - const state = ContextService.getState(stateKey); - state.onchange(onChangeCallback); + const [_, onStateChange] = ContextService.getState(stateKey); + onStateChange(onChangeCallback); // Update the state value ContextService.updateState(stateKey, stateValue); @@ -51,8 +51,8 @@ describe('ContextService', () => { const onChangeCallback = jest.fn(); - const state = ContextService.getState(stateKey); - state.onchange(onChangeCallback); + const [_, onStateChange] = ContextService.getState(stateKey); + onStateChange(onChangeCallback); // Update the state value ContextService.updateState(stateKey, newState); @@ -73,10 +73,10 @@ describe('ContextService', () => { [stateKey2]: stateValue2, }); - const state1 = ContextService.getState(stateKey1); - const state2 = ContextService.getState(stateKey2); + const [state1value] = ContextService.getState(stateKey1); + const [state2value] = ContextService.getState(stateKey2); - expect(state1.value).toBe(stateValue1); - expect(state2.value).toBe(stateValue2); + expect(state1value).toBe(stateValue1); + expect(state2value).toBe(stateValue2); }); }); diff --git a/src/context.js b/src/context.js index c291680..fdc45e6 100644 --- a/src/context.js +++ b/src/context.js @@ -8,21 +8,22 @@ import event from './event'; * @example Astral.context.updateState("myState", "myValue"); * @example Astral.context.setDebugMode(true); * @example Astral.context.setDebugMode(false); - * @example Astral.context.getState("myState").onchange(function(prevState, newState) { console.log(prevState, newState) }); - * @example Astral.context.getState("myState").value; + * @example + * var [value, onchange] = Astral.context.getState("myState"); + * onchange(function(prevState, newState) { console.log(prevState, newState) }); * @memberof! Astral * @public */ export default (function () { /** - * @typedef {Object} State + * @typedef {Array} State * @property {function} onchange - Callback function to trigger upon state change * @property {*} value - Current state value * @memberof! Astral.context * @public - * @example Astral.context.getState("myState"); - * @example Astral.context.getState("myState").onchange(function(prevState, newState) { console.log(prevState, newState) }); - * @example Astral.context.getState("myState").value; + * @example + * var [value, onchange] = Astral.context.getState("myState"); + * onchange(function(prevState, newState) { console.log(prevState, newState) }); */ /** @@ -31,8 +32,9 @@ export default (function () { * @property {*} newState - New state value * @memberof! Astral.context * @public - * @example Astral.context.getState("myState"); - * @example Astral.context.getState("myState").onchange(function(prevState, newState) { console.log(prevState, newState) }); + * @example + * var [value, onchange] = Astral.context.getState("myState"); + * onchange(function(prevState, newState) { console.log(prevState, newState) }); */ /** @@ -40,7 +42,9 @@ export default (function () { * @property {function} onchange - Callback function to trigger upon state change * @memberof! Astral.context * @public - * @example Astral.context.getState("myState").onchange(function(prevState, newState) { console.log(prevState, newState) }); + * @example + * var [value, onchange] = Astral.context.getState("myState"); + * onchange(function(prevState, newState) { console.log(prevState, newState) }); */ /** @@ -51,17 +55,16 @@ export default (function () { * @name store */ - /** - * @desc Debug mode - * @memberof! Astral.context - * @private - * @type {Boolean} - * @name _debugMode - * @default false - */ - // initialize store and debug mode var store = {}, + /** + * @desc Debug mode + * @memberof! Astral.context + * @private + * @type {Boolean} + * @name _debugMode + * @default false + */ _debugMode = false; /** @@ -86,9 +89,9 @@ export default (function () { * @param {String} key State key * @public * @memberof! Astral.context - * @example Astral.context.getState("myState"); - * @example Astral.context.getState("myState").onchange(function(prevState, newState) { console.log(prevState, newState) }); - * @example Astral.context.getState("myState").value; + * @example + * var [value, onchange] = Astral.context.getState("myState"); + * onchange(function(prevState, newState) { console.log(prevState, newState) }); * @returns {State} */ function getState(key) { @@ -190,12 +193,12 @@ export default (function () { * @property {function} getState - Get a state * @property {function} updateState - Update a state * @property {function} setDebugMode - Set debug mode - * @example Astral.context.getState("myState"); + * @example + * var [value, onchange] = Astral.context.getState("myState"); + * onchange(function(prevState, newState) { console.log(prevState, newState) }); * @example Astral.context.updateState("myState", "myValue"); * @example Astral.context.setDebugMode(true); * @example Astral.context.setDebugMode(false); - * @example Astral.context.getState("myState").onchange(function(prevState, newState) { console.log(prevState, newState) }); - * @example Astral.context.getState("myState").value; */ return {