@agile-ts/core
Advanced tools
Comparing version 0.0.9 to 0.0.10
# Change Log | ||
## 0.0.10 | ||
### Patch Changes | ||
- 9a09652: fixted some bugs | ||
## 0.0.9 | ||
@@ -4,0 +10,0 @@ |
@@ -1,2 +0,2 @@ | ||
import { Runtime, Integration, State, Storage, Collection, DefaultItem, Computed, Event, CreateEventConfigInterface, DefaultEventPayload, Integrations, Observer, SubController, Storages, CreateStorageConfigInterface, RegisterConfigInterface, Logger, CreateLoggerConfigInterface, StateConfigInterface } from './internal'; | ||
import { Runtime, Integration, State, Storage, Collection, CollectionConfig, DefaultItem, Computed, Event, CreateEventConfigInterface, DefaultEventPayload, Integrations, Observer, SubController, Storages, CreateStorageConfigInterface, RegisterConfigInterface, Logger, CreateLoggerConfigInterface, StateConfigInterface } from './internal'; | ||
export declare class Agile { | ||
@@ -21,3 +21,3 @@ config: AgileConfigInterface; | ||
*/ | ||
Storage: (config: CreateStorageConfigInterface) => Storage; | ||
createStorage(config: CreateStorageConfigInterface): Storage; | ||
/** | ||
@@ -29,3 +29,3 @@ * @public | ||
*/ | ||
State: <ValueType>(initialValue: ValueType, config?: StateConfigInterface) => State<ValueType>; | ||
createState<ValueType>(initialValue: ValueType, config?: StateConfigInterface): State<ValueType>; | ||
/** | ||
@@ -36,3 +36,3 @@ * @public | ||
*/ | ||
Collection: <DataType = DefaultItem>(config?: import("./collection").CreateCollectionConfigInterface | ((collection: Collection<DataType>) => import("./collection").CreateCollectionConfigInterface) | undefined) => Collection<DataType>; | ||
createCollection<DataType = DefaultItem>(config?: CollectionConfig<DataType>): Collection<DataType>; | ||
/** | ||
@@ -42,11 +42,19 @@ * @public | ||
* @param computeFunction - Function for computing value | ||
* @param config - Config | ||
* @param deps - Hard coded dependencies of Computed Function | ||
*/ | ||
Computed: <ComputedValueType = any>(computeFunction: () => ComputedValueType, deps?: (Observer<any> | State<any> | Event<DefaultEventPayload>)[] | undefined) => Computed<ComputedValueType>; | ||
createComputed<ComputedValueType = any>(computeFunction: () => ComputedValueType, config?: StateConfigInterface, deps?: Array<Observer | State | Event>): Computed<ComputedValueType>; | ||
/** | ||
* @public | ||
* Computed - Function that recomputes its value if a dependency changes | ||
* @param computeFunction - Function for computing value | ||
* @param deps - Hard coded dependencies of Computed Function | ||
*/ | ||
createComputed<ComputedValueType = any>(computeFunction: () => ComputedValueType, deps?: Array<Observer | State | Event>): Computed<ComputedValueType>; | ||
/** | ||
* @public | ||
* Event - Class that holds a List of Functions which can be triggered at the same time | ||
* @param config - Config | ||
*/ | ||
Event: <PayloadType = DefaultEventPayload>(config?: CreateEventConfigInterface | undefined) => Event<PayloadType>; | ||
createEvent<PayloadType = DefaultEventPayload>(config?: CreateEventConfigInterface): Event<PayloadType>; | ||
/** | ||
@@ -53,0 +61,0 @@ * @public |
@@ -12,51 +12,2 @@ "use strict"; | ||
constructor(config = {}) { | ||
//========================================================================================================= | ||
// Storage | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Storage - Handy Interface for storing Items permanently | ||
* @param config - Config | ||
*/ | ||
this.Storage = (config) => new internal_1.Storage(config); | ||
//========================================================================================================= | ||
// State | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* State - Class that holds one Value and causes rerender on subscribed Components | ||
* @param initialValue - Initial Value of the State | ||
* @param config - Config | ||
*/ | ||
this.State = (initialValue, config = {}) => new internal_1.State(this, initialValue, config); | ||
//========================================================================================================= | ||
// Collection | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Collection - Class that holds a List of Objects with key and causes rerender on subscribed Components | ||
* @param config - Config | ||
*/ | ||
this.Collection = (config) => new internal_1.Collection(this, config); | ||
//========================================================================================================= | ||
// Computed | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Computed - Function that recomputes its value if a dependency changes | ||
* @param computeFunction - Function for computing value | ||
* @param deps - Hard coded dependencies of Computed Function | ||
*/ | ||
this.Computed = (computeFunction, deps) => new internal_1.Computed(this, computeFunction, { | ||
computedDeps: deps, | ||
}); | ||
//========================================================================================================= | ||
// Event | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Event - Class that holds a List of Functions which can be triggered at the same time | ||
* @param config - Config | ||
*/ | ||
this.Event = (config) => new internal_1.Event(this, config); | ||
config = internal_1.defineConfig(config, { | ||
@@ -85,2 +36,4 @@ localStorage: true, | ||
Agile.logger = new internal_1.Logger(config.logConfig); | ||
// Logging | ||
Agile.logger.success('Created new AgileInstance ', this, Agile.logger); | ||
// Create global instance of Agile | ||
@@ -91,2 +44,62 @@ if (!internal_1.globalBind('__agile__', this)) | ||
//========================================================================================================= | ||
// Storage | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Storage - Handy Interface for storing Items permanently | ||
* @param config - Config | ||
*/ | ||
createStorage(config) { | ||
return new internal_1.Storage(config); | ||
} | ||
//========================================================================================================= | ||
// State | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* State - Class that holds one Value and causes rerender on subscribed Components | ||
* @param initialValue - Initial Value of the State | ||
* @param config - Config | ||
*/ | ||
createState(initialValue, config = {}) { | ||
return new internal_1.State(this, initialValue, config); | ||
} | ||
//========================================================================================================= | ||
// Collection | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Collection - Class that holds a List of Objects with key and causes rerender on subscribed Components | ||
* @param config - Config | ||
*/ | ||
createCollection(config) { | ||
return new internal_1.Collection(this, config); | ||
} | ||
createComputed(computeFunction, configOrDeps, deps) { | ||
let _deps; | ||
let _config; | ||
if (Array.isArray(configOrDeps)) { | ||
_deps = configOrDeps; | ||
_config = {}; | ||
} | ||
else { | ||
_config = configOrDeps || {}; | ||
_deps = deps || []; | ||
} | ||
return new internal_1.Computed(this, computeFunction, internal_1.flatMerge(_config, { | ||
computedDeps: _deps, | ||
})); | ||
} | ||
//========================================================================================================= | ||
// Event | ||
//========================================================================================================= | ||
/** | ||
* @public | ||
* Event - Class that holds a List of Functions which can be triggered at the same time | ||
* @param config - Config | ||
*/ | ||
createEvent(config) { | ||
return new internal_1.Event(this, config); | ||
} | ||
//========================================================================================================= | ||
// Integrate | ||
@@ -93,0 +106,0 @@ //========================================================================================================= |
@@ -160,3 +160,3 @@ "use strict"; | ||
// Add sideEffect to default Group which adds and removes Items from the Storage depending on the Group Value | ||
defaultGroup.addSideEffect(CollectionPersistent.defaultGroupSideEffectKey, () => this.rebuildStorageSideEffect(defaultGroup, _key)); | ||
defaultGroup.addSideEffect(CollectionPersistent.defaultGroupSideEffectKey, () => this.rebuildStorageSideEffect(defaultGroup, _key), { weight: 0 }); | ||
// Persist Collection Items | ||
@@ -163,0 +163,0 @@ for (const itemKey of defaultGroup._value) { |
@@ -286,4 +286,5 @@ import { Agile, Item, Group, GroupKey, Selector, SelectorKey, StorageKey, GroupConfigInterface, CollectionPersistent, GroupAddConfig } from '../internal'; | ||
* @param defaultGroupKey - Key/Name of Default Group that holds all collected Items | ||
* @param initialData - Initial Data of Collection | ||
*/ | ||
export interface CreateCollectionConfigInterface { | ||
export interface CreateCollectionConfigInterface<DataType = DefaultItem> { | ||
groups?: { | ||
@@ -298,2 +299,3 @@ [key: string]: Group<any>; | ||
defaultGroupKey?: ItemKey; | ||
initialData?: Array<DataType>; | ||
} | ||
@@ -368,2 +370,2 @@ /** | ||
} | ||
export declare type CollectionConfig<DataType = DefaultItem> = CreateCollectionConfigInterface | ((collection: Collection<DataType>) => CreateCollectionConfigInterface); | ||
export declare type CollectionConfig<DataType = DefaultItem> = CreateCollectionConfigInterface<DataType> | ((collection: Collection<DataType>) => CreateCollectionConfigInterface<DataType>); |
@@ -40,2 +40,4 @@ "use strict"; | ||
this.initSelectors(_config.selectors); | ||
if (_config.initialData) | ||
this.collect(_config.initialData); | ||
} | ||
@@ -807,4 +809,9 @@ /** | ||
if (createItem) { | ||
// Create and assign Item to Collection | ||
item = new internal_1.Item(this, _data); | ||
this.data[itemKey] = item; | ||
// Rebuild Groups That include ItemKey after assigning Item to Collection (otherwise it can't find Item) | ||
this.rebuildGroupsThatIncludeItemKey(itemKey, { | ||
background: config.background, | ||
}); | ||
} | ||
@@ -811,0 +818,0 @@ // Increase size of Collection |
@@ -20,3 +20,9 @@ import { State, Collection, DefaultItem, StateKey, StateRuntimeJobConfigInterface } from '../internal'; | ||
*/ | ||
setKey(value: StateKey | undefined, config?: SetItemKeyConfig): this; | ||
setKey(value: StateKey | undefined, config?: StateRuntimeJobConfigInterface): this; | ||
/** | ||
* @internal | ||
* Adds rebuildGroupThatIncludeItemKey to the Item sideEffects | ||
* @param itemKey - ItemKey at which the groups has to rebuild | ||
*/ | ||
addRebuildGroupThatIncludeItemKeySideEffect(itemKey: StateKey): void; | ||
} | ||
@@ -29,7 +35,1 @@ /** | ||
} | ||
/** | ||
* @param updateItemValuePrimaryKey - If the primaryKey in ItemValue gets update | ||
*/ | ||
export interface SetItemKeyConfig extends StateRuntimeJobConfigInterface { | ||
updateItemValuePrimaryKey?: boolean; | ||
} |
@@ -20,6 +20,4 @@ "use strict"; | ||
this.collection = () => collection; | ||
// Reassign Key to assign sideEffects | ||
this.setKey(data[collection.config.primaryKey], { | ||
updateItemValuePrimaryKey: false, | ||
}); | ||
// Add rebuildGroupsThatIncludeItemKey to sideEffects to rebuild Groups that include this Item if it mutates | ||
this.addRebuildGroupThatIncludeItemKeySideEffect(this._key || 'unknown'); | ||
} | ||
@@ -43,3 +41,2 @@ //========================================================================================================= | ||
overwrite: false, | ||
updateItemValuePrimaryKey: true, | ||
}); | ||
@@ -50,24 +47,27 @@ if (!value) | ||
this.removeSideEffect(Item.updateGroupSideEffectKey); | ||
// Add rebuildGroupsThatIncludeItemKey to sideEffects to rebuild Groups that include this Item if it changes | ||
this.addSideEffect(Item.updateGroupSideEffectKey, (config) => this.collection().rebuildGroupsThatIncludeItemKey(value, config)); | ||
// Add rebuildGroupsThatIncludeItemKey to sideEffects to rebuild Groups that include this Item if it mutates | ||
this.addRebuildGroupThatIncludeItemKeySideEffect(value); | ||
// Update ItemKey in ItemValue (After updating the sideEffect because otherwise it calls the old sideEffect) | ||
if (config.updateItemValuePrimaryKey) | ||
this.patch({ [this.collection().config.primaryKey]: value }, { | ||
sideEffects: config.sideEffects, | ||
background: config.background, | ||
force: config.force, | ||
storage: config.storage, | ||
overwrite: config.overwrite, | ||
}); | ||
// Initial Rebuild (not necessary if updating primaryKey in ItemValue because a sideEffect of the patch method is to rebuild the Group) | ||
if (!config.updateItemValuePrimaryKey) | ||
this.collection().rebuildGroupsThatIncludeItemKey(value, { | ||
background: config.background, | ||
force: config.force, | ||
sideEffects: config.sideEffects, | ||
}); | ||
this.patch({ [this.collection().config.primaryKey]: value }, { | ||
sideEffects: config.sideEffects, | ||
background: config.background, | ||
force: config.force, | ||
storage: config.storage, | ||
overwrite: config.overwrite, | ||
}); | ||
return this; | ||
} | ||
//========================================================================================================= | ||
// Add Rebuild Group That Include ItemKey SideEffect | ||
//========================================================================================================= | ||
/** | ||
* @internal | ||
* Adds rebuildGroupThatIncludeItemKey to the Item sideEffects | ||
* @param itemKey - ItemKey at which the groups has to rebuild | ||
*/ | ||
addRebuildGroupThatIncludeItemKeySideEffect(itemKey) { | ||
this.addSideEffect(Item.updateGroupSideEffectKey, (config) => this.collection().rebuildGroupsThatIncludeItemKey(itemKey, config), { weight: 100 }); | ||
} | ||
} | ||
exports.Item = Item; | ||
Item.updateGroupSideEffectKey = 'rebuildGroup'; |
@@ -72,3 +72,3 @@ "use strict"; | ||
// Add SideEffect to newItem, that rebuild this Selector depending on the current Item Value | ||
newItem.addSideEffect(Selector.rebuildSelectorSideEffectKey, (config) => this.rebuildSelector(config)); | ||
newItem.addSideEffect(Selector.rebuildSelectorSideEffectKey, (config) => this.rebuildSelector(config), { weight: 100 }); | ||
// Rebuild Selector for instantiating new 'selected' ItemKey properly | ||
@@ -75,0 +75,0 @@ this.rebuildSelector(config); |
@@ -50,3 +50,3 @@ "use strict"; | ||
// Logging | ||
internal_1.Agile.logger.info(`Successfully integrated '${integration._key}'`); | ||
internal_1.Agile.logger.success(`Integrated '${integration._key}' into AgileTs`); | ||
return true; | ||
@@ -53,0 +53,0 @@ }); |
@@ -26,2 +26,3 @@ export declare class Logger { | ||
info: (...data: any[]) => void; | ||
success: (...data: any[]) => void; | ||
warn: (...data: any[]) => void; | ||
@@ -43,2 +44,3 @@ error: (...data: any[]) => void; | ||
INFO: number; | ||
SUCCESS: number; | ||
WARN: number; | ||
@@ -61,2 +63,3 @@ ERROR: number; | ||
info(...data: any[]): void; | ||
success(...data: any[]): void; | ||
warn(...data: any[]): void; | ||
@@ -133,2 +136,3 @@ error(...data: any[]): void; | ||
* @param level - Handles which Logger Categories can be Logged | ||
* @param timestamp - Timestamp that ges written before each log of this Logger | ||
*/ | ||
@@ -139,2 +143,3 @@ export interface LoggerConfigInterface { | ||
level: number; | ||
timestamp: boolean; | ||
} | ||
@@ -147,2 +152,3 @@ /** | ||
* @param level - Handles which Logger Categories can be Logged | ||
* @param timestamp - Timestamp that ges written before each log of this Logger | ||
*/ | ||
@@ -155,2 +161,3 @@ export interface CreateLoggerConfigInterface { | ||
level?: number; | ||
timestamp?: boolean; | ||
} | ||
@@ -157,0 +164,0 @@ export declare type LoggerConfig = CreateLoggerConfigInterface | ((logger: Logger) => CreateLoggerConfigInterface); |
@@ -21,2 +21,3 @@ "use strict"; | ||
level: 0, | ||
timestamp: false, | ||
}); | ||
@@ -26,2 +27,3 @@ this.isActive = _config.active; | ||
this.config = { | ||
timestamp: _config.timestamp, | ||
prefix: _config.prefix, | ||
@@ -53,2 +55,3 @@ canUseCustomStyles: _config.canUseCustomStyles, | ||
INFO: 10, | ||
SUCCESS: 15, | ||
WARN: 20, | ||
@@ -72,3 +75,3 @@ ERROR: 50, | ||
key: 'debug', | ||
customStyle: 'color: #3c3c3c;', | ||
customStyle: 'color: #656565;', | ||
prefix: 'Debug', | ||
@@ -84,2 +87,8 @@ level: Logger.level.DEBUG, | ||
this.createLoggerCategory({ | ||
key: 'success', | ||
customStyle: 'color: #00b300;', | ||
prefix: 'Success', | ||
level: Logger.level.SUCCESS, | ||
}); | ||
this.createLoggerCategory({ | ||
key: 'warn', | ||
@@ -118,2 +127,3 @@ prefix: 'Warn', | ||
info: (...data) => this.info(...data), | ||
success: (...data) => this.success(...data), | ||
warn: (...data) => this.warn(...data), | ||
@@ -135,2 +145,5 @@ error: (...data) => this.error(...data), | ||
}, | ||
success: () => { | ||
/* do nothing */ | ||
}, | ||
warn: () => { | ||
@@ -159,2 +172,5 @@ /* do nothing */ | ||
} | ||
success(...data) { | ||
this.invokeConsole(data, 'success', 'log'); | ||
} | ||
warn(...data) { | ||
@@ -193,2 +209,4 @@ this.invokeConsole(data, 'warn', typeof console.warn !== 'undefined' ? 'warn' : 'log'); | ||
let prefix = ''; | ||
if (this.config.timestamp) | ||
prefix = prefix.concat(`[${Date.now().toString()}] `); | ||
if (this.config.prefix) | ||
@@ -195,0 +213,0 @@ prefix = prefix.concat(this.config.prefix); |
@@ -92,2 +92,4 @@ "use strict"; | ||
// Subscriptions that has to be updated/rerendered | ||
// 'Set' to combine several SubscriptionContainers that are equals into one (optimizes rerender) | ||
// Better would be to optimize the rerender based on the Component, because a Component can have multiple SubscriptionContainers | ||
const subscriptionsToUpdate = new Set(); | ||
@@ -158,10 +160,8 @@ // Build final jobsToRerender and reset jobsToRerender Instances | ||
getObjectBasedProps(subscriptionContainer) { | ||
var _a; | ||
const props = {}; | ||
// Map trough observerKeysToUpdate and build object out of Observer value | ||
subscriptionContainer.observerKeysToUpdate.forEach((updatedKey) => { | ||
if (subscriptionContainer.subsObject && | ||
subscriptionContainer.subsObject[updatedKey]['value']) | ||
props[updatedKey] = | ||
subscriptionContainer.subsObject[updatedKey]['value']; | ||
}); | ||
if (subscriptionContainer.subsObject) | ||
for (const updatedKey of subscriptionContainer.observerKeysToUpdate) | ||
props[updatedKey] = (_a = subscriptionContainer.subsObject[updatedKey]) === null || _a === void 0 ? void 0 : _a.value; | ||
subscriptionContainer.observerKeysToUpdate = []; | ||
@@ -168,0 +168,0 @@ return props; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.SubscriptionContainer = void 0; | ||
const internal_1 = require("../../../internal"); | ||
class SubscriptionContainer { | ||
@@ -18,5 +19,5 @@ /** | ||
this.subs = new Set(subs); | ||
this.key = key; | ||
this.key = key || internal_1.generateId(); | ||
} | ||
} | ||
exports.SubscriptionContainer = SubscriptionContainer; |
@@ -52,3 +52,5 @@ import { Agile, Observer, SubscriptionContainer, ComponentSubscriptionContainer, CallbackSubscriptionContainer, SubscriptionContainerKeyType } from '../../internal'; | ||
* @internal | ||
* Registers Component based Subscription | ||
* Registers Component based Subscription and applies SubscriptionContainer to Component. | ||
* If an instance called 'subscriptionContainers' exists in Component it will push the new SubscriptionContainer to this Array, | ||
* otherwise it creates a new Instance called 'subscriptionContainer' which holds the new SubscriptionContainer | ||
* @param componentInstance - Component that got subscribed by Observer/s | ||
@@ -55,0 +57,0 @@ * @param subs - Initial Subscriptions |
@@ -90,3 +90,3 @@ "use strict"; | ||
internal_1.Agile.logger.if | ||
.tag(['core', 'subscription']) | ||
.tag(['runtime', 'subscription']) | ||
.info('Unregistered Callback based Subscription ', subscriptionInstance); | ||
@@ -101,3 +101,3 @@ return; | ||
internal_1.Agile.logger.if | ||
.tag(['core', 'subscription']) | ||
.tag(['runtime', 'subscription']) | ||
.info('Unregistered Component based Subscription ', subscriptionInstance); | ||
@@ -112,6 +112,24 @@ return; | ||
internal_1.Agile.logger.if | ||
.tag(['core', 'subscription']) | ||
.tag(['runtime', 'subscription']) | ||
.info('Unregistered Component based Subscription ', subscriptionInstance); | ||
return; | ||
} | ||
// Unsubscribe component based Subscription with subscriptionInstance that holds componentSubscriptionContainers | ||
if (subscriptionInstance.componentSubscriptionContainers && | ||
Array.isArray(subscriptionInstance.componentSubscriptionContainers)) { | ||
subscriptionInstance.componentSubscriptionContainers.forEach((subContainer) => { | ||
unsub(subContainer); | ||
this.componentSubs.delete(subContainer); | ||
// Logging | ||
internal_1.Agile.logger.if | ||
.tag(['runtime', 'subscription']) | ||
.info('Unregistered Component based Subscription ', subscriptionInstance); | ||
}); | ||
return; | ||
} | ||
// Logging | ||
internal_1.Agile.logger.if | ||
.tag(['runtime', 'subscription']) | ||
.warn(`Couldn't find anything to unregister in `, subscriptionInstance); | ||
return; | ||
} | ||
@@ -138,3 +156,5 @@ //========================================================================================================= | ||
* @internal | ||
* Registers Component based Subscription | ||
* Registers Component based Subscription and applies SubscriptionContainer to Component. | ||
* If an instance called 'subscriptionContainers' exists in Component it will push the new SubscriptionContainer to this Array, | ||
* otherwise it creates a new Instance called 'subscriptionContainer' which holds the new SubscriptionContainer | ||
* @param componentInstance - Component that got subscribed by Observer/s | ||
@@ -154,7 +174,11 @@ * @param subs - Initial Subscriptions | ||
componentSubscriptionContainer.ready = true; | ||
// To have an instance of the SubscriptionContainer in the Component (necessary to unsubscribe component later) | ||
componentInstance.componentSubscriptionContainer = componentSubscriptionContainer; | ||
// Add subscriptionContainer to Component, to have an instance of it there (necessary to unsubscribe SubscriptionContainer later) | ||
if (componentInstance.componentSubscriptionContainers && | ||
Array.isArray(componentInstance.componentSubscriptionContainers)) | ||
componentInstance.componentSubscriptionContainers.push(componentSubscriptionContainer); | ||
else | ||
componentInstance.componentSubscriptionContainer = componentSubscriptionContainer; | ||
// Logging | ||
internal_1.Agile.logger.if | ||
.tag(['core', 'subscription']) | ||
.tag(['runtime', 'subscription']) | ||
.info('Registered Component based Subscription ', componentSubscriptionContainer); | ||
@@ -179,3 +203,3 @@ return componentSubscriptionContainer; | ||
internal_1.Agile.logger.if | ||
.tag(['core', 'subscription']) | ||
.tag(['runtime', 'subscription']) | ||
.info('Registered Callback based Subscription ', callbackSubscriptionContainer); | ||
@@ -182,0 +206,0 @@ return callbackSubscriptionContainer; |
@@ -14,5 +14,3 @@ import { Agile, StorageKey, StateObserver, StatePersistent, Observer, PersistentKey, StateIngestConfigInterface, StateRuntimeJobConfigInterface } from '../internal'; | ||
sideEffects: { | ||
[key: string]: (properties?: { | ||
[key: string]: any; | ||
}) => void; | ||
[key: string]: SideEffectInterface; | ||
}; | ||
@@ -98,3 +96,3 @@ computeMethod?: ComputeMethod<ValueType>; | ||
*/ | ||
patch(targetWithChanges: object, config?: PatchConfigInterface): this; | ||
patch(targetWithChanges: Object, config?: PatchConfigInterface): this; | ||
/** | ||
@@ -190,7 +188,6 @@ * @public | ||
* @param key - Key/Name of SideEffect | ||
* @param sideEffect - Callback Function that gets called on every State Value change | ||
* @param callback - Callback Function that gets called on every State Value change | ||
* @param config - Config | ||
*/ | ||
addSideEffect(key: string, sideEffect: (properties?: { | ||
[key: string]: any; | ||
}) => void): this; | ||
addSideEffect(key: string, callback: SideEffectFunctionType, config?: AddSideEffectConfigInterface): this; | ||
/** | ||
@@ -253,1 +250,18 @@ * @internal | ||
export declare type ComputeMethod<T = any> = (value: T) => T; | ||
export declare type SideEffectFunctionType = (properties?: { | ||
[key: string]: any; | ||
}) => void; | ||
/** | ||
* @param callback - Callback Function that gets called on every State Value change | ||
* @param weight - When the sideEffect gets executed. The higher, the earlier it gets executed. | ||
*/ | ||
export interface SideEffectInterface { | ||
callback: SideEffectFunctionType; | ||
weight: number; | ||
} | ||
/** | ||
* @param weight - When the sideEffect gets executed. The higher, the earlier it gets executed. | ||
*/ | ||
export interface AddSideEffectConfigInterface { | ||
weight?: number; | ||
} |
@@ -399,10 +399,17 @@ "use strict"; | ||
* @param key - Key/Name of SideEffect | ||
* @param sideEffect - Callback Function that gets called on every State Value change | ||
* @param callback - Callback Function that gets called on every State Value change | ||
* @param config - Config | ||
*/ | ||
addSideEffect(key, sideEffect) { | ||
if (!internal_1.isFunction(sideEffect)) { | ||
addSideEffect(key, callback, config = {}) { | ||
config = internal_1.defineConfig(config, { | ||
weight: 10, | ||
}); | ||
if (!internal_1.isFunction(callback)) { | ||
internal_1.Agile.logger.error('A sideEffect function has to be a function!'); | ||
return this; | ||
} | ||
this.sideEffects[key] = sideEffect; | ||
this.sideEffects[key] = { | ||
callback: callback, | ||
weight: config.weight, | ||
}; | ||
return this; | ||
@@ -409,0 +416,0 @@ } |
@@ -92,3 +92,2 @@ "use strict"; | ||
state.nextStateValue = internal_1.copy(job.observer.nextStateValue); | ||
job.observer.value = internal_1.copy(job.observer.nextStateValue); | ||
// Overwrite old State Values | ||
@@ -102,2 +101,6 @@ if (job.config.overwrite) { | ||
this.sideEffects(job); | ||
// Assign Public Value to Observer after sideEffects like 'rebuildGroup', | ||
// because sometimes (for instance in Group) the publicValue is not the value(nextStateValue) | ||
// and the observer value is at some point the publicValue because the end user uses it | ||
job.observer.value = internal_1.copy(state.getPublicValue()); | ||
} | ||
@@ -120,6 +123,11 @@ //========================================================================================================= | ||
// Call SideEffect Functions | ||
if ((_a = job.config) === null || _a === void 0 ? void 0 : _a.sideEffects) | ||
for (const sideEffectKey in state.sideEffects) | ||
if (internal_1.isFunction(state.sideEffects[sideEffectKey])) | ||
state.sideEffects[sideEffectKey](job.config); | ||
if ((_a = job.config) === null || _a === void 0 ? void 0 : _a.sideEffects) { | ||
const sideEffectArray = internal_1.createArrayFromObject(state.sideEffects); | ||
sideEffectArray.sort(function (a, b) { | ||
return b.instance.weight - a.instance.weight; | ||
}); | ||
for (const sideEffect of sideEffectArray) | ||
if (internal_1.isFunction(sideEffect.instance.callback)) | ||
sideEffect.instance.callback(job.config); | ||
} | ||
// Ingest Dependencies of Observer into Runtime | ||
@@ -126,0 +134,0 @@ state.observer.deps.forEach((observer) => observer instanceof StateObserver && observer.ingest({ perform: false })); |
@@ -125,3 +125,3 @@ "use strict"; | ||
this.rebuildStorageSideEffect(this.state(), _key, config); | ||
}); | ||
}, { weight: 0 }); | ||
// Rebuild Storage for saving State Value in the Storage | ||
@@ -128,0 +128,0 @@ this.rebuildStorageSideEffect(this.state(), _key); |
@@ -81,3 +81,4 @@ import { Agile } from './internal'; | ||
* @internal | ||
* Merges items into object, be aware that the merge will only happen at the top level of the object | ||
* Merges items into object, be aware that the merge will only happen at the top level of the object. | ||
* Initially it adds new properties of the changes object into the source object. | ||
* @param source - Source object | ||
@@ -110,2 +111,13 @@ * @param changes - Changes that get merged into the source object | ||
* @internal | ||
* Transforms Object to Array | ||
* @param object - Object that gets transformed | ||
*/ | ||
export declare function createArrayFromObject<P = any>(object: { | ||
[key: string]: P; | ||
}): Array<{ | ||
key: string; | ||
instance: P; | ||
}>; | ||
/** | ||
* @internal | ||
* Clones a Class | ||
@@ -112,0 +124,0 @@ * @param instance - Instance of Class you want to clone |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.globalBind = exports.clone = exports.generateId = exports.notEqual = exports.equal = exports.flatMerge = exports.defineConfig = exports.isJsonString = exports.isValidUrl = exports.isAsyncFunction = exports.isFunction = exports.getAgileInstance = exports.normalizeArray = exports.includesArray = exports.isValidObject = exports.copy = void 0; | ||
exports.globalBind = exports.clone = exports.createArrayFromObject = exports.generateId = exports.notEqual = exports.equal = exports.flatMerge = exports.defineConfig = exports.isJsonString = exports.isValidUrl = exports.isAsyncFunction = exports.isFunction = exports.getAgileInstance = exports.normalizeArray = exports.includesArray = exports.isValidObject = exports.copy = void 0; | ||
const internal_1 = require("./internal"); | ||
@@ -204,3 +204,4 @@ //========================================================================================================= | ||
* @internal | ||
* Merges items into object, be aware that the merge will only happen at the top level of the object | ||
* Merges items into object, be aware that the merge will only happen at the top level of the object. | ||
* Initially it adds new properties of the changes object into the source object. | ||
* @param source - Source object | ||
@@ -211,7 +212,10 @@ * @param changes - Changes that get merged into the source object | ||
function flatMerge(source, changes, config = {}) { | ||
// Copy Source to avoid references | ||
config = defineConfig(config, { | ||
addNewProperties: true, | ||
}); | ||
// Copy Source to avoid References | ||
const _source = copy(source); | ||
if (!_source) | ||
return _source; | ||
// Loop through source object an merge changes into it | ||
// Merge Changes Object into Source Object | ||
const keys = Object.keys(changes); | ||
@@ -273,2 +277,21 @@ keys.forEach((property) => { | ||
//========================================================================================================= | ||
// Create Array From Object | ||
//========================================================================================================= | ||
/** | ||
* @internal | ||
* Transforms Object to Array | ||
* @param object - Object that gets transformed | ||
*/ | ||
function createArrayFromObject(object) { | ||
const array = []; | ||
for (const key in object) { | ||
array.push({ | ||
key: key, | ||
instance: object[key], | ||
}); | ||
} | ||
return array; | ||
} | ||
exports.createArrayFromObject = createArrayFromObject; | ||
//========================================================================================================= | ||
// Clone | ||
@@ -285,3 +308,3 @@ //========================================================================================================= | ||
const objectClone = Object.assign(objectCopy, instance); | ||
// Copy Properties of Class | ||
// Copy Properties of Class to remove flat references | ||
for (const key in objectClone) | ||
@@ -288,0 +311,0 @@ objectClone[key] = copy(objectClone[key]); |
{ | ||
"name": "@agile-ts/core", | ||
"version": "0.0.9", | ||
"version": "0.0.10", | ||
"author": "BennoDev", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
@@ -8,5 +8,5 @@ <img src="https://raw.githubusercontent.com/agile-ts/agile/master/static/header_background.png" alt="AgileTs"> | ||
<a href="https://github.com/agile-ts/agile"> | ||
<img src="https://img.shields.io/github/license/agile-ts/agile.svg" alt="GitHub License"/></a> | ||
<img src="https://img.shields.io/github/license/agile-ts/agile.svg?label=license&style=flat&colorA=293140&colorB=4a4872" alt="GitHub License"/></a> | ||
<a href="https://npm.im/@agile-ts/core"> | ||
<img src="https://img.shields.io/bundlephobia/min/@agile-ts/core.svg" alt="npm minified size"/></a> | ||
<img src="https://img.shields.io/bundlephobia/min/@agile-ts/core.svg?label=minified%20size&style=flat&colorA=293140&colorB=4a4872" alt="npm minified size"/></a> | ||
@@ -16,6 +16,6 @@ <br /> | ||
<a href="https://github.com/agile-ts/agile/actions?query=workflow%3ARelease"> | ||
<img src="https://github.com/agile-ts/agile/workflows/Release/badge.svg?style=flat-square" alt="Build Status"/></a> | ||
<img src="https://github.com/agile-ts/agile/workflows/Release/badge.svg" alt="Build Status"/></a> | ||
<a href="https://github.com/agile-ts/agile/actions?query=workflow%3A%22Test+All+Packages%22"> | ||
<img src="https://github.com/agile-ts/agile/workflows/Test%20All%20Packages/badge.svg" alt="Build Status"/></a> | ||
<a href="https://codeclimate.com/github/agile-ts/agile/coverage"> | ||
<a href="https://codeclimate.com/github/agile-ts/agile/coverage.svg"> | ||
<img src="https://codeclimate.com/github/agile-ts/agile/badges/gpa.svg" alt="Maintainability"/></a> | ||
@@ -26,8 +26,7 @@ | ||
<a href="https://npm.im/@agile-ts/core"> | ||
<img src="https://img.shields.io/npm/dm/@agile-ts/core.svg" alt="npm monthly downloads"/></a> | ||
<img src="https://img.shields.io/npm/dm/@agile-ts/core.svg?label=downloads&style=flat&colorA=293140&colorB=4a4872" alt="npm monthly downloads"/></a> | ||
<a href="https://npm.im/@agile-ts/core"> | ||
<img src="https://img.shields.io/npm/dt/@agile-ts/core.svg" alt="npm total downloads"/></a> | ||
<img src="https://img.shields.io/npm/dt/@agile-ts/core.svg?label=downloads&style=flat&colorA=293140&colorB=4a4872" alt="npm total downloads"/></a> | ||
<br /> | ||
@@ -45,12 +44,13 @@ | ||
// Than we can build our first State | ||
const MY_FIRST_STATE = App.State("Hello Stranger!"); | ||
// Now we are able to build our first State π | ||
const MY_FIRST_STATE = App.createState("Hello Stranger!"); | ||
// -- myComponent.whatever ------------------------------------------ | ||
// Now we are able to bind our State to nearly any UI-Component | ||
// Finally, we bind our just created State to our desired UI-Component | ||
// And wolla its reactive. Everytime the State mutates the Component gets rerendered | ||
const myFirstState = useAgile(MY_FIRST_STATE); // returns value of State ("Hello Stranger!") | ||
``` | ||
To find out more checkout our [documentation](https://agile-ts.org/docs). | ||
To find out more checkout our [documentation](https://agile-ts.org/docs/installation). | ||
@@ -91,3 +91,3 @@ ### β³οΈ Sandbox | ||
### π€Έβ Flexible | ||
- Works in nearly every UI-Framework. Check [here](https://agile-ts.org/docs/frameworks) if the Framework you are using is supported, too. | ||
- Works in nearly every UI-Framework. Check [here](https://agile-ts.org/docs/installation) if your desired framework is supported, too. | ||
- Surly behaves with the workflow that suits you best. | ||
@@ -104,2 +104,3 @@ No need for _reducers_, _actions_, .. | ||
A good place to start is in our [documentation](https://agile-ts.org/docs). | ||
And I'm sure you'll be able to use AgileTs very soon. | ||
@@ -117,5 +118,5 @@ ### π Lightweight | ||
To use AgileTs properly, in an UI-Framework we have to install **2** packages. | ||
To properly use AgileTs, in an UI-Framework we need **two** packages. | ||
- The _Core Package_, which is the brain of AgileTs and handles your States, Collections, .. | ||
- The _Core Package_, which acts as the brain of AgileTs and manages all our States | ||
``` | ||
@@ -125,4 +126,4 @@ npm install @agile-ts/core | ||
- A _fitting integration_ for the UI-Framework you are using.. in my case [React](https://www.npmjs.com/package/@agile-ts/react). | ||
Check [here](https://agile-ts/docs/framework) your Framework is supported, too. | ||
- And a _fitting Integration_ for our preferd UI-Framework.. in my case [React](https://www.npmjs.com/package/@agile-ts/react). | ||
Check [here](https://agile-ts.org/docs/installation) if your desired Framework is supported, too. | ||
``` | ||
@@ -151,3 +152,5 @@ npm install @agile-ts/react | ||
Get a part of AgileTs and start contributing. To find out more read the [CONTRIBUTING.md](https://github.com/agile-ts/agile/blob/master/CONTRIBUTING.md). | ||
Get a part of AgileTs and start contributing. | ||
To find out more checkout the [CONTRIBUTING.md](https://github.com/agile-ts/agile/blob/master/CONTRIBUTING.md). | ||
We welcome any meaningful contribution π | ||
@@ -154,0 +157,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
298478
7406
170