atom.io 0.40.1 → 0.40.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/data/index.d.ts +1 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/internal/index.d.ts +155 -144
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +91 -39
- package/dist/internal/index.js.map +1 -1
- package/dist/introspection/index.d.ts +4 -4
- package/dist/introspection/index.d.ts.map +1 -1
- package/dist/introspection/index.js.map +1 -1
- package/dist/main/index.d.ts +80 -56
- package/dist/main/index.d.ts.map +1 -1
- package/dist/main/index.js.map +1 -1
- package/dist/react/index.d.ts +11 -11
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react-devtools/index.d.ts.map +1 -1
- package/dist/react-devtools/index.js.map +1 -1
- package/package.json +1 -1
- package/src/data/struct.ts +2 -2
- package/src/internal/atom/create-regular-atom.ts +8 -7
- package/src/internal/atom/dispose-atom.ts +6 -3
- package/src/internal/atom/has-role.ts +1 -1
- package/src/internal/caching.ts +15 -15
- package/src/internal/events/ingest-creation-disposal.ts +1 -1
- package/src/internal/families/create-readonly-held-selector-family.ts +6 -7
- package/src/internal/families/create-readonly-pure-selector-family.ts +23 -17
- package/src/internal/families/create-regular-atom-family.ts +17 -15
- package/src/internal/families/create-selector-family.ts +9 -9
- package/src/internal/families/create-writable-held-selector-family.ts +6 -7
- package/src/internal/families/create-writable-pure-selector-family.ts +24 -18
- package/src/internal/families/dispose-from-store.ts +10 -7
- package/src/internal/families/find-in-store.ts +23 -23
- package/src/internal/families/get-family-of-token.ts +17 -17
- package/src/internal/families/mint-in-store.ts +11 -11
- package/src/internal/families/seek-in-store.ts +26 -26
- package/src/internal/get-state/get-fallback.ts +8 -8
- package/src/internal/get-state/get-from-store.ts +17 -12
- package/src/internal/get-state/read-or-compute-value.ts +78 -14
- package/src/internal/get-state/reduce-reference.ts +10 -10
- package/src/internal/index.ts +58 -53
- package/src/internal/join/join-internal.ts +15 -6
- package/src/internal/mutable/create-mutable-atom-family.ts +7 -8
- package/src/internal/mutable/get-json-family.ts +3 -2
- package/src/internal/mutable/get-update-family.ts +7 -5
- package/src/internal/mutable/tracker-family.ts +5 -1
- package/src/internal/mutable/tracker.ts +5 -1
- package/src/internal/operation.ts +4 -2
- package/src/internal/selector/create-readonly-pure-selector.ts +8 -6
- package/src/internal/selector/create-standalone-selector.ts +10 -10
- package/src/internal/selector/create-writable-pure-selector.ts +9 -7
- package/src/internal/selector/dispose-selector.ts +2 -2
- package/src/internal/selector/register-selector.ts +2 -2
- package/src/internal/selector/trace-selector-atoms.ts +3 -3
- package/src/internal/selector/update-selector-atoms.ts +1 -1
- package/src/internal/set-state/dispatch-state-update.ts +9 -5
- package/src/internal/set-state/evict-downstream.ts +4 -1
- package/src/internal/set-state/operate-on-store.ts +16 -10
- package/src/internal/set-state/reset-atom-or-selector.ts +7 -7
- package/src/internal/set-state/reset-in-store.ts +9 -6
- package/src/internal/set-state/set-atom-or-selector.ts +1 -1
- package/src/internal/set-state/set-atom.ts +1 -1
- package/src/internal/set-state/set-into-store.ts +10 -7
- package/src/internal/set-state/set-selector.ts +1 -1
- package/src/internal/store/deposit.ts +38 -30
- package/src/internal/store/mint-or-counterfeit.ts +23 -23
- package/src/internal/store/store.ts +9 -9
- package/src/internal/store/withdraw.ts +68 -62
- package/src/internal/subscribe/recall-state.ts +4 -1
- package/src/internal/subscribe/subscribe-to-root-atoms.ts +2 -2
- package/src/internal/subscribe/subscribe-to-state.ts +4 -4
- package/src/internal/timeline/create-timeline.ts +5 -5
- package/src/internal/utility-types.ts +2 -0
- package/src/introspection/attach-atom-index.ts +2 -2
- package/src/introspection/attach-selector-index.ts +4 -2
- package/src/introspection/attach-timeline-family.ts +13 -11
- package/src/introspection/attach-timeline-index.ts +1 -1
- package/src/introspection/attach-transaction-index.ts +1 -1
- package/src/introspection/attach-transaction-logs.ts +4 -2
- package/src/introspection/attach-type-selectors.ts +2 -1
- package/src/introspection/index.ts +3 -5
- package/src/main/atom.ts +15 -9
- package/src/main/events.ts +25 -23
- package/src/main/get-state.ts +10 -8
- package/src/main/reset-state.ts +4 -4
- package/src/main/selector.ts +41 -24
- package/src/main/set-state.ts +8 -4
- package/src/main/timeline.ts +5 -3
- package/src/main/tokens.ts +72 -44
- package/src/main/validators.ts +4 -4
- package/src/react/parse-state-overloads.ts +10 -10
- package/src/react/use-i.ts +6 -6
- package/src/react/use-loadable.ts +15 -15
- package/src/react/use-o.ts +9 -9
- package/src/react-devtools/StateEditor.tsx +5 -3
- package/src/react-devtools/StateIndex.tsx +6 -4
- package/src/react-devtools/Updates.tsx +1 -1
- package/src/react-devtools/store.ts +16 -7
|
@@ -3,10 +3,10 @@ import { Json } from "atom.io/json";
|
|
|
3
3
|
import { AtomToken, Loadable, ReadableToken, ReadonlyPureSelectorFamilyToken, SelectorToken, TimelineToken, TransactionOutcomeEvent, TransactionToken } from "atom.io";
|
|
4
4
|
|
|
5
5
|
//#region src/introspection/attach-atom-index.d.ts
|
|
6
|
-
type AtomTokenIndex = WritableTokenIndex<AtomToken<unknown>>;
|
|
6
|
+
type AtomTokenIndex = WritableTokenIndex<AtomToken<unknown, any, unknown>>;
|
|
7
7
|
//#endregion
|
|
8
8
|
//#region src/introspection/attach-selector-index.d.ts
|
|
9
|
-
type SelectorTokenIndex = WritableTokenIndex<SelectorToken<unknown>>;
|
|
9
|
+
type SelectorTokenIndex = WritableTokenIndex<SelectorToken<unknown, any, any>>;
|
|
10
10
|
//#endregion
|
|
11
11
|
//#region src/introspection/attach-introspection-states.d.ts
|
|
12
12
|
type IntrospectionStates = {
|
|
@@ -134,11 +134,11 @@ type InspectNode = (path: string[], node: unknown) => InspectionResult | void;
|
|
|
134
134
|
declare const sprawl: (tree: Array<unknown> | object, inspector: InspectNode) => void;
|
|
135
135
|
//#endregion
|
|
136
136
|
//#region src/introspection/index.d.ts
|
|
137
|
-
type FamilyNode<Token extends ReadableToken<unknown>> = {
|
|
137
|
+
type FamilyNode<Token extends ReadableToken<unknown, any, any>> = {
|
|
138
138
|
key: string;
|
|
139
139
|
familyMembers: Map<string, Token>;
|
|
140
140
|
};
|
|
141
|
-
type WritableTokenIndex<Token extends ReadableToken<unknown>> = Map<string, FamilyNode<Token> | Token>;
|
|
141
|
+
type WritableTokenIndex<Token extends ReadableToken<unknown, any, any>> = Map<string, FamilyNode<Token> | Token>;
|
|
142
142
|
//#endregion
|
|
143
143
|
export { Auditor, ClassSignature, Differ, FamilyNode, InspectNode, InspectionResult, IntrospectionStates, JsonType, ListResourcesParam, RefinementStrategy, RefinementSupport, Refinery, Supported, WritableTokenIndex, attachIntrospectionStates, diffArray, diffBoolean, diffNumber, diffObject, diffString, discoverType, isPlainObject, jsonRefinery, jsonTreeRefinery, prettyJson, primitiveRefinery, sprawl };
|
|
144
144
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["primitiveRefinery: Refinery<{\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","jsonTreeRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n}>","jsonRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","prettyJson: Differ<\n\t{\n\t\tnumber: (input: unknown) => input is number\n\t\tstring: (input: unknown) => input is string\n\t\tboolean: (input: unknown) => input is boolean\n\t\tnull: (input: unknown) => input is null\n\t},\n\t{\n\t\tobject: (input: unknown) => input is Json.Tree.Object\n\t\tarray: (input: unknown) => input is Json.Tree.Array\n\t}\n>"],"sources":["../../src/introspection/attach-atom-index.ts","../../src/introspection/attach-selector-index.ts","../../src/introspection/attach-introspection-states.ts","../../src/introspection/auditor.ts","../../src/introspection/refinery.ts","../../src/introspection/differ.ts","../../src/introspection/sprawl.ts","../../src/introspection/index.ts"],"sourcesContent":[],"mappings":";;;;;KAUY,cAAA,GAAiB,mBAAmB;;;KCApC,kBAAA,GAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["primitiveRefinery: Refinery<{\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","jsonTreeRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n}>","jsonRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","prettyJson: Differ<\n\t{\n\t\tnumber: (input: unknown) => input is number\n\t\tstring: (input: unknown) => input is string\n\t\tboolean: (input: unknown) => input is boolean\n\t\tnull: (input: unknown) => input is null\n\t},\n\t{\n\t\tobject: (input: unknown) => input is Json.Tree.Object\n\t\tarray: (input: unknown) => input is Json.Tree.Array\n\t}\n>"],"sources":["../../src/introspection/attach-atom-index.ts","../../src/introspection/attach-selector-index.ts","../../src/introspection/attach-introspection-states.ts","../../src/introspection/auditor.ts","../../src/introspection/refinery.ts","../../src/introspection/differ.ts","../../src/introspection/sprawl.ts","../../src/introspection/index.ts"],"sourcesContent":[],"mappings":";;;;;KAUY,cAAA,GAAiB,mBAAmB;;;KCApC,kBAAA,GAAqB,mBAChC;;;KCQW,mBAAA;EFTZ,SAAY,EEUA,SFVA,CEUU,cFVV,CAAA;EAAA,aAAA,EEWI,SFXJ,CEWc,kBFXd,CAAA;kBAAoC,EEY7B,SFZ6B,CEYnB,gBFZmB,CEYF,EFZE,CAAA,EAAA,CAAA;yBAAnB,EEaH,+BFbG,CEc3B,uBFd2B,CEcH,gBFdG,CEcc,EFdd,CAAA,CAAA,EAAA,EAAA,MAAA,CAAA;iBEiBb,UAAU;qBACN,gCAAgC;iBACpC,gCAAgC;;ADnBpC,cCsBC,yBDtBD,EAAA,CAAA,KAAA,ECuBJ,SDvBI,EAAA,GCwBT,mBDxBS;;;KEIA,kBAAA;EHJZ,YAAY,EAAA,OAAA;EAAA,gBAAA,EAAA,OAAA;;;;;;cGaC,OAAA;EFbb,SAAY,KAAA,EEcY,KFdZ;EAAA,gBAAA,EAAA,MAAA;iBACX,EEewB,GFfxB,CAAA,MAAA,EAAA,MAAA,CAAA;WADgC,SAAA,EEiBL,SFjBK,CEiBK,cFjBL,CAAA;0BEkBD,UAAU;;;;EDT1C,iBAAY,+BAAA;EAAA,iBAAA,+BAAA;;;;aAEI,CAAA,KAAA,CAAA,ECkBW,KDlBX;kBAC8B,4BAAA,ECoDQ,kBDpDR;;;;;;;eAKpB,CAAA,KAAA,CAAA,EC0DjB,kBD1DiB,CAAA,EAAA,CAAA,SAAA,CC2DX,aD3DW,CAAA,OAAA,CAAA,EAAA,MAAA,CAAA,CAAA,EAAA;GCmGjB,MAAA,CAAO,OAAA,GDnGA,EAAA,IAAA;;;;KExBJ,cAAA;KAEA,kBAAA,GAAqB,iBAAiB;KAEtC,yBAAyB,sBACpC,eAAe,+BACZ,IACA,eAAe,iBACd,aAAa;AJDN,KIIA,iBAAA,GAAoB,MJJpB,CAAA,MAAA,EIImC,kBJJnC,CAAA;AAAA,cIMC,QJND,CAAA,uBIMiC,iBJNjC,CAAA,CAAA;WAAoC,EIO7B,cJP6B;aAAnB,CAAA,SAAA,EISE,cJTF;mBIaJ,IACrB,mBACY,iBAAiB,UAAU,UAAU,eAAe;UAEvD;UACA,UAAU,eAAe;MAE/B,UAAU,eAAe,YAAY;IHpB5C,IAAY,EGsBE,CHtBF;IAAA,IAAA,EGuBE,SHvBF,CGuBY,cHvBZ,CGuB2B,CHvB3B,CAAA,CAAA;WACX,EAAA,CAAA,CAAA,MGyBY,cHzBZ,CAAA,GAAA,CG0BI,CH1BJ,SG0Bc,SH1Bd,CG0BwB,cH1BxB,CAAA,MG0B6C,cH1B7C,CAAA,CAAA,GAAA,KAAA,GAAA,IAAA,CAAA;;cGkDYA,mBAAmB;;;;EF1ChC,IAAY,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,IAAA;CAAA,CAAA;AACU,iBEqDN,aAAA,CFrDM,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IEqDkC,IAAA,CAAK,IAAA,CAAK,MFrD5C;AAAV,cE6DCC,gBF7DD,EE6DmB,QF7DnB,CAAA;QACc,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IE6DY,IAAA,CAAK,IAAA,CAAK,MF7DtB;SAAV,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IE8DqB,IAAA,CAAK,IAAA,CAAK,KF9D/B;;AACa,cEmEhBC,YFnEgB,EEmEF,QFnEE,CAAA;QAAV,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IEoEmB,IAAA,CAAK,IAAA,CAAK,MFpE7B;SAEwB,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IEmEN,IAAA,CAAK,IAAA,CAAK,KFnEJ;QAAjB,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,MAAA;QAAxB,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,MAAA;SADwB,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,OAAA;QAIA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,IAAA;;AAC0B,KEyExC,QAAA,GFzEwC,MAAA,OEyEhB,YAAA,CAAa,SFzEG;AAAhC,cE2EP,YF3EO,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GE6EjB,QF7EiB,GAAA,KAAA,GAAA,KAAA,GAAA,WAAA,GAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA;;;iBGtBJ,UAAA,wBAAkC;iBAOlC,UAAA,wBAAkC;iBAOlC,WAAA,0BAAqC;ALVzC,iBKgBI,UAAA,CLhBJ,CAAA,EKiBR,IAAA,CAAK,IAAA,CAAK,MLjBF,EAAA,CAAA,EKkBR,IAAA,CAAK,IAAA,CAAK,MLlBF,EAAA,OAAA,EKmBF,ILnBE,CAAA,OAAA,CAAA,CAAA,EKoBT,KLpBS;AAAA,iBK6DI,SAAA,CL7DJ,CAAA,EK8DR,IAAA,CAAK,IAAA,CAAK,KL9DF,EAAA,CAAA,EK+DR,IAAA,CAAK,IAAA,CAAK,KL/DF,EAAA,OAAA,EKgEF,ILhEE,CAAA,OAAA,CAAA,CAAA,EKiET,KLjES;KKqEP,KAAA,GLrE2C;SAAnB,EAAA,MAAA;;;kCKyEI;;AJzEjC,KI4EK,IJ5EO,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,EI4EO,CJ5EP,EAAA,CAAA,EI4Ea,CJ5Eb,EAAA,GI4EmB,KJ5EnB;KI6EP,QJ7EO,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,EI6EW,CJ7EX,EAAA,CAAA,EI6EiB,CJ7EjB,EAAA,OAAA,EI6E6B,MJ7E7B,CAAA,GAAA,EAAA,GAAA,CAAA,CAAA,MAAA,CAAA,EAAA,GI6E0D,KJ7E1D;AACX,cI8EY,MJ9EZ,cI+Ea,MJhFmB,CAAA,MAAA,EAAA,GAAA,CAAA,eIiFnB;gBAEQ,SAAS;gBACT,SAAS;EH3E/B,WAAY,EAAA,SAAA,MG4EwB,IH5ExB,GG4E+B,IH5E/B,CG4EoC,SH5EpC,CG4E8C,IH5E9C,CG4EmD,EH5EnD,CAAA,CAAA,CAAA,EAAA;EAAA,WAAA,EAAA,SAAA,MG6EwB,IH7ExB,GG6E+B,QH7E/B,CG6EwC,SH7ExC,CG6EkD,IH7ElD,CG6EuD,EH7EvD,CAAA,CAAA,CAAA,EAAA;aACU,CAAA,YAAA,EG+EN,QH/EM,CG+EG,IH/EH,CAAA,EAAA,YAAA,EGgFN,QHhFM,CGgFG,IHhFH,CAAA,EAAA,aAAA,EAAA,SAAA,MGkFN,IHlFM,GGkFC,QHlFD,CGkFU,SHlFV,CGkFoB,IHlFpB,CGkFyB,EHlFzB,CAAA,CAAA,CAAA,EAAA,GAAA,SAAA,MGmFD,IHnFC,GGmFM,IHnFN,CGmFW,SHnFX,CGmFqB,IHnFrB,CGmF0B,EHnF1B,CAAA,CAAA,CAAA,EAAA;QAAV,EAAA,OAAA,EAAA,CAAA,EAAA,OAAA,CAAA,EGmG0B,KHnG1B;;AACI,cG0IHC,UH1IG,EG0IS,MH1IT,CAAA;QAC8B,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,MAAA;QAAjB,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,MAAA;SAAV,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,OAAA;QAEwB,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IAAA,IAAA;;QAAzC,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IG+IqC,IAAA,CAAK,IAAA,CAAK,MH/I/C;SADwB,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,KAAA,IGiJY,IAAA,CAAK,IAAA,CAAK,KHjJtB;;;;KIpBd,gBAAA,GAAmB;;;;KAInB,WAAA,sCAGP;ANAO,cMEC,MNFD,EAAA,CAAA,IAAA,EMGL,KNHK,CAAA,OAAA,CAAA,GAAA,MAAA,EAAA,SAAA,EMIA,WNJA,EAAA,GAAA,IAAA;;;AAAA,KOFA,UPEA,CAAA,cOFyB,aPEzB,CAAA,OAAA,EAAA,GAAA,EAAA,GAAA,CAAA,CAAA,GAAA;aAAoC;eAAnB,EOAb,GPAa,CAAA,MAAA,EOAD,KPAC,CAAA;;KOGjB,iCAAiC,oCAC5C,YAAY,WAAW,SAAS"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["base: AtomTokenIndex","base: SelectorTokenIndex","tokens: TransactionToken<Fn>[]","primitiveRefinery: Refinery<{\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","jsonTreeRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n}>","jsonRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","state: unknown","resources: (readonly [ReadableToken<unknown>, number])[]","result","added: Delta[`added`]","removed: Delta[`removed`]","changed: Delta[`changed`]","key: string","prettyJson: Differ<\n\t{\n\t\tnumber: (input: unknown) => input is number\n\t\tstring: (input: unknown) => input is string\n\t\tboolean: (input: unknown) => input is boolean\n\t\tnull: (input: unknown) => input is null\n\t},\n\t{\n\t\tobject: (input: unknown) => input is Json.Tree.Object\n\t\tarray: (input: unknown) => input is Json.Tree.Array\n\t}\n>"],"sources":["../../src/introspection/attach-atom-index.ts","../../src/introspection/attach-selector-index.ts","../../src/introspection/attach-timeline-family.ts","../../src/introspection/attach-timeline-index.ts","../../src/introspection/attach-transaction-index.ts","../../src/introspection/attach-transaction-logs.ts","../../src/introspection/refinery.ts","../../src/introspection/attach-type-selectors.ts","../../src/introspection/attach-introspection-states.ts","../../src/introspection/auditor.ts","../../src/introspection/sprawl.ts","../../src/introspection/differ.ts"],"sourcesContent":["import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtom,\n\tdeposit,\n\tisReservedIntrospectionKey,\n} from \"atom.io/internal\"\n\nimport type { WritableTokenIndex } from \".\"\n\nexport type AtomTokenIndex = WritableTokenIndex<AtomToken<unknown>>\n\nexport const attachAtomIndex = (store: Store): AtomToken<AtomTokenIndex> => {\n\treturn createRegularAtom<AtomTokenIndex>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Atom Token Index`,\n\t\t\tdefault: () => {\n\t\t\t\tconst base: AtomTokenIndex = new Map()\n\t\t\t\tfor (const [key, val] of store.atoms) {\n\t\t\t\t\tif (isReservedIntrospectionKey(key)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst token = deposit(val)\n\t\t\t\t\tif (val.family) {\n\t\t\t\t\t\tlet familyNode = base.get(val.family.key)\n\t\t\t\t\t\tif (!familyNode || !(`familyMembers` in familyNode)) {\n\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\tkey: val.family.key,\n\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbase.set(val.family.key, familyNode)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfamilyNode.familyMembers.set(val.family.subKey, token)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbase.set(key, token)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn base\n\t\t\t},\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.atomCreation.subscribe(`introspection`, (atomToken) => {\n\t\t\t\t\t\tif (isReservedIntrospectionKey(atomToken.key)) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tif (atomToken.family) {\n\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = atomToken.family\n\t\t\t\t\t\t\t\tlet familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tfamilyNode === undefined ||\n\t\t\t\t\t\t\t\t\t!(`familyMembers` in familyNode)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\t\t\tkey: familyKey,\n\t\t\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tself.set(familyKey, familyNode)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfamilyNode.familyMembers.set(subKey, atomToken)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tself.set(atomToken.key, atomToken)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t\tstore.on.atomDisposal.subscribe(`introspection`, (atomToken) => {\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tif (atomToken.family) {\n\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = atomToken.family\n\t\t\t\t\t\t\t\tconst familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\tif (familyNode && `familyMembers` in familyNode) {\n\t\t\t\t\t\t\t\t\tfamilyNode.familyMembers.delete(subKey)\n\t\t\t\t\t\t\t\t\tif (familyNode.familyMembers.size === 0) {\n\t\t\t\t\t\t\t\t\t\tself.delete(familyKey)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type { AtomToken, SelectorToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtom,\n\tdeposit,\n\tisReservedIntrospectionKey,\n} from \"atom.io/internal\"\n\nimport type { WritableTokenIndex } from \".\"\n\nexport type SelectorTokenIndex = WritableTokenIndex<SelectorToken<unknown>>\n\nexport const attachSelectorIndex = (\n\tstore: Store,\n): AtomToken<SelectorTokenIndex> => {\n\treturn createRegularAtom<SelectorTokenIndex>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Selector Token Index`,\n\t\t\tdefault: () => {\n\t\t\t\tconst base: SelectorTokenIndex = new Map()\n\t\t\t\tfor (const map of [store.readonlySelectors, store.writableSelectors]) {\n\t\t\t\t\tfor (const [key, val] of map) {\n\t\t\t\t\t\tif (isReservedIntrospectionKey(key)) {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst token = deposit(val)\n\t\t\t\t\t\tif (val.family) {\n\t\t\t\t\t\t\tlet familyNode = base.get(val.family.key)\n\t\t\t\t\t\t\tif (!familyNode || !(`familyMembers` in familyNode)) {\n\t\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\t\tkey: val.family.key,\n\t\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbase.set(val.family.key, familyNode)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfamilyNode.familyMembers.set(val.family.subKey, token)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbase.set(key, token)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn base\n\t\t\t},\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.selectorCreation.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(selectorToken) => {\n\t\t\t\t\t\t\tif (isReservedIntrospectionKey(selectorToken.key)) {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\t\tif (selectorToken.family) {\n\t\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = selectorToken.family\n\t\t\t\t\t\t\t\t\tlet familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tfamilyNode === undefined ||\n\t\t\t\t\t\t\t\t\t\t!(`familyMembers` in familyNode)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\t\t\t\tkey: familyKey,\n\t\t\t\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tself.set(familyKey, familyNode)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tfamilyNode.familyMembers.set(subKey, selectorToken)\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tself.set(selectorToken.key, selectorToken)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\n\t\t\t\t\tstore.on.selectorDisposal.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(selectorToken) => {\n\t\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\t\tif (selectorToken.family) {\n\t\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = selectorToken.family\n\t\t\t\t\t\t\t\t\tconst familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\t\tif (familyNode && `familyMembers` in familyNode) {\n\t\t\t\t\t\t\t\t\t\tfamilyNode.familyMembers.delete(subKey)\n\t\t\t\t\t\t\t\t\t\tif (familyNode.familyMembers.size === 0) {\n\t\t\t\t\t\t\t\t\t\t\tself.delete(familyKey)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tself.delete(selectorToken.key)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type { ReadonlyPureSelectorFamilyToken } from \"atom.io\"\nimport type { RootStore, Timeline } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tSubject,\n} from \"atom.io/internal\"\n\nexport const attachTimelineFamily = (\n\tstore: RootStore,\n): ReadonlyPureSelectorFamilyToken<Timeline<any>, string> => {\n\tconst findTimelineLogState__INTERNAL = createRegularAtomFamily<\n\t\tTimeline<any>,\n\t\tstring\n\t>(store, {\n\t\tkey: `🔍 Timeline Update Log (Internal)`,\n\t\tdefault: (key) =>\n\t\t\tstore.timelines.get(key) ?? {\n\t\t\t\ttype: `timeline`,\n\t\t\t\tkey: ``,\n\t\t\t\tat: 0,\n\t\t\t\ttimeTraveling: null,\n\t\t\t\thistory: [],\n\t\t\t\tselectorTime: null,\n\t\t\t\ttransactionKey: null,\n\t\t\t\tinstall: () => {},\n\t\t\t\tsubject: new Subject(),\n\t\t\t\tsubscriptions: new Map(),\n\t\t\t},\n\t\teffects: (key) => [\n\t\t\t({ setSelf }) => {\n\t\t\t\tconst tl = store.timelines.get(key)\n\t\t\t\ttl?.subject.subscribe(`introspection`, (_) => {\n\t\t\t\t\tsetSelf({ ...tl })\n\t\t\t\t})\n\t\t\t},\n\t\t],\n\t})\n\tconst findTimelineLogState = createSelectorFamily<Timeline<any>, string>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Timeline Update Log`,\n\t\t\tget:\n\t\t\t\t(key) =>\n\t\t\t\t({ get }) =>\n\t\t\t\t\tget(findTimelineLogState__INTERNAL, key),\n\t\t},\n\t)\n\treturn findTimelineLogState\n}\n","import type { AtomToken, TimelineToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { createRegularAtom } from \"atom.io/internal\"\n\nexport const attachTimelineIndex = (\n\tstore: Store,\n): AtomToken<TimelineToken<any>[]> => {\n\treturn createRegularAtom<TimelineToken<any>[]>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Timeline Token Index`,\n\t\t\tdefault: () =>\n\t\t\t\t[...store.timelines].map(([key]): TimelineToken<any> => {\n\t\t\t\t\treturn { key, type: `timeline` }\n\t\t\t\t}),\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.timelineCreation.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(timelineToken) => {\n\t\t\t\t\t\t\tsetSelf((state) => [...state, timelineToken])\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type { AtomToken, TransactionToken } from \"atom.io\"\nimport type { Fn, Store } from \"atom.io/internal\"\nimport { createRegularAtom, isReservedIntrospectionKey } from \"atom.io/internal\"\n\nexport const attachTransactionIndex = (\n\tstore: Store,\n): AtomToken<TransactionToken<Fn>[]> => {\n\treturn createRegularAtom<TransactionToken<Fn>[]>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Transaction Token Index`,\n\t\t\tdefault: () => {\n\t\t\t\tconst tokens: TransactionToken<Fn>[] = []\n\t\t\t\tfor (const [key] of store.transactions) {\n\t\t\t\t\tif (isReservedIntrospectionKey(key)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttokens.push({ key, type: `transaction` })\n\t\t\t\t}\n\t\t\t\treturn tokens\n\t\t\t},\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.transactionCreation.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(transactionToken) => {\n\t\t\t\t\t\t\tif (isReservedIntrospectionKey(transactionToken.key)) {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetSelf((state) => [...state, transactionToken])\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type {\n\tReadonlyPureSelectorFamilyToken,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport type { RootStore } from \"atom.io/internal\"\nimport { createRegularAtomFamily, createSelectorFamily } from \"atom.io/internal\"\n\nexport const attachTransactionLogs = (\n\tstore: RootStore,\n): ReadonlyPureSelectorFamilyToken<\n\tTransactionOutcomeEvent<TransactionToken<any>>[],\n\tstring\n> => {\n\tconst transactionUpdateLogAtoms = createRegularAtomFamily<\n\t\tTransactionOutcomeEvent<TransactionToken<any>>[],\n\t\tstring\n\t>(store, {\n\t\tkey: `🔍 Transaction Update Log (Internal)`,\n\t\tdefault: () => [],\n\t\teffects: (key) => [\n\t\t\t({ setSelf }) => {\n\t\t\t\tconst tx = store.transactions.get(key)\n\t\t\t\ttx?.subject.subscribe(`introspection`, (transactionUpdate) => {\n\t\t\t\t\tif (transactionUpdate.token.key === key) {\n\t\t\t\t\t\tsetSelf((state) => [...state, transactionUpdate])\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t],\n\t})\n\tconst findTransactionUpdateLogState = createSelectorFamily<\n\t\tTransactionOutcomeEvent<TransactionToken<any>>[],\n\t\tstring\n\t>(store, {\n\t\tkey: `🔍 Transaction Update Log`,\n\t\tget:\n\t\t\t(key) =>\n\t\t\t({ get }) =>\n\t\t\t\tget(transactionUpdateLogAtoms, key),\n\t})\n\treturn findTransactionUpdateLogState\n}\n","import type { Flat, Refinement } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport type ClassSignature = abstract new (...args: any) => any\n\nexport type RefinementStrategy = ClassSignature | Refinement<unknown, any>\n\nexport type Supported<Refine extends RefinementStrategy> =\n\tRefine extends Refinement<unknown, infer T>\n\t\t? T\n\t\t: Refine extends ClassSignature\n\t\t\t? InstanceType<Refine>\n\t\t\t: never\n\nexport type RefinementSupport = Record<string, RefinementStrategy>\n\nexport class Refinery<SupportedTypes extends RefinementSupport> {\n\tpublic supported: SupportedTypes\n\n\tpublic constructor(supported: SupportedTypes) {\n\t\tthis.supported = supported\n\t}\n\n\tpublic refine<T>(input: T):\n\t\t| Flat<{\n\t\t\t\t[K in keyof SupportedTypes]: T extends Supported<SupportedTypes[K]>\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: K\n\t\t\t\t\t\t\tdata: Supported<SupportedTypes[K]>\n\t\t\t\t\t\t}\n\t\t\t\t\t: Supported<SupportedTypes[K]> extends T\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: K\n\t\t\t\t\t\t\t\tdata: Supported<SupportedTypes[K]>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: never\n\t\t }>[keyof SupportedTypes]\n\t\t| (T extends Supported<SupportedTypes[keyof SupportedTypes]>\n\t\t\t\t? never\n\t\t\t\t: null) {\n\t\tfor (const [key, refiner] of Object.entries(this.supported)) {\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\t// @ts-expect-error that's the point\n\t\t\t\t\trefiner(input) === true &&\n\t\t\t\t\trefiner !== Boolean\n\t\t\t\t) {\n\t\t\t\t\treturn { type: key, data: input } as any\n\t\t\t\t}\n\t\t\t} catch (_) {\n\t\t\t\ttry {\n\t\t\t\t\tif (input instanceof refiner) {\n\t\t\t\t\t\treturn { type: key, data: input } as any\n\t\t\t\t\t}\n\t\t\t\t} catch (__) {}\n\t\t\t}\n\t\t}\n\t\treturn null as any\n\t}\n}\n\nexport const primitiveRefinery: Refinery<{\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}> = new Refinery({\n\tnumber: (input: unknown): input is number => typeof input === `number`,\n\tstring: (input: unknown): input is string => typeof input === `string`,\n\tboolean: (input: unknown): input is boolean => typeof input === `boolean`,\n\tnull: (input: unknown): input is null => input === null,\n})\n\nexport function isPlainObject(input: unknown): input is Json.Tree.Object {\n\tif (!input) {\n\t\treturn false\n\t}\n\tconst prototype = Object.getPrototypeOf(input)\n\treturn prototype === Object.prototype\n}\n\nexport const jsonTreeRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n}> = new Refinery({\n\tobject: isPlainObject,\n\tarray: (input: unknown): input is Json.Tree.Array => Array.isArray(input),\n})\n\nexport const jsonRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}> = new Refinery({\n\t...primitiveRefinery.supported,\n\t...jsonTreeRefinery.supported,\n})\n\nexport type JsonType = keyof typeof jsonRefinery.supported\n\nexport const discoverType = (\n\tinput: unknown,\n): JsonType | `Map` | `Set` | `undefined` | (string & {}) => {\n\tif (input === undefined) {\n\t\treturn `undefined`\n\t}\n\tconst refined = jsonRefinery.refine(input)\n\tif (refined) {\n\t\treturn refined.type\n\t}\n\treturn Object.getPrototypeOf(input).constructor.name\n}\n","import type { Loadable, ReadonlyPureSelectorFamilyToken } from \"atom.io\"\nimport type { RootStore } from \"atom.io/internal\"\nimport { createReadonlyPureSelectorFamily } from \"atom.io/internal\"\n\nimport { discoverType } from \"./refinery\"\n\nexport const attachTypeSelectors = (\n\tstore: RootStore,\n): ReadonlyPureSelectorFamilyToken<Loadable<string>, string> => {\n\tconst typeSelectors = createReadonlyPureSelectorFamily<\n\t\tLoadable<string>,\n\t\tstring\n\t>(store, {\n\t\tkey: `🔍 State Type`,\n\t\tget:\n\t\t\t(key) =>\n\t\t\tasync ({ get }) => {\n\t\t\t\tlet state: unknown\n\t\t\t\ttry {\n\t\t\t\t\tconst token =\n\t\t\t\t\t\tstore.atoms.get(key) ??\n\t\t\t\t\t\tstore.writableSelectors.get(key) ??\n\t\t\t\t\t\tstore.readonlySelectors.get(key)\n\t\t\t\t\tif (token === undefined) {\n\t\t\t\t\t\tthrow new Error(`Could not find state with key \"${key}\"`)\n\t\t\t\t\t}\n\t\t\t\t\tstate = get(token)\n\t\t\t\t} catch (_) {\n\t\t\t\t\treturn `error`\n\t\t\t\t}\n\t\t\t\tif (state instanceof Promise) {\n\t\t\t\t\tstate = await state\n\t\t\t\t}\n\t\t\t\tconst typeOfState = discoverType(state)\n\t\t\t\treturn typeOfState\n\t\t\t},\n\t})\n\treturn typeSelectors\n}\n","import type {\n\tAtomToken,\n\tLoadable,\n\tReadonlyPureSelectorFamilyToken,\n\tTimelineToken,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport type { Fn, RootStore, Store, Timeline } from \"atom.io/internal\"\n\nimport { type AtomTokenIndex, attachAtomIndex } from \"./attach-atom-index\"\nimport type { SelectorTokenIndex } from \"./attach-selector-index\"\nimport { attachSelectorIndex } from \"./attach-selector-index\"\nimport { attachTimelineFamily } from \"./attach-timeline-family\"\nimport { attachTimelineIndex } from \"./attach-timeline-index\"\nimport { attachTransactionIndex } from \"./attach-transaction-index\"\nimport { attachTransactionLogs } from \"./attach-transaction-logs\"\nimport { attachTypeSelectors } from \"./attach-type-selectors\"\n\nexport type IntrospectionStates = {\n\tatomIndex: AtomToken<AtomTokenIndex>\n\tselectorIndex: AtomToken<SelectorTokenIndex>\n\ttransactionIndex: AtomToken<TransactionToken<Fn>[]>\n\ttransactionLogSelectors: ReadonlyPureSelectorFamilyToken<\n\t\tTransactionOutcomeEvent<TransactionToken<Fn>>[],\n\t\tstring\n\t>\n\ttimelineIndex: AtomToken<TimelineToken<any>[]>\n\ttimelineSelectors: ReadonlyPureSelectorFamilyToken<Timeline<any>, string>\n\ttypeSelectors: ReadonlyPureSelectorFamilyToken<Loadable<string>, string>\n}\n\nexport const attachIntrospectionStates = (\n\tstore: RootStore,\n): IntrospectionStates => {\n\treturn {\n\t\tatomIndex: attachAtomIndex(store),\n\t\tselectorIndex: attachSelectorIndex(store),\n\t\ttransactionIndex: attachTransactionIndex(store),\n\t\ttransactionLogSelectors: attachTransactionLogs(store),\n\t\ttimelineIndex: attachTimelineIndex(store),\n\t\ttimelineSelectors: attachTimelineFamily(store),\n\t\ttypeSelectors: attachTypeSelectors(store),\n\t}\n}\n","import {\n\ttype AtomToken,\n\tgetState,\n\ttype ReadableToken,\n\ttype SelectorToken,\n} from \"atom.io\"\nimport { IMPLICIT, type Store } from \"atom.io/internal\"\n\nimport type { FamilyNode } from \".\"\nimport type { AtomTokenIndex } from \"./attach-atom-index\"\nimport { attachAtomIndex } from \"./attach-atom-index\"\nimport type { SelectorTokenIndex } from \"./attach-selector-index\"\nimport { attachSelectorIndex } from \"./attach-selector-index\"\n\nexport type ListResourcesParam = {\n\tatomFamilies: boolean\n\tselectorFamilies: boolean\n}\n\n/**\n * Auditor is a tool for identifying lingering resources in your store that may result in memory leaks.\n * @experimental\n */\nexport class Auditor {\n\tpublic readonly store: Store\n\tpublic auditorCreatedAt: number = performance.now()\n\tpublic statesCreatedAt: Map<string, number> = new Map()\n\tpublic readonly atomIndex: AtomToken<AtomTokenIndex>\n\tpublic readonly selectorIndex: AtomToken<SelectorTokenIndex>\n\tpublic disposed = false\n\n\tprivate readonly unsubscribeFromAtomCreation: () => void\n\tprivate readonly unsubscribeFromAtomDisposal: () => void\n\tprivate readonly unsubscribeFromSelectorCreation: () => void\n\tprivate readonly unsubscribeFromSelectorDisposal: () => void\n\n\t/**\n\t * @param {Store} store - The store to audit.\n\t */\n\tpublic constructor(store: Store = IMPLICIT.STORE) {\n\t\tthis.store = store\n\t\tthis.atomIndex = attachAtomIndex(this.store)\n\t\tthis.selectorIndex = attachSelectorIndex(this.store)\n\t\tthis.unsubscribeFromAtomCreation = this.store.on.atomCreation.subscribe(\n\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t({ key }) => {\n\t\t\t\tthis.statesCreatedAt.set(key, performance.now() - this.auditorCreatedAt)\n\t\t\t},\n\t\t)\n\t\tthis.unsubscribeFromAtomDisposal = this.store.on.atomDisposal.subscribe(\n\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t({ key }) => {\n\t\t\t\tthis.statesCreatedAt.delete(key)\n\t\t\t},\n\t\t)\n\t\tthis.unsubscribeFromSelectorCreation =\n\t\t\tthis.store.on.selectorCreation.subscribe(\n\t\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t\t({ key }) => {\n\t\t\t\t\tthis.statesCreatedAt.set(\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tperformance.now() - this.auditorCreatedAt,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t)\n\t\tthis.unsubscribeFromSelectorDisposal =\n\t\t\tthis.store.on.selectorDisposal.subscribe(\n\t\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t\t({ key }) => {\n\t\t\t\t\tthis.statesCreatedAt.delete(key)\n\t\t\t\t},\n\t\t\t)\n\t}\n\n\tpublic static readonly DEFAULT_LIST_RESOURCES_PARAM: ListResourcesParam = {\n\t\tatomFamilies: true,\n\t\tselectorFamilies: true,\n\t} satisfies ListResourcesParam\n\t/**\n\t * Lists all resources in the store, along with their creation time.\n\t *\n\t * @param {ListResourcesParam} [param] - Optional parameters for filtering the list of resources.\n\t * @returns {readonly [ReadableToken<unknown>, number]}[] - An array of tuples, where each tuple contains a state token belonging to a family in the store and that state's creation time.\n\t */\n\tpublic listResources(\n\t\tparam: ListResourcesParam = Auditor.DEFAULT_LIST_RESOURCES_PARAM,\n\t): (readonly [ReadableToken<unknown>, number])[] {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error(`This Auditor has been disposed`)\n\t\t}\n\t\tconst atoms = getState(this.atomIndex)\n\t\tconst selectors = getState(this.selectorIndex)\n\t\tconst atomFamilyNodes = [...atoms.values()].filter(\n\t\t\t(node): node is FamilyNode<AtomToken<unknown>> => `familyMembers` in node,\n\t\t)\n\t\tconst selectorFamilyNodes = [...selectors.values()].filter(\n\t\t\t(node): node is FamilyNode<SelectorToken<unknown>> =>\n\t\t\t\t`familyMembers` in node,\n\t\t)\n\t\tconst currentTime = performance.now()\n\t\tconst resources: (readonly [ReadableToken<unknown>, number])[] = []\n\t\tif (param.atomFamilies) {\n\t\t\tfor (const familyNode of atomFamilyNodes) {\n\t\t\t\tconst tokens = familyNode.familyMembers.values()\n\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\tconst storedTime = this.statesCreatedAt.get(token.key)\n\t\t\t\t\tconst creationTime = storedTime ?? this.auditorCreatedAt\n\t\t\t\t\tconst age = currentTime - creationTime\n\t\t\t\t\tresources.push([token, age])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (param.selectorFamilies) {\n\t\t\tfor (const familyNode of selectorFamilyNodes) {\n\t\t\t\tconst tokens = familyNode.familyMembers.values()\n\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\tconst storedTime = this.statesCreatedAt.get(token.key)\n\t\t\t\t\tconst creationTime = storedTime ?? this.auditorCreatedAt\n\t\t\t\t\tconst age = currentTime - creationTime\n\t\t\t\t\tresources.push([token, age])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn resources\n\t}\n\n\tpublic [Symbol.dispose](): void {\n\t\tthis.unsubscribeFromAtomCreation()\n\t\tthis.unsubscribeFromAtomDisposal()\n\t\tthis.unsubscribeFromSelectorCreation()\n\t\tthis.unsubscribeFromSelectorDisposal()\n\t\tthis.disposed = true\n\t}\n}\n","import { isPlainObject } from \"./refinery\"\n\n// if you found what you were looking for, return true and break\nexport type InspectionResult = Partial<{\n\tpathComplete: true\n\tjobComplete: true\n}>\nexport type InspectNode = (\n\tpath: string[],\n\tnode: unknown,\n) => InspectionResult | void\n\nexport const sprawl = (\n\ttree: Array<unknown> | object,\n\tinspector: InspectNode,\n): void => {\n\tconst walk = (path: string[], node: unknown): InspectionResult => {\n\t\tconst inspect = (p: string[], n: unknown): InspectionResult | null => {\n\t\t\t// console.log(parent)\n\t\t\tconst result = inspector(p, n)\n\t\t\tif (result) return result\n\t\t\treturn null\n\t\t}\n\t\tconst result = inspect(path, node)\n\t\tif (result?.jobComplete ?? result?.pathComplete) {\n\t\t\treturn result\n\t\t}\n\t\tconst childEntries = Array.isArray(node)\n\t\t\t? node.map((v, i) => [i, v])\n\t\t\t: isPlainObject(node)\n\t\t\t\t? Object.entries(node)\n\t\t\t\t: []\n\t\tfor (const [k, v] of childEntries) {\n\t\t\tconst subResult = walk([...path, k], v)\n\t\t\tif (subResult?.jobComplete) {\n\t\t\t\treturn subResult\n\t\t\t}\n\t\t}\n\t\treturn {}\n\t}\n\twalk([], tree)\n}\n","import type { Json } from \"atom.io/json\"\n\nimport type { Refinery, Supported } from \"./refinery\"\nimport { discoverType, jsonTreeRefinery, primitiveRefinery } from \"./refinery\"\nimport { sprawl } from \"./sprawl\"\n\nexport function diffNumber(a: number, b: number): Delta {\n\tconst sign = a < b ? `+` : `-`\n\treturn {\n\t\tsummary: `${sign}${Math.abs(a - b)} (${a} → ${b})`,\n\t}\n}\n\nexport function diffString(a: string, b: string): Delta {\n\tconst sign = a.length < b.length ? `+` : `-`\n\treturn {\n\t\tsummary: `${sign}${Math.abs(a.length - b.length)} (\"${a}\" → \"${b}\")`,\n\t}\n}\n\nexport function diffBoolean(a: boolean, b: boolean): Delta {\n\treturn {\n\t\tsummary: `${a} → ${b}`,\n\t}\n}\n\nexport function diffObject(\n\ta: Json.Tree.Object,\n\tb: Json.Tree.Object,\n\trecurse: Diff<unknown>,\n): Delta {\n\tlet summary = ``\n\tconst added: Delta[`added`] = []\n\tconst removed: Delta[`removed`] = []\n\tconst changed: Delta[`changed`] = []\n\n\tsprawl(a, (path, nodeA) => {\n\t\tlet key: string\n\t\tfor (key of path) {\n\t\t\tconst nodeB = b[key]\n\t\t\tif (nodeB === undefined) {\n\t\t\t\tremoved.push([key, JSON.stringify(nodeA)])\n\t\t\t} else {\n\t\t\t\tconst delta = recurse(nodeA, nodeB)\n\t\t\t\tif (delta.summary !== `No Change`) {\n\t\t\t\t\tchanged.push([key, delta])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\tsprawl(b, (path, nodeB) => {\n\t\tlet key: string\n\t\tfor (key of path) {\n\t\t\tconst nodeA = a[key]\n\t\t\tif (nodeA === undefined) {\n\t\t\t\tadded.push([key, JSON.stringify(nodeB)])\n\t\t\t}\n\t\t}\n\t})\n\n\tsummary = `~${changed.length} +${added.length} -${removed.length}`\n\n\treturn {\n\t\tsummary,\n\t\tadded,\n\t\tremoved,\n\t\tchanged,\n\t}\n}\n\nexport function diffArray(\n\ta: Json.Tree.Array,\n\tb: Json.Tree.Array,\n\trecurse: Diff<unknown>,\n): Delta {\n\treturn diffObject(a as any, b as any, recurse)\n}\n\ntype Delta = {\n\tsummary: string\n\tadded?: [path: string, addedStringifiedValue: string][]\n\tremoved?: [path: string, removedStringifiedValue: string][]\n\tchanged?: [path: string, delta: Delta][]\n}\n\ntype Diff<T> = (a: T, b: T) => Delta\ntype DiffTree<T> = (a: T, b: T, recurse: Differ<any, any>[`diff`]) => Delta\n\nexport class Differ<\n\tLeaf extends Record<string, any>,\n\tTree extends Record<string, any>,\n> {\n\tpublic leafRefinery: Refinery<Leaf>\n\tpublic treeRefinery: Refinery<Tree>\n\tpublic leafDiffers: { [KL in keyof Leaf]: Diff<Supported<Leaf[KL]>> }\n\tpublic treeDiffers: { [KT in keyof Tree]: DiffTree<Supported<Tree[KT]>> }\n\n\tpublic constructor(\n\t\tleafRefinery: Refinery<Leaf>,\n\t\ttreeRefinery: Refinery<Tree>,\n\t\tdiffFunctions: {\n\t\t\t[KT in keyof Tree]: DiffTree<Supported<Tree[KT]>>\n\t\t} & { [KL in keyof Leaf]: Diff<Supported<Leaf[KL]>> },\n\t) {\n\t\tthis.leafRefinery = leafRefinery\n\t\tthis.treeRefinery = treeRefinery\n\t\tthis.leafDiffers = {} as any\n\t\tthis.treeDiffers = {} as any\n\t\tfor (const key of Object.keys(leafRefinery.supported)) {\n\t\t\tconst diffFunction = diffFunctions[key]\n\t\t\tthis.leafDiffers[key as keyof Leaf] = diffFunction\n\t\t}\n\t\tfor (const key of Object.keys(treeRefinery.supported)) {\n\t\t\tconst diffFunction = diffFunctions[key]\n\t\t\tthis.treeDiffers[key as keyof Tree] = diffFunction\n\t\t}\n\t}\n\n\tpublic diff(a: unknown, b: unknown): Delta {\n\t\tif (a === b) {\n\t\t\treturn { summary: `No Change` }\n\t\t}\n\n\t\tconst aRefined = this.leafRefinery.refine(a) ?? this.treeRefinery.refine(a)\n\t\tconst bRefined = this.leafRefinery.refine(b) ?? this.treeRefinery.refine(b)\n\n\t\tif (aRefined !== null && bRefined !== null) {\n\t\t\tif (aRefined.type === bRefined.type) {\n\t\t\t\tif (aRefined.type in this.leafDiffers) {\n\t\t\t\t\tconst delta = this.leafDiffers[aRefined.type](\n\t\t\t\t\t\taRefined.data,\n\t\t\t\t\t\tbRefined.data,\n\t\t\t\t\t)\n\t\t\t\t\treturn delta\n\t\t\t\t}\n\t\t\t\tif (aRefined.type in this.treeDiffers) {\n\t\t\t\t\tconst delta = this.treeDiffers[aRefined.type](\n\t\t\t\t\t\taRefined.data,\n\t\t\t\t\t\tbRefined.data,\n\t\t\t\t\t\t(x, y) => this.diff(x, y),\n\t\t\t\t\t)\n\t\t\t\t\treturn delta\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst typeA = discoverType(a)\n\t\tconst typeB = discoverType(b)\n\t\tif (typeA === typeB) {\n\t\t\treturn {\n\t\t\t\tsummary: `${typeA} → ${typeB}`,\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tsummary: `Type change: ${typeA} → ${typeB}`,\n\t\t}\n\t}\n}\n\nexport const prettyJson: Differ<\n\t{\n\t\tnumber: (input: unknown) => input is number\n\t\tstring: (input: unknown) => input is string\n\t\tboolean: (input: unknown) => input is boolean\n\t\tnull: (input: unknown) => input is null\n\t},\n\t{\n\t\tobject: (input: unknown) => input is Json.Tree.Object\n\t\tarray: (input: unknown) => input is Json.Tree.Array\n\t}\n> = new Differ(primitiveRefinery, jsonTreeRefinery, {\n\tnumber: diffNumber,\n\tstring: diffString,\n\tboolean: diffBoolean,\n\tnull: () => ({ summary: `No Change` }),\n\tobject: diffObject,\n\tarray: diffArray,\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["base: AtomTokenIndex","base: SelectorTokenIndex","tokens: TransactionToken<Fn>[]","primitiveRefinery: Refinery<{\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","jsonTreeRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n}>","jsonRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}>","state: unknown","resources: (readonly [ReadableToken<unknown>, number])[]","result","added: Delta[`added`]","removed: Delta[`removed`]","changed: Delta[`changed`]","key: string","prettyJson: Differ<\n\t{\n\t\tnumber: (input: unknown) => input is number\n\t\tstring: (input: unknown) => input is string\n\t\tboolean: (input: unknown) => input is boolean\n\t\tnull: (input: unknown) => input is null\n\t},\n\t{\n\t\tobject: (input: unknown) => input is Json.Tree.Object\n\t\tarray: (input: unknown) => input is Json.Tree.Array\n\t}\n>"],"sources":["../../src/introspection/attach-atom-index.ts","../../src/introspection/attach-selector-index.ts","../../src/introspection/attach-timeline-family.ts","../../src/introspection/attach-timeline-index.ts","../../src/introspection/attach-transaction-index.ts","../../src/introspection/attach-transaction-logs.ts","../../src/introspection/refinery.ts","../../src/introspection/attach-type-selectors.ts","../../src/introspection/attach-introspection-states.ts","../../src/introspection/auditor.ts","../../src/introspection/sprawl.ts","../../src/introspection/differ.ts"],"sourcesContent":["import type { AtomToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtom,\n\tdeposit,\n\tisReservedIntrospectionKey,\n} from \"atom.io/internal\"\n\nimport type { WritableTokenIndex } from \".\"\n\nexport type AtomTokenIndex = WritableTokenIndex<AtomToken<unknown, any, unknown>>\n\nexport const attachAtomIndex = (store: Store): AtomToken<AtomTokenIndex> => {\n\treturn createRegularAtom<AtomTokenIndex, never, never>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Atom Token Index`,\n\t\t\tdefault: () => {\n\t\t\t\tconst base: AtomTokenIndex = new Map()\n\t\t\t\tfor (const [key, val] of store.atoms) {\n\t\t\t\t\tif (isReservedIntrospectionKey(key)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst token = deposit(val)\n\t\t\t\t\tif (val.family) {\n\t\t\t\t\t\tlet familyNode = base.get(val.family.key)\n\t\t\t\t\t\tif (!familyNode || !(`familyMembers` in familyNode)) {\n\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\tkey: val.family.key,\n\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbase.set(val.family.key, familyNode)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfamilyNode.familyMembers.set(val.family.subKey, token)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbase.set(key, token)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn base\n\t\t\t},\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.atomCreation.subscribe(`introspection`, (atomToken) => {\n\t\t\t\t\t\tif (isReservedIntrospectionKey(atomToken.key)) {\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tif (atomToken.family) {\n\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = atomToken.family\n\t\t\t\t\t\t\t\tlet familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tfamilyNode === undefined ||\n\t\t\t\t\t\t\t\t\t!(`familyMembers` in familyNode)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\t\t\tkey: familyKey,\n\t\t\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tself.set(familyKey, familyNode)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tfamilyNode.familyMembers.set(subKey, atomToken)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tself.set(atomToken.key, atomToken)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t\tstore.on.atomDisposal.subscribe(`introspection`, (atomToken) => {\n\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\tif (atomToken.family) {\n\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = atomToken.family\n\t\t\t\t\t\t\t\tconst familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\tif (familyNode && `familyMembers` in familyNode) {\n\t\t\t\t\t\t\t\t\tfamilyNode.familyMembers.delete(subKey)\n\t\t\t\t\t\t\t\t\tif (familyNode.familyMembers.size === 0) {\n\t\t\t\t\t\t\t\t\t\tself.delete(familyKey)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type { AtomToken, SelectorToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtom,\n\tdeposit,\n\tisReservedIntrospectionKey,\n} from \"atom.io/internal\"\n\nimport type { WritableTokenIndex } from \".\"\n\nexport type SelectorTokenIndex = WritableTokenIndex<\n\tSelectorToken<unknown, any, any>\n>\n\nexport const attachSelectorIndex = (\n\tstore: Store,\n): AtomToken<SelectorTokenIndex> => {\n\treturn createRegularAtom<SelectorTokenIndex, never, never>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Selector Token Index`,\n\t\t\tdefault: () => {\n\t\t\t\tconst base: SelectorTokenIndex = new Map()\n\t\t\t\tfor (const map of [store.readonlySelectors, store.writableSelectors]) {\n\t\t\t\t\tfor (const [key, val] of map) {\n\t\t\t\t\t\tif (isReservedIntrospectionKey(key)) {\n\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst token = deposit(val)\n\t\t\t\t\t\tif (val.family) {\n\t\t\t\t\t\t\tlet familyNode = base.get(val.family.key)\n\t\t\t\t\t\t\tif (!familyNode || !(`familyMembers` in familyNode)) {\n\t\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\t\tkey: val.family.key,\n\t\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbase.set(val.family.key, familyNode)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfamilyNode.familyMembers.set(val.family.subKey, token)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tbase.set(key, token)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn base\n\t\t\t},\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.selectorCreation.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(selectorToken) => {\n\t\t\t\t\t\t\tif (isReservedIntrospectionKey(selectorToken.key)) {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\t\tif (selectorToken.family) {\n\t\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = selectorToken.family\n\t\t\t\t\t\t\t\t\tlet familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tfamilyNode === undefined ||\n\t\t\t\t\t\t\t\t\t\t!(`familyMembers` in familyNode)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tfamilyNode = {\n\t\t\t\t\t\t\t\t\t\t\tkey: familyKey,\n\t\t\t\t\t\t\t\t\t\t\tfamilyMembers: new Map(),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tself.set(familyKey, familyNode)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tfamilyNode.familyMembers.set(subKey, selectorToken)\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tself.set(selectorToken.key, selectorToken)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\n\t\t\t\t\tstore.on.selectorDisposal.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(selectorToken) => {\n\t\t\t\t\t\t\tsetSelf((self) => {\n\t\t\t\t\t\t\t\tif (selectorToken.family) {\n\t\t\t\t\t\t\t\t\tconst { key: familyKey, subKey } = selectorToken.family\n\t\t\t\t\t\t\t\t\tconst familyNode = self.get(familyKey)\n\t\t\t\t\t\t\t\t\tif (familyNode && `familyMembers` in familyNode) {\n\t\t\t\t\t\t\t\t\t\tfamilyNode.familyMembers.delete(subKey)\n\t\t\t\t\t\t\t\t\t\tif (familyNode.familyMembers.size === 0) {\n\t\t\t\t\t\t\t\t\t\t\tself.delete(familyKey)\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tself.delete(selectorToken.key)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn new Map(self)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type { ReadonlyPureSelectorFamilyToken } from \"atom.io\"\nimport type { RootStore, Timeline } from \"atom.io/internal\"\nimport {\n\tcreateRegularAtomFamily,\n\tcreateSelectorFamily,\n\tSubject,\n} from \"atom.io/internal\"\n\nexport const attachTimelineFamily = (\n\tstore: RootStore,\n): ReadonlyPureSelectorFamilyToken<Timeline<any>, string> => {\n\tconst findTimelineLogState__INTERNAL = createRegularAtomFamily<\n\t\tTimeline<any>,\n\t\tstring,\n\t\tnever\n\t>(store, {\n\t\tkey: `🔍 Timeline Update Log (Internal)`,\n\t\tdefault: (key) =>\n\t\t\tstore.timelines.get(key) ?? {\n\t\t\t\ttype: `timeline`,\n\t\t\t\tkey: ``,\n\t\t\t\tat: 0,\n\t\t\t\ttimeTraveling: null,\n\t\t\t\thistory: [],\n\t\t\t\tselectorTime: null,\n\t\t\t\ttransactionKey: null,\n\t\t\t\tinstall: () => {},\n\t\t\t\tsubject: new Subject(),\n\t\t\t\tsubscriptions: new Map(),\n\t\t\t},\n\t\teffects: (key) => [\n\t\t\t({ setSelf }) => {\n\t\t\t\tconst tl = store.timelines.get(key)\n\t\t\t\ttl?.subject.subscribe(`introspection`, (_) => {\n\t\t\t\t\tsetSelf({ ...tl })\n\t\t\t\t})\n\t\t\t},\n\t\t],\n\t})\n\tconst findTimelineLogState = createSelectorFamily<\n\t\tTimeline<any>,\n\t\tstring,\n\t\tnever\n\t>(store, {\n\t\tkey: `🔍 Timeline Update Log`,\n\t\tget:\n\t\t\t(key) =>\n\t\t\t({ get }) =>\n\t\t\t\tget(findTimelineLogState__INTERNAL, key),\n\t})\n\treturn findTimelineLogState\n}\n","import type { AtomToken, TimelineToken } from \"atom.io\"\nimport type { Store } from \"atom.io/internal\"\nimport { createRegularAtom } from \"atom.io/internal\"\n\nexport const attachTimelineIndex = (\n\tstore: Store,\n): AtomToken<TimelineToken<any>[]> => {\n\treturn createRegularAtom<TimelineToken<any>[], never, never>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Timeline Token Index`,\n\t\t\tdefault: () =>\n\t\t\t\t[...store.timelines].map(([key]): TimelineToken<any> => {\n\t\t\t\t\treturn { key, type: `timeline` }\n\t\t\t\t}),\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.timelineCreation.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(timelineToken) => {\n\t\t\t\t\t\t\tsetSelf((state) => [...state, timelineToken])\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type { AtomToken, TransactionToken } from \"atom.io\"\nimport type { Fn, Store } from \"atom.io/internal\"\nimport { createRegularAtom, isReservedIntrospectionKey } from \"atom.io/internal\"\n\nexport const attachTransactionIndex = (\n\tstore: Store,\n): AtomToken<TransactionToken<Fn>[]> => {\n\treturn createRegularAtom<TransactionToken<Fn>[], never, never>(\n\t\tstore,\n\t\t{\n\t\t\tkey: `🔍 Transaction Token Index`,\n\t\t\tdefault: () => {\n\t\t\t\tconst tokens: TransactionToken<Fn>[] = []\n\t\t\t\tfor (const [key] of store.transactions) {\n\t\t\t\t\tif (isReservedIntrospectionKey(key)) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\ttokens.push({ key, type: `transaction` })\n\t\t\t\t}\n\t\t\t\treturn tokens\n\t\t\t},\n\t\t\teffects: [\n\t\t\t\t({ setSelf }) => {\n\t\t\t\t\tstore.on.transactionCreation.subscribe(\n\t\t\t\t\t\t`introspection`,\n\t\t\t\t\t\t(transactionToken) => {\n\t\t\t\t\t\t\tif (isReservedIntrospectionKey(transactionToken.key)) {\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tsetSelf((state) => [...state, transactionToken])\n\t\t\t\t\t\t},\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\tundefined,\n\t)\n}\n","import type {\n\tReadonlyPureSelectorFamilyToken,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport type { RootStore } from \"atom.io/internal\"\nimport { createRegularAtomFamily, createSelectorFamily } from \"atom.io/internal\"\n\nexport const attachTransactionLogs = (\n\tstore: RootStore,\n): ReadonlyPureSelectorFamilyToken<\n\tTransactionOutcomeEvent<TransactionToken<any>>[],\n\tstring\n> => {\n\tconst transactionUpdateLogAtoms = createRegularAtomFamily<\n\t\tTransactionOutcomeEvent<TransactionToken<any>>[],\n\t\tstring,\n\t\tnever\n\t>(store, {\n\t\tkey: `🔍 Transaction Update Log (Internal)`,\n\t\tdefault: () => [],\n\t\teffects: (key) => [\n\t\t\t({ setSelf }) => {\n\t\t\t\tconst tx = store.transactions.get(key)\n\t\t\t\ttx?.subject.subscribe(`introspection`, (transactionUpdate) => {\n\t\t\t\t\tif (transactionUpdate.token.key === key) {\n\t\t\t\t\t\tsetSelf((state) => [...state, transactionUpdate])\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t},\n\t\t],\n\t})\n\tconst findTransactionUpdateLogState = createSelectorFamily<\n\t\tTransactionOutcomeEvent<TransactionToken<any>>[],\n\t\tstring,\n\t\tnever\n\t>(store, {\n\t\tkey: `🔍 Transaction Update Log`,\n\t\tget:\n\t\t\t(key) =>\n\t\t\t({ get }) =>\n\t\t\t\tget(transactionUpdateLogAtoms, key),\n\t})\n\treturn findTransactionUpdateLogState\n}\n","import type { Flat, Refinement } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nexport type ClassSignature = abstract new (...args: any) => any\n\nexport type RefinementStrategy = ClassSignature | Refinement<unknown, any>\n\nexport type Supported<Refine extends RefinementStrategy> =\n\tRefine extends Refinement<unknown, infer T>\n\t\t? T\n\t\t: Refine extends ClassSignature\n\t\t\t? InstanceType<Refine>\n\t\t\t: never\n\nexport type RefinementSupport = Record<string, RefinementStrategy>\n\nexport class Refinery<SupportedTypes extends RefinementSupport> {\n\tpublic supported: SupportedTypes\n\n\tpublic constructor(supported: SupportedTypes) {\n\t\tthis.supported = supported\n\t}\n\n\tpublic refine<T>(input: T):\n\t\t| Flat<{\n\t\t\t\t[K in keyof SupportedTypes]: T extends Supported<SupportedTypes[K]>\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttype: K\n\t\t\t\t\t\t\tdata: Supported<SupportedTypes[K]>\n\t\t\t\t\t\t}\n\t\t\t\t\t: Supported<SupportedTypes[K]> extends T\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: K\n\t\t\t\t\t\t\t\tdata: Supported<SupportedTypes[K]>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: never\n\t\t }>[keyof SupportedTypes]\n\t\t| (T extends Supported<SupportedTypes[keyof SupportedTypes]>\n\t\t\t\t? never\n\t\t\t\t: null) {\n\t\tfor (const [key, refiner] of Object.entries(this.supported)) {\n\t\t\ttry {\n\t\t\t\tif (\n\t\t\t\t\t// @ts-expect-error that's the point\n\t\t\t\t\trefiner(input) === true &&\n\t\t\t\t\trefiner !== Boolean\n\t\t\t\t) {\n\t\t\t\t\treturn { type: key, data: input } as any\n\t\t\t\t}\n\t\t\t} catch (_) {\n\t\t\t\ttry {\n\t\t\t\t\tif (input instanceof refiner) {\n\t\t\t\t\t\treturn { type: key, data: input } as any\n\t\t\t\t\t}\n\t\t\t\t} catch (__) {}\n\t\t\t}\n\t\t}\n\t\treturn null as any\n\t}\n}\n\nexport const primitiveRefinery: Refinery<{\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}> = new Refinery({\n\tnumber: (input: unknown): input is number => typeof input === `number`,\n\tstring: (input: unknown): input is string => typeof input === `string`,\n\tboolean: (input: unknown): input is boolean => typeof input === `boolean`,\n\tnull: (input: unknown): input is null => input === null,\n})\n\nexport function isPlainObject(input: unknown): input is Json.Tree.Object {\n\tif (!input) {\n\t\treturn false\n\t}\n\tconst prototype = Object.getPrototypeOf(input)\n\treturn prototype === Object.prototype\n}\n\nexport const jsonTreeRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n}> = new Refinery({\n\tobject: isPlainObject,\n\tarray: (input: unknown): input is Json.Tree.Array => Array.isArray(input),\n})\n\nexport const jsonRefinery: Refinery<{\n\tobject: (input: unknown) => input is Json.Tree.Object\n\tarray: (input: unknown) => input is Json.Tree.Array\n\tnumber: (input: unknown) => input is number\n\tstring: (input: unknown) => input is string\n\tboolean: (input: unknown) => input is boolean\n\tnull: (input: unknown) => input is null\n}> = new Refinery({\n\t...primitiveRefinery.supported,\n\t...jsonTreeRefinery.supported,\n})\n\nexport type JsonType = keyof typeof jsonRefinery.supported\n\nexport const discoverType = (\n\tinput: unknown,\n): JsonType | `Map` | `Set` | `undefined` | (string & {}) => {\n\tif (input === undefined) {\n\t\treturn `undefined`\n\t}\n\tconst refined = jsonRefinery.refine(input)\n\tif (refined) {\n\t\treturn refined.type\n\t}\n\treturn Object.getPrototypeOf(input).constructor.name\n}\n","import type { Loadable, ReadonlyPureSelectorFamilyToken } from \"atom.io\"\nimport type { RootStore } from \"atom.io/internal\"\nimport { createReadonlyPureSelectorFamily } from \"atom.io/internal\"\n\nimport { discoverType } from \"./refinery\"\n\nexport const attachTypeSelectors = (\n\tstore: RootStore,\n): ReadonlyPureSelectorFamilyToken<Loadable<string>, string> => {\n\tconst typeSelectors = createReadonlyPureSelectorFamily<\n\t\tLoadable<string>,\n\t\tstring,\n\t\tnever\n\t>(store, {\n\t\tkey: `🔍 State Type`,\n\t\tget:\n\t\t\t(key) =>\n\t\t\tasync ({ get }) => {\n\t\t\t\tlet state: unknown\n\t\t\t\ttry {\n\t\t\t\t\tconst token =\n\t\t\t\t\t\tstore.atoms.get(key) ??\n\t\t\t\t\t\tstore.writableSelectors.get(key) ??\n\t\t\t\t\t\tstore.readonlySelectors.get(key)\n\t\t\t\t\tif (token === undefined) {\n\t\t\t\t\t\tthrow new Error(`Could not find state with key \"${key}\"`)\n\t\t\t\t\t}\n\t\t\t\t\tstate = get(token)\n\t\t\t\t} catch (_) {\n\t\t\t\t\treturn `error`\n\t\t\t\t}\n\t\t\t\tif (state instanceof Promise) {\n\t\t\t\t\tstate = await state\n\t\t\t\t}\n\t\t\t\tconst typeOfState = discoverType(state)\n\t\t\t\treturn typeOfState\n\t\t\t},\n\t})\n\treturn typeSelectors\n}\n","import type {\n\tAtomToken,\n\tLoadable,\n\tReadonlyPureSelectorFamilyToken,\n\tTimelineToken,\n\tTransactionOutcomeEvent,\n\tTransactionToken,\n} from \"atom.io\"\nimport type { Fn, RootStore, Store, Timeline } from \"atom.io/internal\"\n\nimport { type AtomTokenIndex, attachAtomIndex } from \"./attach-atom-index\"\nimport type { SelectorTokenIndex } from \"./attach-selector-index\"\nimport { attachSelectorIndex } from \"./attach-selector-index\"\nimport { attachTimelineFamily } from \"./attach-timeline-family\"\nimport { attachTimelineIndex } from \"./attach-timeline-index\"\nimport { attachTransactionIndex } from \"./attach-transaction-index\"\nimport { attachTransactionLogs } from \"./attach-transaction-logs\"\nimport { attachTypeSelectors } from \"./attach-type-selectors\"\n\nexport type IntrospectionStates = {\n\tatomIndex: AtomToken<AtomTokenIndex>\n\tselectorIndex: AtomToken<SelectorTokenIndex>\n\ttransactionIndex: AtomToken<TransactionToken<Fn>[]>\n\ttransactionLogSelectors: ReadonlyPureSelectorFamilyToken<\n\t\tTransactionOutcomeEvent<TransactionToken<Fn>>[],\n\t\tstring\n\t>\n\ttimelineIndex: AtomToken<TimelineToken<any>[]>\n\ttimelineSelectors: ReadonlyPureSelectorFamilyToken<Timeline<any>, string>\n\ttypeSelectors: ReadonlyPureSelectorFamilyToken<Loadable<string>, string>\n}\n\nexport const attachIntrospectionStates = (\n\tstore: RootStore,\n): IntrospectionStates => {\n\treturn {\n\t\tatomIndex: attachAtomIndex(store),\n\t\tselectorIndex: attachSelectorIndex(store),\n\t\ttransactionIndex: attachTransactionIndex(store),\n\t\ttransactionLogSelectors: attachTransactionLogs(store),\n\t\ttimelineIndex: attachTimelineIndex(store),\n\t\ttimelineSelectors: attachTimelineFamily(store),\n\t\ttypeSelectors: attachTypeSelectors(store),\n\t}\n}\n","import {\n\ttype AtomToken,\n\tgetState,\n\ttype ReadableToken,\n\ttype SelectorToken,\n} from \"atom.io\"\nimport { IMPLICIT, type Store } from \"atom.io/internal\"\n\nimport type { FamilyNode } from \".\"\nimport type { AtomTokenIndex } from \"./attach-atom-index\"\nimport { attachAtomIndex } from \"./attach-atom-index\"\nimport type { SelectorTokenIndex } from \"./attach-selector-index\"\nimport { attachSelectorIndex } from \"./attach-selector-index\"\n\nexport type ListResourcesParam = {\n\tatomFamilies: boolean\n\tselectorFamilies: boolean\n}\n\n/**\n * Auditor is a tool for identifying lingering resources in your store that may result in memory leaks.\n * @experimental\n */\nexport class Auditor {\n\tpublic readonly store: Store\n\tpublic auditorCreatedAt: number = performance.now()\n\tpublic statesCreatedAt: Map<string, number> = new Map()\n\tpublic readonly atomIndex: AtomToken<AtomTokenIndex>\n\tpublic readonly selectorIndex: AtomToken<SelectorTokenIndex>\n\tpublic disposed = false\n\n\tprivate readonly unsubscribeFromAtomCreation: () => void\n\tprivate readonly unsubscribeFromAtomDisposal: () => void\n\tprivate readonly unsubscribeFromSelectorCreation: () => void\n\tprivate readonly unsubscribeFromSelectorDisposal: () => void\n\n\t/**\n\t * @param {Store} store - The store to audit.\n\t */\n\tpublic constructor(store: Store = IMPLICIT.STORE) {\n\t\tthis.store = store\n\t\tthis.atomIndex = attachAtomIndex(this.store)\n\t\tthis.selectorIndex = attachSelectorIndex(this.store)\n\t\tthis.unsubscribeFromAtomCreation = this.store.on.atomCreation.subscribe(\n\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t({ key }) => {\n\t\t\t\tthis.statesCreatedAt.set(key, performance.now() - this.auditorCreatedAt)\n\t\t\t},\n\t\t)\n\t\tthis.unsubscribeFromAtomDisposal = this.store.on.atomDisposal.subscribe(\n\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t({ key }) => {\n\t\t\t\tthis.statesCreatedAt.delete(key)\n\t\t\t},\n\t\t)\n\t\tthis.unsubscribeFromSelectorCreation =\n\t\t\tthis.store.on.selectorCreation.subscribe(\n\t\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t\t({ key }) => {\n\t\t\t\t\tthis.statesCreatedAt.set(\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tperformance.now() - this.auditorCreatedAt,\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t)\n\t\tthis.unsubscribeFromSelectorDisposal =\n\t\t\tthis.store.on.selectorDisposal.subscribe(\n\t\t\t\t`auditor-${this.auditorCreatedAt}`,\n\t\t\t\t({ key }) => {\n\t\t\t\t\tthis.statesCreatedAt.delete(key)\n\t\t\t\t},\n\t\t\t)\n\t}\n\n\tpublic static readonly DEFAULT_LIST_RESOURCES_PARAM: ListResourcesParam = {\n\t\tatomFamilies: true,\n\t\tselectorFamilies: true,\n\t} satisfies ListResourcesParam\n\t/**\n\t * Lists all resources in the store, along with their creation time.\n\t *\n\t * @param {ListResourcesParam} [param] - Optional parameters for filtering the list of resources.\n\t * @returns {readonly [ReadableToken<unknown>, number]}[] - An array of tuples, where each tuple contains a state token belonging to a family in the store and that state's creation time.\n\t */\n\tpublic listResources(\n\t\tparam: ListResourcesParam = Auditor.DEFAULT_LIST_RESOURCES_PARAM,\n\t): (readonly [ReadableToken<unknown>, number])[] {\n\t\tif (this.disposed) {\n\t\t\tthrow new Error(`This Auditor has been disposed`)\n\t\t}\n\t\tconst atoms = getState(this.atomIndex)\n\t\tconst selectors = getState(this.selectorIndex)\n\t\tconst atomFamilyNodes = [...atoms.values()].filter(\n\t\t\t(node): node is FamilyNode<AtomToken<unknown>> => `familyMembers` in node,\n\t\t)\n\t\tconst selectorFamilyNodes = [...selectors.values()].filter(\n\t\t\t(node): node is FamilyNode<SelectorToken<unknown>> =>\n\t\t\t\t`familyMembers` in node,\n\t\t)\n\t\tconst currentTime = performance.now()\n\t\tconst resources: (readonly [ReadableToken<unknown>, number])[] = []\n\t\tif (param.atomFamilies) {\n\t\t\tfor (const familyNode of atomFamilyNodes) {\n\t\t\t\tconst tokens = familyNode.familyMembers.values()\n\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\tconst storedTime = this.statesCreatedAt.get(token.key)\n\t\t\t\t\tconst creationTime = storedTime ?? this.auditorCreatedAt\n\t\t\t\t\tconst age = currentTime - creationTime\n\t\t\t\t\tresources.push([token, age])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (param.selectorFamilies) {\n\t\t\tfor (const familyNode of selectorFamilyNodes) {\n\t\t\t\tconst tokens = familyNode.familyMembers.values()\n\t\t\t\tfor (const token of tokens) {\n\t\t\t\t\tconst storedTime = this.statesCreatedAt.get(token.key)\n\t\t\t\t\tconst creationTime = storedTime ?? this.auditorCreatedAt\n\t\t\t\t\tconst age = currentTime - creationTime\n\t\t\t\t\tresources.push([token, age])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn resources\n\t}\n\n\tpublic [Symbol.dispose](): void {\n\t\tthis.unsubscribeFromAtomCreation()\n\t\tthis.unsubscribeFromAtomDisposal()\n\t\tthis.unsubscribeFromSelectorCreation()\n\t\tthis.unsubscribeFromSelectorDisposal()\n\t\tthis.disposed = true\n\t}\n}\n","import { isPlainObject } from \"./refinery\"\n\n// if you found what you were looking for, return true and break\nexport type InspectionResult = Partial<{\n\tpathComplete: true\n\tjobComplete: true\n}>\nexport type InspectNode = (\n\tpath: string[],\n\tnode: unknown,\n) => InspectionResult | void\n\nexport const sprawl = (\n\ttree: Array<unknown> | object,\n\tinspector: InspectNode,\n): void => {\n\tconst walk = (path: string[], node: unknown): InspectionResult => {\n\t\tconst inspect = (p: string[], n: unknown): InspectionResult | null => {\n\t\t\t// console.log(parent)\n\t\t\tconst result = inspector(p, n)\n\t\t\tif (result) return result\n\t\t\treturn null\n\t\t}\n\t\tconst result = inspect(path, node)\n\t\tif (result?.jobComplete ?? result?.pathComplete) {\n\t\t\treturn result\n\t\t}\n\t\tconst childEntries = Array.isArray(node)\n\t\t\t? node.map((v, i) => [i, v])\n\t\t\t: isPlainObject(node)\n\t\t\t\t? Object.entries(node)\n\t\t\t\t: []\n\t\tfor (const [k, v] of childEntries) {\n\t\t\tconst subResult = walk([...path, k], v)\n\t\t\tif (subResult?.jobComplete) {\n\t\t\t\treturn subResult\n\t\t\t}\n\t\t}\n\t\treturn {}\n\t}\n\twalk([], tree)\n}\n","import type { Json } from \"atom.io/json\"\n\nimport type { Refinery, Supported } from \"./refinery\"\nimport { discoverType, jsonTreeRefinery, primitiveRefinery } from \"./refinery\"\nimport { sprawl } from \"./sprawl\"\n\nexport function diffNumber(a: number, b: number): Delta {\n\tconst sign = a < b ? `+` : `-`\n\treturn {\n\t\tsummary: `${sign}${Math.abs(a - b)} (${a} → ${b})`,\n\t}\n}\n\nexport function diffString(a: string, b: string): Delta {\n\tconst sign = a.length < b.length ? `+` : `-`\n\treturn {\n\t\tsummary: `${sign}${Math.abs(a.length - b.length)} (\"${a}\" → \"${b}\")`,\n\t}\n}\n\nexport function diffBoolean(a: boolean, b: boolean): Delta {\n\treturn {\n\t\tsummary: `${a} → ${b}`,\n\t}\n}\n\nexport function diffObject(\n\ta: Json.Tree.Object,\n\tb: Json.Tree.Object,\n\trecurse: Diff<unknown>,\n): Delta {\n\tlet summary = ``\n\tconst added: Delta[`added`] = []\n\tconst removed: Delta[`removed`] = []\n\tconst changed: Delta[`changed`] = []\n\n\tsprawl(a, (path, nodeA) => {\n\t\tlet key: string\n\t\tfor (key of path) {\n\t\t\tconst nodeB = b[key]\n\t\t\tif (nodeB === undefined) {\n\t\t\t\tremoved.push([key, JSON.stringify(nodeA)])\n\t\t\t} else {\n\t\t\t\tconst delta = recurse(nodeA, nodeB)\n\t\t\t\tif (delta.summary !== `No Change`) {\n\t\t\t\t\tchanged.push([key, delta])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\tsprawl(b, (path, nodeB) => {\n\t\tlet key: string\n\t\tfor (key of path) {\n\t\t\tconst nodeA = a[key]\n\t\t\tif (nodeA === undefined) {\n\t\t\t\tadded.push([key, JSON.stringify(nodeB)])\n\t\t\t}\n\t\t}\n\t})\n\n\tsummary = `~${changed.length} +${added.length} -${removed.length}`\n\n\treturn {\n\t\tsummary,\n\t\tadded,\n\t\tremoved,\n\t\tchanged,\n\t}\n}\n\nexport function diffArray(\n\ta: Json.Tree.Array,\n\tb: Json.Tree.Array,\n\trecurse: Diff<unknown>,\n): Delta {\n\treturn diffObject(a as any, b as any, recurse)\n}\n\ntype Delta = {\n\tsummary: string\n\tadded?: [path: string, addedStringifiedValue: string][]\n\tremoved?: [path: string, removedStringifiedValue: string][]\n\tchanged?: [path: string, delta: Delta][]\n}\n\ntype Diff<T> = (a: T, b: T) => Delta\ntype DiffTree<T> = (a: T, b: T, recurse: Differ<any, any>[`diff`]) => Delta\n\nexport class Differ<\n\tLeaf extends Record<string, any>,\n\tTree extends Record<string, any>,\n> {\n\tpublic leafRefinery: Refinery<Leaf>\n\tpublic treeRefinery: Refinery<Tree>\n\tpublic leafDiffers: { [KL in keyof Leaf]: Diff<Supported<Leaf[KL]>> }\n\tpublic treeDiffers: { [KT in keyof Tree]: DiffTree<Supported<Tree[KT]>> }\n\n\tpublic constructor(\n\t\tleafRefinery: Refinery<Leaf>,\n\t\ttreeRefinery: Refinery<Tree>,\n\t\tdiffFunctions: {\n\t\t\t[KT in keyof Tree]: DiffTree<Supported<Tree[KT]>>\n\t\t} & { [KL in keyof Leaf]: Diff<Supported<Leaf[KL]>> },\n\t) {\n\t\tthis.leafRefinery = leafRefinery\n\t\tthis.treeRefinery = treeRefinery\n\t\tthis.leafDiffers = {} as any\n\t\tthis.treeDiffers = {} as any\n\t\tfor (const key of Object.keys(leafRefinery.supported)) {\n\t\t\tconst diffFunction = diffFunctions[key]\n\t\t\tthis.leafDiffers[key as keyof Leaf] = diffFunction\n\t\t}\n\t\tfor (const key of Object.keys(treeRefinery.supported)) {\n\t\t\tconst diffFunction = diffFunctions[key]\n\t\t\tthis.treeDiffers[key as keyof Tree] = diffFunction\n\t\t}\n\t}\n\n\tpublic diff(a: unknown, b: unknown): Delta {\n\t\tif (a === b) {\n\t\t\treturn { summary: `No Change` }\n\t\t}\n\n\t\tconst aRefined = this.leafRefinery.refine(a) ?? this.treeRefinery.refine(a)\n\t\tconst bRefined = this.leafRefinery.refine(b) ?? this.treeRefinery.refine(b)\n\n\t\tif (aRefined !== null && bRefined !== null) {\n\t\t\tif (aRefined.type === bRefined.type) {\n\t\t\t\tif (aRefined.type in this.leafDiffers) {\n\t\t\t\t\tconst delta = this.leafDiffers[aRefined.type](\n\t\t\t\t\t\taRefined.data,\n\t\t\t\t\t\tbRefined.data,\n\t\t\t\t\t)\n\t\t\t\t\treturn delta\n\t\t\t\t}\n\t\t\t\tif (aRefined.type in this.treeDiffers) {\n\t\t\t\t\tconst delta = this.treeDiffers[aRefined.type](\n\t\t\t\t\t\taRefined.data,\n\t\t\t\t\t\tbRefined.data,\n\t\t\t\t\t\t(x, y) => this.diff(x, y),\n\t\t\t\t\t)\n\t\t\t\t\treturn delta\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst typeA = discoverType(a)\n\t\tconst typeB = discoverType(b)\n\t\tif (typeA === typeB) {\n\t\t\treturn {\n\t\t\t\tsummary: `${typeA} → ${typeB}`,\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tsummary: `Type change: ${typeA} → ${typeB}`,\n\t\t}\n\t}\n}\n\nexport const prettyJson: Differ<\n\t{\n\t\tnumber: (input: unknown) => input is number\n\t\tstring: (input: unknown) => input is string\n\t\tboolean: (input: unknown) => input is boolean\n\t\tnull: (input: unknown) => input is null\n\t},\n\t{\n\t\tobject: (input: unknown) => input is Json.Tree.Object\n\t\tarray: (input: unknown) => input is Json.Tree.Array\n\t}\n> = new Differ(primitiveRefinery, jsonTreeRefinery, {\n\tnumber: diffNumber,\n\tstring: diffString,\n\tboolean: diffBoolean,\n\tnull: () => ({ summary: `No Change` }),\n\tobject: diffObject,\n\tarray: diffArray,\n})\n"],"mappings":"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"}
|