UNPKG

@jay-js/system

Version:

A powerful and flexible TypeScript library for UI, state management, lazy loading, routing and managing draggable elements in modern web applications.

169 lines (168 loc) 5.21 kB
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _async_to_generator(fn) { return function() { var self = this, args = arguments; return new Promise(function(resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } let _subscriber = null; function fn_hash(func) { const funcString = func.toString(); let hash = 0; for(let i = 0; i < funcString.length; i++){ const char = funcString.charCodeAt(i); hash = (hash << 5) - hash + char; hash |= 0; } return Math.abs(hash).toString(16); } export const State = (data)=>{ const state = { set: (newData1, options)=>{ if (typeof newData1 === "function") { data = newData1(data); } else { data = newData1; } if (options === null || options === void 0 ? void 0 : options.silent) { return; } if (state.effects.size === 0) { return; } if (options === null || options === void 0 ? void 0 : options.target) { if (Array.isArray(options.target)) { options.target.forEach((item)=>{ const effect = state.effects.get(item); if (effect) { effect(data); } }); return; } const effect = state.effects.get(options.target); if (effect) { effect(data); } return; } state.effects.forEach((item)=>item(data)); }, get: (callback)=>{ if (callback) { callback(data); } return data; }, sub: (id, effect, run = false)=>{ state.effects.set(id, effect); if (run) { return effect(data); } }, unsub: (id)=>{ state.effects.delete(id); }, trigger: (id)=>{ if (state.effects.size === 0) { return; } if (id) { const effect = state.effects.get(id); if (effect) { effect(data); } return; } state.effects.forEach((item)=>item(data)); }, clear: (newData1)=>{ if (typeof newData1 === "function") { data = newData1(data); } else if (newData1) { data = newData1; } else { data = undefined; } state.effects.clear(); }, effects: new Map(), get value () { if (_subscriber) { let hash = fn_hash(_subscriber); if (_subscriber.name.includes("_setValue") && _subscriber._fn) { hash = fn_hash(_subscriber._fn); } state.sub(hash, _subscriber); } return this.get(); }, set value (newData){ this.set(newData); } }; return state; }; export function Effect(fn) { _subscriber = fn; fn(); _subscriber = null; } export function Values(fn) { const _setValue = function() { var _ref = _async_to_generator(function*() { if (_setValue._path.length > 0) { let target = _setValue._object; for(let i = 0; i < _setValue._path.length - 1; i++){ target = target[_setValue._path[i]]; } const lastKey = _setValue._path[_setValue._path.length - 1]; target[lastKey] = yield _setValue._fn(); return; } _setValue._object = yield _setValue._fn(); }); return function _setValue() { return _ref.apply(this, arguments); }; }(); _setValue._object = undefined; _setValue._path = []; _setValue._fn = fn; function _set_value_effect(object) { return __set_value_effect.apply(this, arguments); } function __set_value_effect() { __set_value_effect = _async_to_generator(function*(object, ...path) { _setValue._object = object; _setValue._path = path; _subscriber = _setValue; yield _setValue(); _subscriber = null; }); return __set_value_effect.apply(this, arguments); } return _set_value_effect; }