@stackflow/core
Advanced tools
@@ -13,2 +13,3 @@ import { PushedEvent, ReplacedEvent } from "./event-types"; | ||
| params: ActivityParams; | ||
| preloadRef?: unknown; | ||
| pushedBy: PushedEvent | ReplacedEvent; | ||
@@ -15,0 +16,0 @@ }; |
@@ -9,2 +9,3 @@ import { BaseDomainEvent } from "./_base"; | ||
| params: PushedEventParams; | ||
| preloadRef?: unknown; | ||
| }>; |
@@ -9,2 +9,3 @@ import { BaseDomainEvent } from "./_base"; | ||
| params: ReplacedEventParams; | ||
| preloadRef?: unknown; | ||
| }>; |
+1
-230
@@ -1,231 +0,2 @@ | ||
| var __create = Object.create; | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | ||
| var __getOwnPropNames = Object.getOwnPropertyNames; | ||
| var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
| var __getProtoOf = Object.getPrototypeOf; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
| var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
| var __spreadValues = (a, b) => { | ||
| for (var prop in b || (b = {})) | ||
| if (__hasOwnProp.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| if (__getOwnPropSymbols) | ||
| for (var prop of __getOwnPropSymbols(b)) { | ||
| if (__propIsEnum.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| } | ||
| return a; | ||
| }; | ||
| 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(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); | ||
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | ||
| // src/index.ts | ||
| var src_exports = {}; | ||
| __export(src_exports, { | ||
| aggregate: () => aggregate, | ||
| id: () => id, | ||
| makeEvent: () => makeEvent, | ||
| produceEffects: () => produceEffects | ||
| }); | ||
| module.exports = __toCommonJS(src_exports); | ||
| // src/event-utils/filterEvents.ts | ||
| function filterEvents(events, eventName) { | ||
| return events.filter((e) => e.name === eventName); | ||
| } | ||
| // src/utils/compareBy.ts | ||
| function compareBy(a, b, selector) { | ||
| const $a = selector(a); | ||
| const $b = selector(b); | ||
| if ($a < $b) { | ||
| return -1; | ||
| } | ||
| if ($a === $b) { | ||
| return 0; | ||
| } | ||
| return 1; | ||
| } | ||
| // src/utils/id.ts | ||
| var counterMap = /* @__PURE__ */ new Map(); | ||
| function id() { | ||
| const t = new Date().getTime().toString(); | ||
| const prevCounter = counterMap.get(t); | ||
| const nextCounter = prevCounter !== void 0 ? prevCounter + 1 : 0; | ||
| if (nextCounter === 0) { | ||
| counterMap = /* @__PURE__ */ new Map(); | ||
| } | ||
| counterMap.set(t, nextCounter); | ||
| return Number(`${t}${nextCounter.toString().padStart(2, "0")}`).toString(16); | ||
| } | ||
| // src/utils/uniqBy.ts | ||
| function uniqBy(arr, by) { | ||
| const valueMap = /* @__PURE__ */ new Map(); | ||
| return [...arr].reverse().filter((item) => { | ||
| const key = by(item); | ||
| if (key === null) { | ||
| return true; | ||
| } | ||
| const exists = !!valueMap.get(key); | ||
| valueMap.set(key, true); | ||
| return !exists; | ||
| }).reverse(); | ||
| } | ||
| // src/event-utils/makeEvent.ts | ||
| function makeEvent(name, parameters) { | ||
| return __spreadValues({ | ||
| id: id(), | ||
| name, | ||
| eventDate: new Date().getTime() | ||
| }, parameters); | ||
| } | ||
| // src/event-utils/validateEvents.ts | ||
| function validateEvents(events) { | ||
| if (events.length === 0) { | ||
| throw new Error("events parameter is empty"); | ||
| } | ||
| const initEvents = filterEvents(events, "Initialized"); | ||
| const activityRegisteredEvents = filterEvents(events, "ActivityRegistered"); | ||
| const pushedEvents = filterEvents(events, "Pushed"); | ||
| if (initEvents.length > 1) { | ||
| throw new Error("InitializedEvent can only exist once"); | ||
| } | ||
| const registeredActivityNames = activityRegisteredEvents.map((e) => e.activityName); | ||
| pushedEvents.forEach((e) => { | ||
| if (!registeredActivityNames.includes(e.activityName)) { | ||
| throw new Error("the corresponding activity does not exist"); | ||
| } | ||
| }); | ||
| } | ||
| // src/aggregate.ts | ||
| function aggregate(events, now) { | ||
| const sortedEvents = uniqBy([...events].sort((a, b) => compareBy(a, b, (e) => e.id)), (e) => e.id); | ||
| validateEvents(sortedEvents); | ||
| const initEvent = filterEvents(sortedEvents, "Initialized")[0]; | ||
| const { transitionDuration } = initEvent; | ||
| const activities = []; | ||
| sortedEvents.forEach((event) => { | ||
| switch (event.name) { | ||
| case "Pushed": { | ||
| const transitionState = now - event.eventDate >= transitionDuration ? "enter-done" : "enter-active"; | ||
| activities.push({ | ||
| id: event.activityId, | ||
| name: event.activityName, | ||
| transitionState, | ||
| params: event.params, | ||
| pushedBy: event, | ||
| metadata: { | ||
| poppedBy: null | ||
| } | ||
| }); | ||
| break; | ||
| } | ||
| case "Replaced": { | ||
| const transitionState = now - event.eventDate >= transitionDuration ? "enter-done" : "enter-active"; | ||
| const targetActivity = activities.filter((activity) => activity.metadata.poppedBy === null).sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0]; | ||
| activities.push({ | ||
| id: event.activityId, | ||
| name: event.activityName, | ||
| transitionState, | ||
| params: event.params, | ||
| pushedBy: event, | ||
| metadata: { | ||
| poppedBy: null | ||
| } | ||
| }); | ||
| if (targetActivity && transitionState === "enter-done") { | ||
| targetActivity.metadata.poppedBy = event; | ||
| targetActivity.transitionState = "exit-done"; | ||
| } | ||
| break; | ||
| } | ||
| case "Popped": { | ||
| const targetActivity = activities.filter((_, i) => i > 0).filter((activity) => activity.metadata.poppedBy === null).sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0]; | ||
| const transitionState = now - event.eventDate >= transitionDuration ? "exit-done" : "exit-active"; | ||
| if (targetActivity) { | ||
| targetActivity.metadata.poppedBy = event; | ||
| targetActivity.transitionState = transitionState; | ||
| } | ||
| break; | ||
| } | ||
| default: { | ||
| break; | ||
| } | ||
| } | ||
| }); | ||
| const globalTransitionState = activities.find((activity) => activity.transitionState === "enter-active" || activity.transitionState === "exit-active") ? "loading" : "idle"; | ||
| const output = { | ||
| activities: uniqBy(activities.map((activity) => ({ | ||
| id: activity.id, | ||
| name: activity.name, | ||
| transitionState: activity.transitionState, | ||
| params: activity.params, | ||
| pushedBy: activity.pushedBy | ||
| })), (activity) => activity.id).sort((a, b) => compareBy(a, b, (activity) => activity.id)), | ||
| transitionDuration, | ||
| globalTransitionState | ||
| }; | ||
| return output; | ||
| } | ||
| // src/produceEffects.ts | ||
| var import_react_fast_compare = __toESM(require("react-fast-compare")); | ||
| function produceEffects(prevOutput, nextOutput) { | ||
| const output = []; | ||
| if (!(0, import_react_fast_compare.default)(prevOutput, nextOutput)) { | ||
| output.push({ | ||
| _TAG: "%SOMETHING_CHANGED%" | ||
| }); | ||
| } | ||
| for (let i = 0; i < Math.max(prevOutput.activities.length, nextOutput.activities.length); i += 1) { | ||
| const prevActivity = prevOutput.activities[i]; | ||
| const nextActivity = nextOutput.activities[i]; | ||
| if (!prevActivity && !!nextActivity) { | ||
| output.push({ | ||
| _TAG: nextActivity.pushedBy.name === "Pushed" ? "PUSHED" : "REPLACED", | ||
| activity: nextActivity | ||
| }); | ||
| } | ||
| const isPrevActivityPopped = (prevActivity == null ? void 0 : prevActivity.transitionState) === "exit-done" || (prevActivity == null ? void 0 : prevActivity.transitionState) === "exit-active"; | ||
| const isNextActivityPushed = (nextActivity == null ? void 0 : nextActivity.transitionState) === "enter-active" || (nextActivity == null ? void 0 : nextActivity.transitionState) === "enter-done"; | ||
| if (isPrevActivityPopped && isNextActivityPushed) { | ||
| output.push({ | ||
| _TAG: nextActivity.pushedBy.name === "Pushed" ? "PUSHED" : "REPLACED", | ||
| activity: nextActivity | ||
| }); | ||
| } | ||
| } | ||
| for (let j = Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1; j >= 0; j -= 1) { | ||
| const prevActivity = prevOutput.activities[j]; | ||
| const nextActivity = nextOutput.activities[j]; | ||
| const isPrevActivityPushed = (prevActivity == null ? void 0 : prevActivity.transitionState) === "enter-done" || (prevActivity == null ? void 0 : prevActivity.transitionState) === "enter-active"; | ||
| const isNextActivityPopped = (nextActivity == null ? void 0 : nextActivity.transitionState) === "exit-active" || (nextActivity == null ? void 0 : nextActivity.transitionState) === "exit-done"; | ||
| if (isPrevActivityPushed && isNextActivityPopped) { | ||
| output.push({ | ||
| _TAG: "POPPED", | ||
| activity: nextActivity | ||
| }); | ||
| } | ||
| } | ||
| return output; | ||
| } | ||
| var M=Object.create;var u=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames,y=Object.getOwnPropertySymbols,I=Object.getPrototypeOf,S=Object.prototype.hasOwnProperty,k=Object.prototype.propertyIsEnumerable;var D=(t,e,i)=>e in t?u(t,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):t[e]=i,v=(t,e)=>{for(var i in e||(e={}))S.call(e,i)&&D(t,i,e[i]);if(y)for(var i of y(e))k.call(e,i)&&D(t,i,e[i]);return t};var G=(t,e)=>{for(var i in e)u(t,i,{get:e[i],enumerable:!0})},T=(t,e,i,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of b(e))!S.call(t,a)&&a!==i&&u(t,a,{get:()=>e[a],enumerable:!(o=N(e,a))||o.enumerable});return t};var _=(t,e,i)=>(i=t!=null?M(I(t)):{},T(e||!t||!t.__esModule?u(i,"default",{value:t,enumerable:!0}):i,t)),z=t=>T(u({},"__esModule",{value:!0}),t);var C={};G(C,{aggregate:()=>B,id:()=>l,makeEvent:()=>P,produceEffects:()=>w});module.exports=z(C);function d(t,e){return t.filter(i=>i.name===e)}function g(t,e,i){let o=i(t),a=i(e);return o<a?-1:o===a?0:1}var x=new Map;function l(){let t=new Date().getTime().toString(),e=x.get(t),i=e!==void 0?e+1:0;return i===0&&(x=new Map),x.set(t,i),Number(`${t}${i.toString().padStart(2,"0")}`).toString(16)}function h(t,e){let i=new Map;return[...t].reverse().filter(o=>{let a=e(o);if(a===null)return!0;let n=!!i.get(a);return i.set(a,!0),!n}).reverse()}function P(t,e){return v({id:l(),name:t,eventDate:new Date().getTime()},e)}function A(t){if(t.length===0)throw new Error("events parameter is empty");let e=d(t,"Initialized"),i=d(t,"ActivityRegistered"),o=d(t,"Pushed");if(e.length>1)throw new Error("InitializedEvent can only exist once");let a=i.map(n=>n.activityName);o.forEach(n=>{if(!a.includes(n.activityName))throw new Error("the corresponding activity does not exist")})}function B(t,e){let i=h([...t].sort((r,s)=>g(r,s,p=>p.id)),r=>r.id);A(i);let o=d(i,"Initialized")[0],{transitionDuration:a}=o,n=[];i.forEach(r=>{switch(r.name){case"Pushed":{let s=e-r.eventDate>=a?"enter-done":"enter-active";n.push({id:r.activityId,name:r.activityName,transitionState:s,params:r.params,preloadRef:r.preloadRef,pushedBy:r,metadata:{poppedBy:null}});break}case"Replaced":{let s=e-r.eventDate>=a?"enter-done":"enter-active",p=n.filter(m=>m.metadata.poppedBy===null).sort((m,f)=>f.pushedBy.eventDate-m.pushedBy.eventDate)[0];n.push({id:r.activityId,name:r.activityName,transitionState:s,params:r.params,preloadRef:r.preloadRef,pushedBy:r,metadata:{poppedBy:null}}),p&&s==="enter-done"&&(p.metadata.poppedBy=r,p.transitionState="exit-done");break}case"Popped":{let s=n.filter((m,f)=>f>0).filter(m=>m.metadata.poppedBy===null).sort((m,f)=>f.pushedBy.eventDate-m.pushedBy.eventDate)[0],p=e-r.eventDate>=a?"exit-done":"exit-active";s&&(s.metadata.poppedBy=r,s.transitionState=p);break}default:break}});let c=n.find(r=>r.transitionState==="enter-active"||r.transitionState==="exit-active")?"loading":"idle";return{activities:h(n.map(r=>v({id:r.id,name:r.name,transitionState:r.transitionState,params:r.params,pushedBy:r.pushedBy},r.preloadRef?{preloadRef:r.preloadRef}:null)),r=>r.id).sort((r,s)=>g(r,s,p=>p.id)),transitionDuration:a,globalTransitionState:c}}var R=_(require("react-fast-compare"));function w(t,e){let i=[];(0,R.default)(t,e)||i.push({_TAG:"%SOMETHING_CHANGED%"});for(let o=0;o<Math.max(t.activities.length,e.activities.length);o+=1){let a=t.activities[o],n=e.activities[o];!a&&!!n&&i.push({_TAG:n.pushedBy.name==="Pushed"?"PUSHED":"REPLACED",activity:n});let c=(a==null?void 0:a.transitionState)==="exit-done"||(a==null?void 0:a.transitionState)==="exit-active",E=(n==null?void 0:n.transitionState)==="enter-active"||(n==null?void 0:n.transitionState)==="enter-done";c&&E&&i.push({_TAG:n.pushedBy.name==="Pushed"?"PUSHED":"REPLACED",activity:n})}for(let o=Math.max(t.activities.length,e.activities.length)-1;o>=0;o-=1){let a=t.activities[o],n=e.activities[o],c=(a==null?void 0:a.transitionState)==="enter-done"||(a==null?void 0:a.transitionState)==="enter-active",E=(n==null?void 0:n.transitionState)==="exit-active"||(n==null?void 0:n.transitionState)==="exit-done";c&&E&&i.push({_TAG:"POPPED",activity:n})}return i} | ||
| //# sourceMappingURL=index.js.map |
| { | ||
| "version": 3, | ||
| "sources": ["../src/index.ts", "../src/event-utils/filterEvents.ts", "../src/utils/compareBy.ts", "../src/utils/id.ts", "../src/utils/uniqBy.ts", "../src/event-utils/makeEvent.ts", "../src/event-utils/validateEvents.ts", "../src/aggregate.ts", "../src/produceEffects.ts"], | ||
| "sourcesContent": ["export { aggregate } from \"./aggregate\";\nexport {\n Activity,\n ActivityParams,\n ActivityTransitionState,\n AggregateOutput,\n} from \"./AggregateOutput\";\nexport { Effect } from \"./Effect\";\nexport { DomainEvent } from \"./event-types\";\nexport { DispatchEvent, makeEvent } from \"./event-utils\";\nexport * from \"./plugin-types\";\nexport { produceEffects } from \"./produceEffects\";\nexport { id } from \"./utils\";\n", "import { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "let counterMap = new Map<string, number>();\n\nexport function id() {\n const t = new Date().getTime().toString();\n\n const prevCounter = counterMap.get(t);\n const nextCounter = prevCounter !== undefined ? prevCounter + 1 : 0;\n\n if (nextCounter === 0) {\n counterMap = new Map();\n }\n\n counterMap.set(t, nextCounter);\n\n return Number(`${t}${nextCounter.toString().padStart(2, \"0\")}`).toString(16);\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { BaseDomainEvent } from \"../event-types/_base\";\nimport { id } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n name,\n eventDate: new Date().getTime(),\n ...parameters,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const registeredActivityNames = activityRegisteredEvents.map(\n (e) => e.activityName,\n );\n\n pushedEvents.forEach((e) => {\n if (!registeredActivityNames.includes(e.activityName)) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n });\n}\n", "import {\n Activity,\n ActivityTransitionState,\n AggregateOutput,\n} from \"./AggregateOutput\";\nimport { DomainEvent, PoppedEvent, ReplacedEvent } from \"./event-types\";\nimport { filterEvents, validateEvents } from \"./event-utils\";\nimport { compareBy, uniqBy } from \"./utils\";\n\nexport function aggregate(events: DomainEvent[], now: number): AggregateOutput {\n const sortedEvents = uniqBy(\n [...events].sort((a, b) => compareBy(a, b, (e) => e.id)),\n (e) => e.id,\n );\n\n validateEvents(sortedEvents);\n\n const initEvent = filterEvents(sortedEvents, \"Initialized\")[0];\n const { transitionDuration } = initEvent;\n\n type ActivityMetadata = {\n poppedBy: PoppedEvent | ReplacedEvent | null;\n };\n\n const activities: Array<\n Activity & {\n metadata: ActivityMetadata;\n }\n > = [];\n\n sortedEvents.forEach((event) => {\n switch (event.name) {\n case \"Pushed\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n break;\n }\n case \"Replaced\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n const targetActivity = activities\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n if (targetActivity && transitionState === \"enter-done\") {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = \"exit-done\";\n }\n\n break;\n }\n case \"Popped\": {\n const targetActivity = activities\n .filter((_, i) => i > 0)\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"exit-done\"\n : \"exit-active\";\n\n if (targetActivity) {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = transitionState;\n }\n\n break;\n }\n default: {\n break;\n }\n }\n });\n\n const globalTransitionState = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n )\n ? \"loading\"\n : \"idle\";\n\n const output: AggregateOutput = {\n activities: uniqBy(\n activities.map((activity) => ({\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n pushedBy: activity.pushedBy,\n })),\n (activity) => activity.id,\n ).sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n transitionDuration,\n globalTransitionState,\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport { AggregateOutput } from \"./AggregateOutput\";\nimport { Effect } from \"./Effect\";\n\nexport function produceEffects(\n prevOutput: AggregateOutput,\n nextOutput: AggregateOutput,\n): Effect[] {\n const output: Effect[] = [];\n\n if (!isEqual(prevOutput, nextOutput)) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n if (!prevActivity && !!nextActivity) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const prevActivity = prevOutput.activities[j];\n const nextActivity = nextOutput.activities[j];\n\n const isPrevActivityPushed =\n prevActivity?.transitionState === \"enter-done\" ||\n prevActivity?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextActivity?.transitionState === \"exit-active\" ||\n nextActivity?.transitionState === \"exit-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextActivity,\n });\n }\n }\n\n return output;\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["export { aggregate } from \"./aggregate\";\nexport {\n Activity,\n ActivityParams,\n ActivityTransitionState,\n AggregateOutput,\n} from \"./AggregateOutput\";\nexport { Effect } from \"./Effect\";\nexport { DomainEvent } from \"./event-types\";\nexport { DispatchEvent, makeEvent } from \"./event-utils\";\nexport * from \"./plugin-types\";\nexport { produceEffects } from \"./produceEffects\";\nexport { id } from \"./utils\";\n", "import { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "let counterMap = new Map<string, number>();\n\nexport function id() {\n const t = new Date().getTime().toString();\n\n const prevCounter = counterMap.get(t);\n const nextCounter = prevCounter !== undefined ? prevCounter + 1 : 0;\n\n if (nextCounter === 0) {\n counterMap = new Map();\n }\n\n counterMap.set(t, nextCounter);\n\n return Number(`${t}${nextCounter.toString().padStart(2, \"0\")}`).toString(16);\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { BaseDomainEvent } from \"../event-types/_base\";\nimport { id } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n name,\n eventDate: new Date().getTime(),\n ...parameters,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const registeredActivityNames = activityRegisteredEvents.map(\n (e) => e.activityName,\n );\n\n pushedEvents.forEach((e) => {\n if (!registeredActivityNames.includes(e.activityName)) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n });\n}\n", "import {\n Activity,\n ActivityTransitionState,\n AggregateOutput,\n} from \"./AggregateOutput\";\nimport { DomainEvent, PoppedEvent, ReplacedEvent } from \"./event-types\";\nimport { filterEvents, validateEvents } from \"./event-utils\";\nimport { compareBy, uniqBy } from \"./utils\";\n\nexport function aggregate(events: DomainEvent[], now: number): AggregateOutput {\n const sortedEvents = uniqBy(\n [...events].sort((a, b) => compareBy(a, b, (e) => e.id)),\n (e) => e.id,\n );\n\n validateEvents(sortedEvents);\n\n const initEvent = filterEvents(sortedEvents, \"Initialized\")[0];\n const { transitionDuration } = initEvent;\n\n type ActivityMetadata = {\n poppedBy: PoppedEvent | ReplacedEvent | null;\n };\n\n const activities: Array<\n Activity & {\n metadata: ActivityMetadata;\n }\n > = [];\n\n sortedEvents.forEach((event) => {\n switch (event.name) {\n case \"Pushed\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n preloadRef: event.preloadRef,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n break;\n }\n case \"Replaced\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n const targetActivity = activities\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n preloadRef: event.preloadRef,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n if (targetActivity && transitionState === \"enter-done\") {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = \"exit-done\";\n }\n\n break;\n }\n case \"Popped\": {\n const targetActivity = activities\n .filter((_, i) => i > 0)\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"exit-done\"\n : \"exit-active\";\n\n if (targetActivity) {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = transitionState;\n }\n\n break;\n }\n default: {\n break;\n }\n }\n });\n\n const globalTransitionState = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n )\n ? \"loading\"\n : \"idle\";\n\n const output: AggregateOutput = {\n activities: uniqBy(\n activities.map((activity) => ({\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n pushedBy: activity.pushedBy,\n ...(activity.preloadRef\n ? {\n preloadRef: activity.preloadRef,\n }\n : null),\n })),\n (activity) => activity.id,\n ).sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n transitionDuration,\n globalTransitionState,\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport { AggregateOutput } from \"./AggregateOutput\";\nimport { Effect } from \"./Effect\";\n\nexport function produceEffects(\n prevOutput: AggregateOutput,\n nextOutput: AggregateOutput,\n): Effect[] {\n const output: Effect[] = [];\n\n if (!isEqual(prevOutput, nextOutput)) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n if (!prevActivity && !!nextActivity) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const prevActivity = prevOutput.activities[j];\n const nextActivity = nextOutput.activities[j];\n\n const isPrevActivityPushed =\n prevActivity?.transitionState === \"enter-done\" ||\n prevActivity?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextActivity?.transitionState === \"exit-active\" ||\n nextActivity?.transitionState === \"exit-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextActivity,\n });\n }\n }\n\n return output;\n}\n"], | ||
| "mappings": "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", | ||
| "names": [] | ||
| } |
+1
-208
@@ -1,209 +0,2 @@ | ||
| var __defProp = Object.defineProperty; | ||
| var __getOwnPropSymbols = Object.getOwnPropertySymbols; | ||
| var __hasOwnProp = Object.prototype.hasOwnProperty; | ||
| var __propIsEnum = Object.prototype.propertyIsEnumerable; | ||
| var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; | ||
| var __spreadValues = (a, b) => { | ||
| for (var prop in b || (b = {})) | ||
| if (__hasOwnProp.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| if (__getOwnPropSymbols) | ||
| for (var prop of __getOwnPropSymbols(b)) { | ||
| if (__propIsEnum.call(b, prop)) | ||
| __defNormalProp(a, prop, b[prop]); | ||
| } | ||
| return a; | ||
| }; | ||
| // src/event-utils/filterEvents.ts | ||
| function filterEvents(events, eventName) { | ||
| return events.filter((e) => e.name === eventName); | ||
| } | ||
| // src/utils/compareBy.ts | ||
| function compareBy(a, b, selector) { | ||
| const $a = selector(a); | ||
| const $b = selector(b); | ||
| if ($a < $b) { | ||
| return -1; | ||
| } | ||
| if ($a === $b) { | ||
| return 0; | ||
| } | ||
| return 1; | ||
| } | ||
| // src/utils/id.ts | ||
| var counterMap = /* @__PURE__ */ new Map(); | ||
| function id() { | ||
| const t = new Date().getTime().toString(); | ||
| const prevCounter = counterMap.get(t); | ||
| const nextCounter = prevCounter !== void 0 ? prevCounter + 1 : 0; | ||
| if (nextCounter === 0) { | ||
| counterMap = /* @__PURE__ */ new Map(); | ||
| } | ||
| counterMap.set(t, nextCounter); | ||
| return Number(`${t}${nextCounter.toString().padStart(2, "0")}`).toString(16); | ||
| } | ||
| // src/utils/uniqBy.ts | ||
| function uniqBy(arr, by) { | ||
| const valueMap = /* @__PURE__ */ new Map(); | ||
| return [...arr].reverse().filter((item) => { | ||
| const key = by(item); | ||
| if (key === null) { | ||
| return true; | ||
| } | ||
| const exists = !!valueMap.get(key); | ||
| valueMap.set(key, true); | ||
| return !exists; | ||
| }).reverse(); | ||
| } | ||
| // src/event-utils/makeEvent.ts | ||
| function makeEvent(name, parameters) { | ||
| return __spreadValues({ | ||
| id: id(), | ||
| name, | ||
| eventDate: new Date().getTime() | ||
| }, parameters); | ||
| } | ||
| // src/event-utils/validateEvents.ts | ||
| function validateEvents(events) { | ||
| if (events.length === 0) { | ||
| throw new Error("events parameter is empty"); | ||
| } | ||
| const initEvents = filterEvents(events, "Initialized"); | ||
| const activityRegisteredEvents = filterEvents(events, "ActivityRegistered"); | ||
| const pushedEvents = filterEvents(events, "Pushed"); | ||
| if (initEvents.length > 1) { | ||
| throw new Error("InitializedEvent can only exist once"); | ||
| } | ||
| const registeredActivityNames = activityRegisteredEvents.map((e) => e.activityName); | ||
| pushedEvents.forEach((e) => { | ||
| if (!registeredActivityNames.includes(e.activityName)) { | ||
| throw new Error("the corresponding activity does not exist"); | ||
| } | ||
| }); | ||
| } | ||
| // src/aggregate.ts | ||
| function aggregate(events, now) { | ||
| const sortedEvents = uniqBy([...events].sort((a, b) => compareBy(a, b, (e) => e.id)), (e) => e.id); | ||
| validateEvents(sortedEvents); | ||
| const initEvent = filterEvents(sortedEvents, "Initialized")[0]; | ||
| const { transitionDuration } = initEvent; | ||
| const activities = []; | ||
| sortedEvents.forEach((event) => { | ||
| switch (event.name) { | ||
| case "Pushed": { | ||
| const transitionState = now - event.eventDate >= transitionDuration ? "enter-done" : "enter-active"; | ||
| activities.push({ | ||
| id: event.activityId, | ||
| name: event.activityName, | ||
| transitionState, | ||
| params: event.params, | ||
| pushedBy: event, | ||
| metadata: { | ||
| poppedBy: null | ||
| } | ||
| }); | ||
| break; | ||
| } | ||
| case "Replaced": { | ||
| const transitionState = now - event.eventDate >= transitionDuration ? "enter-done" : "enter-active"; | ||
| const targetActivity = activities.filter((activity) => activity.metadata.poppedBy === null).sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0]; | ||
| activities.push({ | ||
| id: event.activityId, | ||
| name: event.activityName, | ||
| transitionState, | ||
| params: event.params, | ||
| pushedBy: event, | ||
| metadata: { | ||
| poppedBy: null | ||
| } | ||
| }); | ||
| if (targetActivity && transitionState === "enter-done") { | ||
| targetActivity.metadata.poppedBy = event; | ||
| targetActivity.transitionState = "exit-done"; | ||
| } | ||
| break; | ||
| } | ||
| case "Popped": { | ||
| const targetActivity = activities.filter((_, i) => i > 0).filter((activity) => activity.metadata.poppedBy === null).sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0]; | ||
| const transitionState = now - event.eventDate >= transitionDuration ? "exit-done" : "exit-active"; | ||
| if (targetActivity) { | ||
| targetActivity.metadata.poppedBy = event; | ||
| targetActivity.transitionState = transitionState; | ||
| } | ||
| break; | ||
| } | ||
| default: { | ||
| break; | ||
| } | ||
| } | ||
| }); | ||
| const globalTransitionState = activities.find((activity) => activity.transitionState === "enter-active" || activity.transitionState === "exit-active") ? "loading" : "idle"; | ||
| const output = { | ||
| activities: uniqBy(activities.map((activity) => ({ | ||
| id: activity.id, | ||
| name: activity.name, | ||
| transitionState: activity.transitionState, | ||
| params: activity.params, | ||
| pushedBy: activity.pushedBy | ||
| })), (activity) => activity.id).sort((a, b) => compareBy(a, b, (activity) => activity.id)), | ||
| transitionDuration, | ||
| globalTransitionState | ||
| }; | ||
| return output; | ||
| } | ||
| // src/produceEffects.ts | ||
| import isEqual from "react-fast-compare"; | ||
| function produceEffects(prevOutput, nextOutput) { | ||
| const output = []; | ||
| if (!isEqual(prevOutput, nextOutput)) { | ||
| output.push({ | ||
| _TAG: "%SOMETHING_CHANGED%" | ||
| }); | ||
| } | ||
| for (let i = 0; i < Math.max(prevOutput.activities.length, nextOutput.activities.length); i += 1) { | ||
| const prevActivity = prevOutput.activities[i]; | ||
| const nextActivity = nextOutput.activities[i]; | ||
| if (!prevActivity && !!nextActivity) { | ||
| output.push({ | ||
| _TAG: nextActivity.pushedBy.name === "Pushed" ? "PUSHED" : "REPLACED", | ||
| activity: nextActivity | ||
| }); | ||
| } | ||
| const isPrevActivityPopped = (prevActivity == null ? void 0 : prevActivity.transitionState) === "exit-done" || (prevActivity == null ? void 0 : prevActivity.transitionState) === "exit-active"; | ||
| const isNextActivityPushed = (nextActivity == null ? void 0 : nextActivity.transitionState) === "enter-active" || (nextActivity == null ? void 0 : nextActivity.transitionState) === "enter-done"; | ||
| if (isPrevActivityPopped && isNextActivityPushed) { | ||
| output.push({ | ||
| _TAG: nextActivity.pushedBy.name === "Pushed" ? "PUSHED" : "REPLACED", | ||
| activity: nextActivity | ||
| }); | ||
| } | ||
| } | ||
| for (let j = Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1; j >= 0; j -= 1) { | ||
| const prevActivity = prevOutput.activities[j]; | ||
| const nextActivity = nextOutput.activities[j]; | ||
| const isPrevActivityPushed = (prevActivity == null ? void 0 : prevActivity.transitionState) === "enter-done" || (prevActivity == null ? void 0 : prevActivity.transitionState) === "enter-active"; | ||
| const isNextActivityPopped = (nextActivity == null ? void 0 : nextActivity.transitionState) === "exit-active" || (nextActivity == null ? void 0 : nextActivity.transitionState) === "exit-done"; | ||
| if (isPrevActivityPushed && isNextActivityPopped) { | ||
| output.push({ | ||
| _TAG: "POPPED", | ||
| activity: nextActivity | ||
| }); | ||
| } | ||
| } | ||
| return output; | ||
| } | ||
| export { | ||
| aggregate, | ||
| id, | ||
| makeEvent, | ||
| produceEffects | ||
| }; | ||
| var S=Object.defineProperty;var h=Object.getOwnPropertySymbols;var T=Object.prototype.hasOwnProperty,P=Object.prototype.propertyIsEnumerable;var y=(r,i,e)=>i in r?S(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e,E=(r,i)=>{for(var e in i||(i={}))T.call(i,e)&&y(r,e,i[e]);if(h)for(var e of h(i))P.call(i,e)&&y(r,e,i[e]);return r};function d(r,i){return r.filter(e=>e.name===i)}function v(r,i,e){let o=e(r),n=e(i);return o<n?-1:o===n?0:1}var l=new Map;function g(){let r=new Date().getTime().toString(),i=l.get(r),e=i!==void 0?i+1:0;return e===0&&(l=new Map),l.set(r,e),Number(`${r}${e.toString().padStart(2,"0")}`).toString(16)}function x(r,i){let e=new Map;return[...r].reverse().filter(o=>{let n=i(o);if(n===null)return!0;let a=!!e.get(n);return e.set(n,!0),!a}).reverse()}function A(r,i){return E({id:g(),name:r,eventDate:new Date().getTime()},i)}function D(r){if(r.length===0)throw new Error("events parameter is empty");let i=d(r,"Initialized"),e=d(r,"ActivityRegistered"),o=d(r,"Pushed");if(i.length>1)throw new Error("InitializedEvent can only exist once");let n=e.map(a=>a.activityName);o.forEach(a=>{if(!n.includes(a.activityName))throw new Error("the corresponding activity does not exist")})}function B(r,i){let e=x([...r].sort((t,s)=>v(t,s,p=>p.id)),t=>t.id);D(e);let o=d(e,"Initialized")[0],{transitionDuration:n}=o,a=[];e.forEach(t=>{switch(t.name){case"Pushed":{let s=i-t.eventDate>=n?"enter-done":"enter-active";a.push({id:t.activityId,name:t.activityName,transitionState:s,params:t.params,preloadRef:t.preloadRef,pushedBy:t,metadata:{poppedBy:null}});break}case"Replaced":{let s=i-t.eventDate>=n?"enter-done":"enter-active",p=a.filter(m=>m.metadata.poppedBy===null).sort((m,f)=>f.pushedBy.eventDate-m.pushedBy.eventDate)[0];a.push({id:t.activityId,name:t.activityName,transitionState:s,params:t.params,preloadRef:t.preloadRef,pushedBy:t,metadata:{poppedBy:null}}),p&&s==="enter-done"&&(p.metadata.poppedBy=t,p.transitionState="exit-done");break}case"Popped":{let s=a.filter((m,f)=>f>0).filter(m=>m.metadata.poppedBy===null).sort((m,f)=>f.pushedBy.eventDate-m.pushedBy.eventDate)[0],p=i-t.eventDate>=n?"exit-done":"exit-active";s&&(s.metadata.poppedBy=t,s.transitionState=p);break}default:break}});let c=a.find(t=>t.transitionState==="enter-active"||t.transitionState==="exit-active")?"loading":"idle";return{activities:x(a.map(t=>E({id:t.id,name:t.name,transitionState:t.transitionState,params:t.params,pushedBy:t.pushedBy},t.preloadRef?{preloadRef:t.preloadRef}:null)),t=>t.id).sort((t,s)=>v(t,s,p=>p.id)),transitionDuration:n,globalTransitionState:c}}import R from"react-fast-compare";function w(r,i){let e=[];R(r,i)||e.push({_TAG:"%SOMETHING_CHANGED%"});for(let o=0;o<Math.max(r.activities.length,i.activities.length);o+=1){let n=r.activities[o],a=i.activities[o];!n&&!!a&&e.push({_TAG:a.pushedBy.name==="Pushed"?"PUSHED":"REPLACED",activity:a});let c=(n==null?void 0:n.transitionState)==="exit-done"||(n==null?void 0:n.transitionState)==="exit-active",u=(a==null?void 0:a.transitionState)==="enter-active"||(a==null?void 0:a.transitionState)==="enter-done";c&&u&&e.push({_TAG:a.pushedBy.name==="Pushed"?"PUSHED":"REPLACED",activity:a})}for(let o=Math.max(r.activities.length,i.activities.length)-1;o>=0;o-=1){let n=r.activities[o],a=i.activities[o],c=(n==null?void 0:n.transitionState)==="enter-done"||(n==null?void 0:n.transitionState)==="enter-active",u=(a==null?void 0:a.transitionState)==="exit-active"||(a==null?void 0:a.transitionState)==="exit-done";c&&u&&e.push({_TAG:"POPPED",activity:a})}return e}export{B as aggregate,g as id,A as makeEvent,w as produceEffects}; | ||
| //# sourceMappingURL=index.mjs.map |
| { | ||
| "version": 3, | ||
| "sources": ["../src/event-utils/filterEvents.ts", "../src/utils/compareBy.ts", "../src/utils/id.ts", "../src/utils/uniqBy.ts", "../src/event-utils/makeEvent.ts", "../src/event-utils/validateEvents.ts", "../src/aggregate.ts", "../src/produceEffects.ts"], | ||
| "sourcesContent": ["import { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "let counterMap = new Map<string, number>();\n\nexport function id() {\n const t = new Date().getTime().toString();\n\n const prevCounter = counterMap.get(t);\n const nextCounter = prevCounter !== undefined ? prevCounter + 1 : 0;\n\n if (nextCounter === 0) {\n counterMap = new Map();\n }\n\n counterMap.set(t, nextCounter);\n\n return Number(`${t}${nextCounter.toString().padStart(2, \"0\")}`).toString(16);\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { BaseDomainEvent } from \"../event-types/_base\";\nimport { id } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n name,\n eventDate: new Date().getTime(),\n ...parameters,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const registeredActivityNames = activityRegisteredEvents.map(\n (e) => e.activityName,\n );\n\n pushedEvents.forEach((e) => {\n if (!registeredActivityNames.includes(e.activityName)) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n });\n}\n", "import {\n Activity,\n ActivityTransitionState,\n AggregateOutput,\n} from \"./AggregateOutput\";\nimport { DomainEvent, PoppedEvent, ReplacedEvent } from \"./event-types\";\nimport { filterEvents, validateEvents } from \"./event-utils\";\nimport { compareBy, uniqBy } from \"./utils\";\n\nexport function aggregate(events: DomainEvent[], now: number): AggregateOutput {\n const sortedEvents = uniqBy(\n [...events].sort((a, b) => compareBy(a, b, (e) => e.id)),\n (e) => e.id,\n );\n\n validateEvents(sortedEvents);\n\n const initEvent = filterEvents(sortedEvents, \"Initialized\")[0];\n const { transitionDuration } = initEvent;\n\n type ActivityMetadata = {\n poppedBy: PoppedEvent | ReplacedEvent | null;\n };\n\n const activities: Array<\n Activity & {\n metadata: ActivityMetadata;\n }\n > = [];\n\n sortedEvents.forEach((event) => {\n switch (event.name) {\n case \"Pushed\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n break;\n }\n case \"Replaced\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n const targetActivity = activities\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n if (targetActivity && transitionState === \"enter-done\") {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = \"exit-done\";\n }\n\n break;\n }\n case \"Popped\": {\n const targetActivity = activities\n .filter((_, i) => i > 0)\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"exit-done\"\n : \"exit-active\";\n\n if (targetActivity) {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = transitionState;\n }\n\n break;\n }\n default: {\n break;\n }\n }\n });\n\n const globalTransitionState = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n )\n ? \"loading\"\n : \"idle\";\n\n const output: AggregateOutput = {\n activities: uniqBy(\n activities.map((activity) => ({\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n pushedBy: activity.pushedBy,\n })),\n (activity) => activity.id,\n ).sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n transitionDuration,\n globalTransitionState,\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport { AggregateOutput } from \"./AggregateOutput\";\nimport { Effect } from \"./Effect\";\n\nexport function produceEffects(\n prevOutput: AggregateOutput,\n nextOutput: AggregateOutput,\n): Effect[] {\n const output: Effect[] = [];\n\n if (!isEqual(prevOutput, nextOutput)) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n if (!prevActivity && !!nextActivity) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const prevActivity = prevOutput.activities[j];\n const nextActivity = nextOutput.activities[j];\n\n const isPrevActivityPushed =\n prevActivity?.transitionState === \"enter-done\" ||\n prevActivity?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextActivity?.transitionState === \"exit-active\" ||\n nextActivity?.transitionState === \"exit-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextActivity,\n });\n }\n }\n\n return output;\n}\n"], | ||
| "mappings": "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", | ||
| "sourcesContent": ["import { DomainEvent } from \"../event-types\";\n\nexport function filterEvents<T extends DomainEvent[\"name\"]>(\n events: DomainEvent[],\n eventName: T,\n) {\n return events.filter((e) => e.name === eventName) as Array<\n Extract<DomainEvent, { name: T }>\n >;\n}\n", "export function compareBy<T>(a: T, b: T, selector: (element: T) => string) {\n const $a = selector(a);\n const $b = selector(b);\n\n if ($a < $b) {\n return -1;\n }\n if ($a === $b) {\n return 0;\n }\n return 1;\n}\n", "let counterMap = new Map<string, number>();\n\nexport function id() {\n const t = new Date().getTime().toString();\n\n const prevCounter = counterMap.get(t);\n const nextCounter = prevCounter !== undefined ? prevCounter + 1 : 0;\n\n if (nextCounter === 0) {\n counterMap = new Map();\n }\n\n counterMap.set(t, nextCounter);\n\n return Number(`${t}${nextCounter.toString().padStart(2, \"0\")}`).toString(16);\n}\n", "export function uniqBy<T>(arr: T[], by: (item: T) => string | null): T[] {\n const valueMap = new Map<string, true>();\n\n return [...arr]\n .reverse()\n .filter((item) => {\n const key = by(item);\n\n if (key === null) {\n return true;\n }\n\n const exists = !!valueMap.get(key);\n valueMap.set(key, true);\n\n return !exists;\n })\n .reverse();\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { BaseDomainEvent } from \"../event-types/_base\";\nimport { id } from \"../utils\";\n\nexport function makeEvent<T extends DomainEvent[\"name\"]>(\n name: T,\n parameters: Omit<\n Extract<DomainEvent, { name: T }>,\n \"id\" | \"name\" | \"eventDate\"\n > &\n Partial<BaseDomainEvent>,\n) {\n return {\n id: id(),\n name,\n eventDate: new Date().getTime(),\n ...parameters,\n } as Extract<DomainEvent, { name: T }>;\n}\n", "import { DomainEvent } from \"../event-types\";\nimport { filterEvents } from \"./filterEvents\";\n\nexport function validateEvents(events: DomainEvent[]) {\n if (events.length === 0) {\n throw new Error(\"events parameter is empty\");\n }\n\n const initEvents = filterEvents(events, \"Initialized\");\n const activityRegisteredEvents = filterEvents(events, \"ActivityRegistered\");\n const pushedEvents = filterEvents(events, \"Pushed\");\n\n if (initEvents.length > 1) {\n throw new Error(\"InitializedEvent can only exist once\");\n }\n\n const registeredActivityNames = activityRegisteredEvents.map(\n (e) => e.activityName,\n );\n\n pushedEvents.forEach((e) => {\n if (!registeredActivityNames.includes(e.activityName)) {\n throw new Error(\"the corresponding activity does not exist\");\n }\n });\n}\n", "import {\n Activity,\n ActivityTransitionState,\n AggregateOutput,\n} from \"./AggregateOutput\";\nimport { DomainEvent, PoppedEvent, ReplacedEvent } from \"./event-types\";\nimport { filterEvents, validateEvents } from \"./event-utils\";\nimport { compareBy, uniqBy } from \"./utils\";\n\nexport function aggregate(events: DomainEvent[], now: number): AggregateOutput {\n const sortedEvents = uniqBy(\n [...events].sort((a, b) => compareBy(a, b, (e) => e.id)),\n (e) => e.id,\n );\n\n validateEvents(sortedEvents);\n\n const initEvent = filterEvents(sortedEvents, \"Initialized\")[0];\n const { transitionDuration } = initEvent;\n\n type ActivityMetadata = {\n poppedBy: PoppedEvent | ReplacedEvent | null;\n };\n\n const activities: Array<\n Activity & {\n metadata: ActivityMetadata;\n }\n > = [];\n\n sortedEvents.forEach((event) => {\n switch (event.name) {\n case \"Pushed\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n preloadRef: event.preloadRef,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n break;\n }\n case \"Replaced\": {\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"enter-done\"\n : \"enter-active\";\n\n const targetActivity = activities\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n activities.push({\n id: event.activityId,\n name: event.activityName,\n transitionState,\n params: event.params,\n preloadRef: event.preloadRef,\n pushedBy: event,\n metadata: {\n poppedBy: null,\n },\n });\n\n if (targetActivity && transitionState === \"enter-done\") {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = \"exit-done\";\n }\n\n break;\n }\n case \"Popped\": {\n const targetActivity = activities\n .filter((_, i) => i > 0)\n .filter((activity) => activity.metadata.poppedBy === null)\n .sort((a1, a2) => a2.pushedBy.eventDate - a1.pushedBy.eventDate)[0];\n\n const transitionState: ActivityTransitionState =\n now - event.eventDate >= transitionDuration\n ? \"exit-done\"\n : \"exit-active\";\n\n if (targetActivity) {\n targetActivity.metadata.poppedBy = event;\n targetActivity.transitionState = transitionState;\n }\n\n break;\n }\n default: {\n break;\n }\n }\n });\n\n const globalTransitionState = activities.find(\n (activity) =>\n activity.transitionState === \"enter-active\" ||\n activity.transitionState === \"exit-active\",\n )\n ? \"loading\"\n : \"idle\";\n\n const output: AggregateOutput = {\n activities: uniqBy(\n activities.map((activity) => ({\n id: activity.id,\n name: activity.name,\n transitionState: activity.transitionState,\n params: activity.params,\n pushedBy: activity.pushedBy,\n ...(activity.preloadRef\n ? {\n preloadRef: activity.preloadRef,\n }\n : null),\n })),\n (activity) => activity.id,\n ).sort((a, b) => compareBy(a, b, (activity) => activity.id)),\n transitionDuration,\n globalTransitionState,\n };\n\n return output;\n}\n", "import isEqual from \"react-fast-compare\";\n\nimport { AggregateOutput } from \"./AggregateOutput\";\nimport { Effect } from \"./Effect\";\n\nexport function produceEffects(\n prevOutput: AggregateOutput,\n nextOutput: AggregateOutput,\n): Effect[] {\n const output: Effect[] = [];\n\n if (!isEqual(prevOutput, nextOutput)) {\n output.push({\n _TAG: \"%SOMETHING_CHANGED%\",\n });\n }\n\n for (\n let i = 0;\n i < Math.max(prevOutput.activities.length, nextOutput.activities.length);\n i += 1\n ) {\n const prevActivity = prevOutput.activities[i];\n const nextActivity = nextOutput.activities[i];\n\n if (!prevActivity && !!nextActivity) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n\n const isPrevActivityPopped =\n prevActivity?.transitionState === \"exit-done\" ||\n prevActivity?.transitionState === \"exit-active\";\n const isNextActivityPushed =\n nextActivity?.transitionState === \"enter-active\" ||\n nextActivity?.transitionState === \"enter-done\";\n\n if (isPrevActivityPopped && isNextActivityPushed) {\n output.push({\n _TAG: nextActivity.pushedBy.name === \"Pushed\" ? \"PUSHED\" : \"REPLACED\",\n activity: nextActivity,\n });\n }\n }\n for (\n let j =\n Math.max(prevOutput.activities.length, nextOutput.activities.length) - 1;\n j >= 0;\n j -= 1\n ) {\n const prevActivity = prevOutput.activities[j];\n const nextActivity = nextOutput.activities[j];\n\n const isPrevActivityPushed =\n prevActivity?.transitionState === \"enter-done\" ||\n prevActivity?.transitionState === \"enter-active\";\n const isNextActivityPopped =\n nextActivity?.transitionState === \"exit-active\" ||\n nextActivity?.transitionState === \"exit-done\";\n\n if (isPrevActivityPushed && isNextActivityPopped) {\n output.push({\n _TAG: \"POPPED\",\n activity: nextActivity,\n });\n }\n }\n\n return output;\n}\n"], | ||
| "mappings": "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", | ||
| "names": [] | ||
| } |
@@ -1,2 +0,3 @@ | ||
| import { PushedEvent } from "../event-types"; | ||
| import { PoppedEvent, PushedEvent, ReplacedEvent } from "../event-types"; | ||
| import { BaseDomainEvent } from "../event-types/_base"; | ||
| import { StackflowPluginHook, StackflowPluginPostEffectHook, StackflowPluginPreEffectHook } from "./StackflowPluginHook"; | ||
@@ -17,11 +18,11 @@ export declare type StackflowPlugin = (args: { | ||
| */ | ||
| onBeforePop?: StackflowPluginPreEffectHook; | ||
| onBeforePop?: StackflowPluginPreEffectHook<Omit<PoppedEvent, keyof BaseDomainEvent>>; | ||
| /** | ||
| * Called before the `push()` function of `useActions()` is called and the corresponding signal is delivered to the core | ||
| */ | ||
| onBeforePush?: StackflowPluginPreEffectHook; | ||
| onBeforePush?: StackflowPluginPreEffectHook<Omit<PushedEvent, keyof BaseDomainEvent>>; | ||
| /** | ||
| * Called before the `replace()` function of `useActions()` is called and the corresponding signal is delivered to the core | ||
| */ | ||
| onBeforeReplace?: StackflowPluginPreEffectHook; | ||
| onBeforeReplace?: StackflowPluginPreEffectHook<Omit<ReplacedEvent, keyof BaseDomainEvent>>; | ||
| /** | ||
@@ -28,0 +29,0 @@ * Called when the push procedure is complete and the actual rendering is finished |
@@ -6,5 +6,7 @@ import { Effect } from "../Effect"; | ||
| }) => void; | ||
| export declare type StackflowPluginPreEffectHook = (args: { | ||
| export declare type StackflowPluginPreEffectHook<T> = (args: { | ||
| params: T; | ||
| actions: StackflowPluginActions & { | ||
| preventDefault: () => void; | ||
| overrideParams: (params: T) => void; | ||
| }; | ||
@@ -11,0 +13,0 @@ }) => void; |
+2
-2
| { | ||
| "name": "@stackflow/core", | ||
| "version": "0.2.1", | ||
| "version": "0.2.2-alpha.7+52009b0", | ||
| "license": "Apache-2.0", | ||
@@ -59,3 +59,3 @@ "exports": { | ||
| }, | ||
| "gitHead": "6b5c4740eec8b308476b36dbd9261fbdad6251f5" | ||
| "gitHead": "52009b02923329f3ea2a0dd451c0f30db63580d6" | ||
| } |
+108
-1
@@ -966,3 +966,2 @@ import { aggregate } from "./aggregate"; | ||
| }, | ||
| pushedBy: pushedEvent, | ||
@@ -1120,1 +1119,109 @@ }, | ||
| }); | ||
| test("aggregate - preloadRef와 함께 푸시하면 스택에 추가됩니다", () => { | ||
| const events = [ | ||
| initializedEvent({ | ||
| transitionDuration: 300, | ||
| }), | ||
| registeredEvent({ | ||
| activityName: "home", | ||
| }), | ||
| registeredEvent({ | ||
| activityName: "sample", | ||
| }), | ||
| makeEvent("Pushed", { | ||
| activityId: "a1", | ||
| activityName: "sample", | ||
| eventDate: enoughPastTime(), | ||
| params: {}, | ||
| preloadRef: { | ||
| hello: "world", | ||
| }, | ||
| }), | ||
| ]; | ||
| const pushedEvent = events[3]; | ||
| const output = aggregate(events, nowTime()); | ||
| expect(output).toStrictEqual({ | ||
| activities: [ | ||
| { | ||
| id: "a1", | ||
| name: "sample", | ||
| transitionState: "enter-done", | ||
| params: {}, | ||
| preloadRef: { | ||
| hello: "world", | ||
| }, | ||
| pushedBy: pushedEvent, | ||
| }, | ||
| ], | ||
| transitionDuration: 300, | ||
| globalTransitionState: "idle", | ||
| }); | ||
| }); | ||
| test("aggregate - preloadRef와 함께 ReplacedEvent가 발생한 직후 최상단의 Activity를 유지하면서 preloadRef를 가진 새 Activity가 추가됩니다", () => { | ||
| const t = nowTime(); | ||
| const events = [ | ||
| initializedEvent({ | ||
| transitionDuration: 300, | ||
| }), | ||
| registeredEvent({ | ||
| activityName: "sample", | ||
| }), | ||
| makeEvent("Pushed", { | ||
| activityId: "a1", | ||
| activityName: "sample", | ||
| eventDate: enoughPastTime(), | ||
| params: { | ||
| hello: "world", | ||
| }, | ||
| }), | ||
| makeEvent("Replaced", { | ||
| activityId: "a2", | ||
| activityName: "sample", | ||
| eventDate: t, | ||
| params: { | ||
| hello: "world", | ||
| }, | ||
| preloadRef: { | ||
| hello: "world2", | ||
| }, | ||
| }), | ||
| ]; | ||
| const pushedEvent = events[2]; | ||
| const replacedEvent = events[3]; | ||
| const output = aggregate(events, t); | ||
| expect(output).toStrictEqual({ | ||
| activities: [ | ||
| { | ||
| id: "a1", | ||
| name: "sample", | ||
| transitionState: "enter-done", | ||
| params: { | ||
| hello: "world", | ||
| }, | ||
| pushedBy: pushedEvent, | ||
| }, | ||
| { | ||
| id: "a2", | ||
| name: "sample", | ||
| transitionState: "enter-active", | ||
| params: { | ||
| hello: "world", | ||
| }, | ||
| preloadRef: { | ||
| hello: "world2", | ||
| }, | ||
| pushedBy: replacedEvent, | ||
| }, | ||
| ], | ||
| transitionDuration: 300, | ||
| globalTransitionState: "loading", | ||
| }); | ||
| }); |
+7
-0
@@ -44,2 +44,3 @@ import { | ||
| params: event.params, | ||
| preloadRef: event.preloadRef, | ||
| pushedBy: event, | ||
@@ -68,2 +69,3 @@ metadata: { | ||
| params: event.params, | ||
| preloadRef: event.preloadRef, | ||
| pushedBy: event, | ||
@@ -122,2 +124,7 @@ metadata: { | ||
| pushedBy: activity.pushedBy, | ||
| ...(activity.preloadRef | ||
| ? { | ||
| preloadRef: activity.preloadRef, | ||
| } | ||
| : null), | ||
| })), | ||
@@ -124,0 +131,0 @@ (activity) => activity.id, |
@@ -18,2 +18,3 @@ import { PushedEvent, ReplacedEvent } from "./event-types"; | ||
| params: ActivityParams; | ||
| preloadRef?: unknown; | ||
| pushedBy: PushedEvent | ReplacedEvent; | ||
@@ -20,0 +21,0 @@ }; |
@@ -13,3 +13,4 @@ import { BaseDomainEvent } from "./_base"; | ||
| params: PushedEventParams; | ||
| preloadRef?: unknown; | ||
| } | ||
| >; |
@@ -13,3 +13,4 @@ import { BaseDomainEvent } from "./_base"; | ||
| params: ReplacedEventParams; | ||
| preloadRef?: unknown; | ||
| } | ||
| >; |
@@ -1,2 +0,3 @@ | ||
| import { PushedEvent } from "../event-types"; | ||
| import { PoppedEvent, PushedEvent, ReplacedEvent } from "../event-types"; | ||
| import { BaseDomainEvent } from "../event-types/_base"; | ||
| import { | ||
@@ -22,3 +23,5 @@ StackflowPluginHook, | ||
| */ | ||
| onBeforePop?: StackflowPluginPreEffectHook; | ||
| onBeforePop?: StackflowPluginPreEffectHook< | ||
| Omit<PoppedEvent, keyof BaseDomainEvent> | ||
| >; | ||
@@ -28,3 +31,5 @@ /** | ||
| */ | ||
| onBeforePush?: StackflowPluginPreEffectHook; | ||
| onBeforePush?: StackflowPluginPreEffectHook< | ||
| Omit<PushedEvent, keyof BaseDomainEvent> | ||
| >; | ||
@@ -34,3 +39,5 @@ /** | ||
| */ | ||
| onBeforeReplace?: StackflowPluginPreEffectHook; | ||
| onBeforeReplace?: StackflowPluginPreEffectHook< | ||
| Omit<ReplacedEvent, keyof BaseDomainEvent> | ||
| >; | ||
@@ -37,0 +44,0 @@ /** |
@@ -8,4 +8,8 @@ import { Effect } from "../Effect"; | ||
| export type StackflowPluginPreEffectHook = (args: { | ||
| actions: StackflowPluginActions & { preventDefault: () => void }; | ||
| export type StackflowPluginPreEffectHook<T> = (args: { | ||
| params: T; | ||
| actions: StackflowPluginActions & { | ||
| preventDefault: () => void; | ||
| overrideParams: (params: T) => void; | ||
| }; | ||
| }) => void; | ||
@@ -12,0 +16,0 @@ |
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
108606
-5.2%2431
-9.8%4
100%1
Infinity%