New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

@stackflow/core

Package Overview
Dependencies
Maintainers
1
Versions
60
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@stackflow/core - npm Package Compare versions

Comparing version
0.2.1
to
0.2.2-alpha.7
+1
-0
dist/AggregateOutput.d.ts

@@ -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": "4zBAAA,kGCEO,WACL,EACA,EACA,CACA,MAAO,GAAO,OAAO,AAAC,GAAM,EAAE,OAAS,CAAS,CAGlD,CCTO,WAAsB,EAAM,EAAM,EAAkC,CACzE,GAAM,GAAK,EAAS,CAAC,EACf,EAAK,EAAS,CAAC,EAErB,MAAI,GAAK,EACA,GAEL,IAAO,EACF,EAEF,CACT,CCXA,GAAI,GAAa,GAAI,KAEd,YAAc,CACnB,GAAM,GAAI,GAAI,MAAK,EAAE,QAAQ,EAAE,SAAS,EAElC,EAAc,EAAW,IAAI,CAAC,EAC9B,EAAc,IAAgB,OAAY,EAAc,EAAI,EAElE,MAAI,KAAgB,GAClB,GAAa,GAAI,MAGnB,EAAW,IAAI,EAAG,CAAW,EAEtB,OAAO,GAAG,IAAI,EAAY,SAAS,EAAE,SAAS,EAAG,GAAG,GAAG,EAAE,SAAS,EAAE,CAC7E,CCfO,WAAmB,EAAU,EAAqC,CACvE,GAAM,GAAW,GAAI,KAErB,MAAO,CAAC,GAAG,CAAG,EACX,QAAQ,EACR,OAAO,AAAC,GAAS,CAChB,GAAM,GAAM,EAAG,CAAI,EAEnB,GAAI,IAAQ,KACV,MAAO,GAGT,GAAM,GAAS,CAAC,CAAC,EAAS,IAAI,CAAG,EACjC,SAAS,IAAI,EAAK,EAAI,EAEf,CAAC,CACV,CAAC,EACA,QAAQ,CACb,CCdO,WACL,EACA,EAKA,CACA,MAAO,IACL,GAAI,EAAG,EACP,OACA,UAAW,GAAI,MAAK,EAAE,QAAQ,GAC3B,EAEP,CCfO,WAAwB,EAAuB,CACpD,GAAI,EAAO,SAAW,EACpB,KAAM,IAAI,OAAM,2BAA2B,EAG7C,GAAM,GAAa,EAAa,EAAQ,aAAa,EAC/C,EAA2B,EAAa,EAAQ,oBAAoB,EACpE,EAAe,EAAa,EAAQ,QAAQ,EAElD,GAAI,EAAW,OAAS,EACtB,KAAM,IAAI,OAAM,sCAAsC,EAGxD,GAAM,GAA0B,EAAyB,IACvD,AAAC,GAAM,EAAE,YACX,EAEA,EAAa,QAAQ,AAAC,GAAM,CAC1B,GAAI,CAAC,EAAwB,SAAS,EAAE,YAAY,EAClD,KAAM,IAAI,OAAM,2CAA2C,CAE/D,CAAC,CACH,CChBO,WAAmB,EAAuB,EAA8B,CAC7E,GAAM,GAAe,EACnB,CAAC,GAAG,CAAM,EAAE,KAAK,CAAC,EAAG,IAAM,EAAU,EAAG,EAAG,AAAC,GAAM,EAAE,EAAE,CAAC,EACvD,AAAC,GAAM,EAAE,EACX,EAEA,EAAe,CAAY,EAE3B,GAAM,GAAY,EAAa,EAAc,aAAa,EAAE,GACtD,CAAE,sBAAuB,EAMzB,EAIF,CAAC,EAEL,EAAa,QAAQ,AAAC,GAAU,CAC9B,OAAQ,EAAM,UACP,SAAU,CACb,GAAM,GACJ,EAAM,EAAM,WAAa,EACrB,aACA,eAEN,EAAW,KAAK,CACd,GAAI,EAAM,WACV,KAAM,EAAM,aACZ,kBACA,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,SAAU,EACV,SAAU,CACR,SAAU,IACZ,CACF,CAAC,EAED,KACF,KACK,WAAY,CACf,GAAM,GACJ,EAAM,EAAM,WAAa,EACrB,aACA,eAEA,EAAiB,EACpB,OAAO,AAAC,GAAa,EAAS,SAAS,WAAa,IAAI,EACxD,KAAK,CAAC,EAAI,IAAO,EAAG,SAAS,UAAY,EAAG,SAAS,SAAS,EAAE,GAEnE,EAAW,KAAK,CACd,GAAI,EAAM,WACV,KAAM,EAAM,aACZ,kBACA,OAAQ,EAAM,OACd,WAAY,EAAM,WAClB,SAAU,EACV,SAAU,CACR,SAAU,IACZ,CACF,CAAC,EAEG,GAAkB,IAAoB,cACxC,GAAe,SAAS,SAAW,EACnC,EAAe,gBAAkB,aAGnC,KACF,KACK,SAAU,CACb,GAAM,GAAiB,EACpB,OAAO,CAAC,EAAG,IAAM,EAAI,CAAC,EACtB,OAAO,AAAC,GAAa,EAAS,SAAS,WAAa,IAAI,EACxD,KAAK,CAAC,EAAI,IAAO,EAAG,SAAS,UAAY,EAAG,SAAS,SAAS,EAAE,GAE7D,EACJ,EAAM,EAAM,WAAa,EACrB,YACA,cAEN,AAAI,GACF,GAAe,SAAS,SAAW,EACnC,EAAe,gBAAkB,GAGnC,KACF,SAEE,MAGN,CAAC,EAED,GAAM,GAAwB,EAAW,KACvC,AAAC,GACC,EAAS,kBAAoB,gBAC7B,EAAS,kBAAoB,aACjC,EACI,UACA,OAsBJ,MApBgC,CAC9B,WAAY,EACV,EAAW,IAAI,AAAC,GAAc,GAC5B,GAAI,EAAS,GACb,KAAM,EAAS,KACf,gBAAiB,EAAS,gBAC1B,OAAQ,EAAS,OACjB,SAAU,EAAS,UACf,EAAS,WACT,CACE,WAAY,EAAS,UACvB,EACA,KACJ,EACF,AAAC,GAAa,EAAS,EACzB,EAAE,KAAK,CAAC,EAAG,IAAM,EAAU,EAAG,EAAG,AAAC,GAAa,EAAS,EAAE,CAAC,EAC3D,qBACA,uBACF,CAGF,CCtIA,MAAoB,iCAKb,WACL,EACA,EACU,CACV,GAAM,GAAmB,CAAC,EAE1B,AAAK,cAAQ,EAAY,CAAU,GACjC,EAAO,KAAK,CACV,KAAM,qBACR,CAAC,EAGH,OACM,GAAI,EACR,EAAI,KAAK,IAAI,EAAW,WAAW,OAAQ,EAAW,WAAW,MAAM,EACvE,GAAK,EACL,CACA,GAAM,GAAe,EAAW,WAAW,GACrC,EAAe,EAAW,WAAW,GAE3C,AAAI,CAAC,GAAgB,CAAC,CAAC,GACrB,EAAO,KAAK,CACV,KAAM,EAAa,SAAS,OAAS,SAAW,SAAW,WAC3D,SAAU,CACZ,CAAC,EAGH,GAAM,GACJ,kBAAc,mBAAoB,aAClC,kBAAc,mBAAoB,cAC9B,EACJ,kBAAc,mBAAoB,gBAClC,kBAAc,mBAAoB,aAEpC,AAAI,GAAwB,GAC1B,EAAO,KAAK,CACV,KAAM,EAAa,SAAS,OAAS,SAAW,SAAW,WAC3D,SAAU,CACZ,CAAC,CAEL,CACA,OACM,GACF,KAAK,IAAI,EAAW,WAAW,OAAQ,EAAW,WAAW,MAAM,EAAI,EACzE,GAAK,EACL,GAAK,EACL,CACA,GAAM,GAAe,EAAW,WAAW,GACrC,EAAe,EAAW,WAAW,GAErC,EACJ,kBAAc,mBAAoB,cAClC,kBAAc,mBAAoB,eAC9B,EACJ,kBAAc,mBAAoB,eAClC,kBAAc,mBAAoB,YAEpC,AAAI,GAAwB,GAC1B,EAAO,KAAK,CACV,KAAM,SACN,SAAU,CACZ,CAAC,CAEL,CAEA,MAAO,EACT",
"names": []
}

@@ -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;

{
"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"
}

@@ -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",
});
});

@@ -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 @@