UNPKG

overmind

Version:
1 lines 6.32 kB
{"version":3,"file":"derived.js","sourceRoot":"","sources":["../src/derived.ts"],"names":[],"mappings":";;;AACA,uDAMyB;AAEzB,mDAAmD;AAEtC,QAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;AACjC,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAA;AAEtE,MAAa,OAAO;IAOlB,YAAoB,EAA2C;QAA3C,OAAE,GAAF,EAAE,CAAyC;QANvD,YAAO,GAAY,IAAI,CAAA;QAIvB,gBAAW,GAAW,CAAC,CAAA;QAG7B,MAAM,aAAa,GAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEnD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;YAC1C,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE;gBAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAA;YAC1B,CAAC,CAAA;SACF;QAED,aAAa,CAAC,kBAAU,CAAC,GAAG,IAAI,CAAA;QAEhC,OAAO,aAAa,CAAA;IACtB,CAAC;IAEO,QAAQ,CAAC,IAAI,EAAE,IAAI;QACzB,MAAM,MAAM,GAAG,IAAI;aAChB,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;aACzB,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QAE/C,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;IAED,QAAQ,CACN,QAA8B,EAC9B,IAA+C,EAC/C,cAAmC,EACnC,IAAI;QAEJ,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YAC3B,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC,UAAU,CAChD,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;gBACpB,IACE,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,EAChC,cAAc,CAAC,WAAW,CAC3B,KAAK,UAAU,EAChB;oBACA,IAAI,CAAC,iBAAiB,EAAE,CAAA;oBACxB,OAAM;iBACP;gBAED,IAAI,IAAI,CAAC,OAAO,EAAE;oBAChB,OAAM;iBACP;gBAED,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE;oBAChC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE;wBAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;wBACnB,QAAQ,CAAC,SAAS,CAAC,yBAAS,CAAC,aAAa,EAAE;4BAC1C,WAAW,EAAE,IAAI;4BACjB,IAAI,EAAE,YAAY;4BAClB,OAAO;yBACR,CAAC,CAAA;wBACF,OAAM;qBACP;iBACF;YACH,CAAC,CACF,CAAA;SACF;QAED,sFAAsF;QACtF,6FAA6F;QAC7F,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,SAAS,EAAE;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;YAElC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;YACtC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;YACpB,IAAI,CAAC,KAAK,GAAG,QAAQ,EAAE,CAAA;YAEvB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE;gBAC1C,QAAQ,CAAC,SAAS,CAAC,yBAAS,CAAC,OAAO,EAAE;oBACpC,IAAI;oBACJ,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;oBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;iBAClB,CAAC,CAAA;gBACF,IAAI,CAAC,WAAW,EAAE,CAAA;aACnB;SACF;QAED,IAAI,IAAI,YAAY,iCAAc,EAAE;YAClC,gEAAgE;YAChE,uDAAuD;YACvD,+DAA+D;YAC/D,wBAAwB;YACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;gBAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;aAClD;SACF;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAA;QAEvC,kDAAkD;QAClD,iCAAiC;QACjC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,2BAAQ,CAAC,EAAE;YACtC,OAAO,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;SAChD;QAED,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF;AA5GD,0BA4GC","sourcesContent":["import { EventEmitter } from 'betsy'\nimport {\n IMutationTree,\n IS_PROXY,\n ITrackStateTree,\n ProxyStateTree,\n TrackStateTree,\n} from 'proxy-state-tree'\n\nimport { EventType, Events } from './internalTypes'\n\nexport const IS_DERIVED = Symbol('IS_DERIVED')\nexport const IS_DERIVED_CONSTRUCTOR = Symbol('IS_DERIVED_CONSTRUCTOR')\n\nexport class Derived {\n private isDirty: boolean = true\n private previousProxifier: any\n private value: any\n private paths: Set<string>\n private updateCount: number = 0\n private disposeOnMutation: () => void\n constructor(private cb: (state: object, parent: object) => void) {\n const boundEvaluate: any = this.evaluate.bind(this)\n\n if (process.env.NODE_ENV === 'development') {\n boundEvaluate.dispose = () => {\n this.disposeOnMutation()\n }\n }\n\n boundEvaluate[IS_DERIVED] = true\n\n return boundEvaluate\n }\n\n private runScope(tree, path) {\n const parent = path\n .slice(0, path.length - 1)\n .reduce((curr, key) => curr[key], tree.state)\n\n return this.cb(parent, tree.state)\n }\n\n evaluate(\n eventHub: EventEmitter<Events>,\n tree: ITrackStateTree<any> | IMutationTree<any>,\n proxyStateTree: ProxyStateTree<any>,\n path\n ) {\n if (!this.disposeOnMutation) {\n this.disposeOnMutation = proxyStateTree.onMutation(\n (_, paths, flushId) => {\n if (\n typeof path.reduce(\n (aggr, key) => aggr && aggr[key],\n proxyStateTree.sourceState\n ) !== 'function'\n ) {\n this.disposeOnMutation()\n return\n }\n\n if (this.isDirty) {\n return\n }\n\n for (const mutationPath of paths) {\n if (this.paths.has(mutationPath)) {\n this.isDirty = true\n eventHub.emitAsync(EventType.DERIVED_DIRTY, {\n derivedPath: path,\n path: mutationPath,\n flushId,\n })\n return\n }\n }\n }\n )\n }\n\n // During development we need to move the ownership of whatever state is returned from\n // the derived to track it correctly. In production we only have one proxifier, so no worries\n if (this.isDirty || this.previousProxifier !== tree.proxifier) {\n const getPaths = tree.trackPaths()\n\n this.value = this.runScope(tree, path)\n this.isDirty = false\n this.paths = getPaths()\n\n if (process.env.NODE_ENV === 'development') {\n eventHub.emitAsync(EventType.DERIVED, {\n path,\n paths: Array.from(this.paths),\n updateCount: this.updateCount,\n value: this.value,\n })\n this.updateCount++\n }\n }\n\n if (tree instanceof TrackStateTree) {\n // If we access a cached value we have to make sure that we move\n // the tracked paths into the tree looking at it, where\n // addTrackingPath is for initial tree and \"trackPathListeners\"\n // is for nested derived\n for (const path of this.paths) {\n tree.addTrackingPath(path)\n tree.trackPathListeners.forEach((cb) => cb(path))\n }\n }\n\n this.previousProxifier = tree.proxifier\n\n // This value might be a proxy, we need to rescope\n // it to the current tree looking\n if (this.value && this.value[IS_PROXY]) {\n return proxyStateTree.rescope(this.value, tree)\n }\n\n return this.value\n }\n}\n"]}