UNPKG

redext

Version:

A simple global store based on React Context and Hooks

189 lines (176 loc) 6.06 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/connect.tsx var connect_exports = {}; __export(connect_exports, { default: () => connect_default }); module.exports = __toCommonJS(connect_exports); var import_react6 = require("react"); // src/Context.tsx var import_react = require("react"); var Context_default = (0, import_react.createContext)({}); // src/hooks/useContextSelector.ts var import_react4 = require("react"); // src/hooks/useDeepMemo.ts var import_react3 = __toESM(require("react")); // src/hooks/useDeepMemoize.ts var import_react2 = require("react"); // src/utils/deepEqual.ts var equal = (a, b) => { let ctor; let len; if (a === b) { return true; } if (a && b && (ctor = a.constructor) === b.constructor) { if (ctor === Date) { return a.getTime() === b.getTime(); } if (ctor === RegExp) { return a.toString() === b.toString(); } if (ctor === Array && (len = a.length) === b.length) { while (len-- && equal(a[len], b[len])) ; return len === -1; } if (ctor === Object) { if (Object.keys(a).length !== Object.keys(b).length) { return false; } for (len in a) { if (!(len in b) || !equal(a[len], b[len])) { return false; } } return true; } } return a !== a && b !== b; }; function deepEqual(a, b) { try { return equal(a, b); } catch (error) { if (error.message && error.message.match(/stack|recursion/i) || error.number === -2146828260) { console.warn("Warning: deepEqual does not handle circular references.", error.name, error.message); return false; } throw error; } } // src/hooks/useDeepMemoize.ts var useDeepMemoize = (value) => { const ref = (0, import_react2.useRef)([]); if (!deepEqual(value, ref.current)) { ref.current = value; } return ref.current; }; var useDeepMemoize_default = useDeepMemoize; // src/utils/checkDeps.ts var isPrimitive = (val) => { return val == null || /^[sbn]/.test(typeof val); }; var checkDeps = (deps, name) => { const hookName = `React.${name.replace(/Deep/, "")}`; if (!deps || deps.length === 0) { console.warn(`${name} should not be used with no dependencies. Use ${hookName} instead.`); } if (deps.every(isPrimitive)) { console.warn(`${name} should not be used with dependencies that are all primitive values. Use ${hookName} instead.`); } }; var checkDeps_default = checkDeps; // src/hooks/useDeepMemo.ts var useDeepMemo = (factory, dependencies) => { if (process.env.NODE_ENV !== "production") { checkDeps_default(dependencies, "useDeepMemo"); } return import_react3.default.useMemo(factory, useDeepMemoize_default(dependencies)); }; var useDeepMemo_default = useDeepMemo; // src/hooks/useContextSelector.ts var useContextSelector = (mapStateToProps, params = {}) => { const { isWithSyncExternalStore = true } = params; if (isWithSyncExternalStore && import_react4.useSyncExternalStore) { const { subscribe, getState } = (0, import_react4.useContext)(Context_default); const getSnapshot = () => { if (!mapStateToProps) { return void 0; } const state2 = getState(); return mapStateToProps(state2); }; return (0, import_react4.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot); } const { state = {} } = (0, import_react4.useContext)(Context_default); let filteredState = {}; if (mapStateToProps) { filteredState = mapStateToProps(state); } else { filteredState = state; } return useDeepMemo_default(() => { return filteredState; }, [filteredState]); }; var useContextSelector_default = useContextSelector; // src/hooks/useDispatcher.ts var import_react5 = require("react"); var useDispatcher = (mapDispatchToProps) => { const { dispatch, effects } = (0, import_react5.useContext)(Context_default); let filteredDispatch = {}; if (mapDispatchToProps) { filteredDispatch = mapDispatchToProps(effects, dispatch); } return filteredDispatch; }; var useDispatcher_default = useDispatcher; // src/connect.tsx var import_jsx_runtime = require("react/jsx-runtime"); var connect = (mapStateToProps, mapDispatchToProps) => (Component) => { return (props) => { const { dispatch } = (0, import_react6.useContext)(Context_default); const memoState = useContextSelector_default(mapStateToProps, { isWithSyncExternalStore: false }); const dispatcher = useDispatcher_default(mapDispatchToProps); return /* @__PURE__ */ (0, import_jsx_runtime.jsx)( Component, { ...props, ...memoState, ...dispatcher, dispatch } ); }; }; var connect_default = connect;