atom.io 0.10.2 → 0.10.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/index.d.mts +53 -8
- package/dist/index.d.ts +53 -8
- package/dist/index.js +56 -32
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +55 -33
- package/dist/index.mjs.map +1 -1
- package/internal/dist/index.js +239 -113
- package/internal/dist/index.js.map +1 -1
- package/internal/dist/index.mjs +239 -113
- package/internal/dist/index.mjs.map +1 -1
- package/internal/src/atom/create-atom.ts +15 -4
- package/internal/src/atom/delete-atom.ts +1 -1
- package/internal/src/caching.ts +4 -4
- package/internal/src/get-state-internal.ts +3 -5
- package/internal/src/mutable/create-mutable-atom.ts +4 -10
- package/internal/src/operation.ts +20 -7
- package/internal/src/selector/create-read-write-selector.ts +12 -2
- package/internal/src/selector/create-readonly-selector.ts +7 -1
- package/internal/src/selector/create-selector.ts +4 -5
- package/internal/src/selector/register-selector.ts +7 -1
- package/internal/src/selector/update-selector-atoms.ts +10 -3
- package/internal/src/set-state/copy-mutable-if-needed.ts +1 -1
- package/internal/src/set-state/copy-mutable-in-transaction.ts +0 -3
- package/internal/src/set-state/emit-update.ts +5 -5
- package/internal/src/set-state/evict-downstream.ts +10 -13
- package/internal/src/set-state/set-atom.ts +1 -1
- package/internal/src/set-state/stow-update.ts +9 -3
- package/internal/src/store/store.ts +8 -19
- package/internal/src/store/withdraw-new-family-member.ts +4 -1
- package/internal/src/store/withdraw.ts +6 -1
- package/internal/src/subscribe/recall-state.ts +4 -1
- package/internal/src/subscribe/subscribe-to-root-atoms.ts +11 -5
- package/internal/src/timeline/add-atom-to-timeline.ts +40 -9
- package/internal/src/timeline/time-travel-internal.ts +26 -8
- package/internal/src/timeline/timeline-internal.ts +8 -2
- package/internal/src/transaction/abort-transaction.ts +7 -2
- package/internal/src/transaction/apply-transaction.ts +21 -7
- package/internal/src/transaction/build-transaction.ts +5 -1
- package/internal/src/transaction/redo-transaction.ts +1 -1
- package/internal/src/transaction/transaction-internal.ts +1 -4
- package/internal/src/transaction/undo-transaction.ts +7 -1
- package/package.json +2 -2
- package/realtime-client/dist/index.js +24 -5
- package/realtime-client/dist/index.js.map +1 -1
- package/realtime-client/dist/index.mjs +24 -5
- package/realtime-client/dist/index.mjs.map +1 -1
- package/realtime-client/src/use-server-action.ts +24 -5
- package/src/logger.ts +82 -14
- package/src/subscribe.ts +22 -7
package/dist/index.d.mts
CHANGED
|
@@ -49,16 +49,61 @@ declare class NotFoundError extends Error {
|
|
|
49
49
|
constructor(token: ReadonlySelectorToken<any> | StateToken<any>, store: Internal.Store);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
declare const LoggerIconDictionary: {
|
|
53
|
+
readonly "\u231B": "Timeline event fully captured";
|
|
54
|
+
readonly "\u23E9": "Timeline redo";
|
|
55
|
+
readonly "\u23EA": "Timeline undo";
|
|
56
|
+
readonly "\u23ED\uFE0F": "Transaction redo";
|
|
57
|
+
readonly "\u23EE\uFE0F": "Transaction undo";
|
|
58
|
+
readonly "\u23F3": "Timeline event partially captured";
|
|
59
|
+
readonly "\u23F9\uFE0F": "Time-travel complete";
|
|
60
|
+
readonly "\uD83D\uDC81": "Notice";
|
|
61
|
+
readonly "\uD83D\uDD04": "Realtime transaction synchronized";
|
|
62
|
+
readonly "\u2705": "Realtime transaction success";
|
|
63
|
+
readonly "\u2728": "Computation complete";
|
|
64
|
+
readonly "\u274C": "Conflict prevents attempted action";
|
|
65
|
+
readonly "\u2B55": "Operation start";
|
|
66
|
+
readonly "\uD83D\uDC1E": "Possible bug in AtomIO";
|
|
67
|
+
readonly "\uD83D\uDC40": "Subscription added";
|
|
68
|
+
readonly "\uD83D\uDC6A": "Family member added";
|
|
69
|
+
readonly "\uD83D\uDCC1": "Stow update";
|
|
70
|
+
readonly "\uD83D\uDCC3": "Copy mutable";
|
|
71
|
+
readonly "\uD83D\uDCD6": "Read state";
|
|
72
|
+
readonly "\uD83D\uDCDD": "Write state";
|
|
73
|
+
readonly "\uD83D\uDCE2": "Notify subscribers";
|
|
74
|
+
readonly "\uD83D\uDD0C": "Register dependency";
|
|
75
|
+
readonly "\uD83D\uDD0D": "Discover root";
|
|
76
|
+
readonly "\uD83D\uDD25": "Delete state";
|
|
77
|
+
readonly "\uD83D\uDD27": "Create mutable atom";
|
|
78
|
+
readonly "\uD83D\uDD28": "Create immutable atom";
|
|
79
|
+
readonly "\uD83D\uDD34": "Operation complete";
|
|
80
|
+
readonly "\uD83D\uDDD1": "Evict cached value";
|
|
81
|
+
readonly "\uD83D\uDCA5": "Caught";
|
|
82
|
+
readonly "\uD83D\uDE48": "Subscription canceled";
|
|
83
|
+
readonly "\uD83D\uDEC4": "Apply transaction";
|
|
84
|
+
readonly "\uD83D\uDEE0\uFE0F": "Install atom into store";
|
|
85
|
+
readonly "\uD83D\uDEEB": "Begin transaction";
|
|
86
|
+
readonly "\uD83D\uDEEC": "Complete transaction";
|
|
87
|
+
readonly "\uD83E\uDDEE": "Computing selector";
|
|
88
|
+
readonly "\uD83E\uDDF9": "Prepare to evict";
|
|
89
|
+
readonly "\uD83E\uDE82": "Abort transaction";
|
|
90
|
+
};
|
|
91
|
+
type LoggerIcon = keyof typeof LoggerIconDictionary;
|
|
92
|
+
declare const LOG_LEVELS: readonly ["info", "warn", "error"];
|
|
93
|
+
type LogLevel = typeof LOG_LEVELS[number];
|
|
94
|
+
type LogFn = (icon: LoggerIcon, tokenType: `atom` | `readonly_selector` | `selector` | `state` | `timeline` | `transaction` | `unknown`, tokenKey: string, message: string, ...rest: any[]) => void;
|
|
95
|
+
type LogFilter = (...params: Parameters<LogFn>) => boolean;
|
|
96
|
+
type Logger = Record<LogLevel, LogFn>;
|
|
97
|
+
declare const simpleLog: (logLevel: keyof Logger) => LogFn;
|
|
98
|
+
declare const simpleLogger: Logger;
|
|
54
99
|
declare class AtomIOLogger implements Logger {
|
|
55
|
-
private readonly logger;
|
|
56
100
|
logLevel: `error` | `info` | `warn` | null;
|
|
57
101
|
private readonly filter?;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
102
|
+
private readonly logger;
|
|
103
|
+
constructor(logLevel: `error` | `info` | `warn` | null, filter?: LogFilter | undefined, logger?: Logger);
|
|
104
|
+
error: LogFn;
|
|
105
|
+
info: LogFn;
|
|
106
|
+
warn: LogFn;
|
|
62
107
|
}
|
|
63
108
|
|
|
64
109
|
type TransactionToken<_> = {
|
|
@@ -193,4 +238,4 @@ type FamilyMetadata = {
|
|
|
193
238
|
subKey: string;
|
|
194
239
|
};
|
|
195
240
|
|
|
196
|
-
export { type AtomEffect, type AtomFamily, type AtomFamilyOptions, AtomIOLogger, type AtomOptions, type AtomToken, type Effectors, type FamilyMetadata, type KeyedStateUpdate, LOG_LEVELS, type Logger, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomOptions, type MutableAtomToken, NotFoundError, type Read, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type SelectorFamily, type SelectorFamilyOptions, type SelectorOptions, type SelectorToken, Silo, type StateToken, type StateUpdate, type TimelineOptions, type TimelineToken, type TimelineUpdate, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateHandler, type Transactors, type UpdateHandler, type Write, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, type ƒn };
|
|
241
|
+
export { type AtomEffect, type AtomFamily, type AtomFamilyOptions, AtomIOLogger, type AtomOptions, type AtomToken, type Effectors, type FamilyMetadata, type KeyedStateUpdate, LOG_LEVELS, type LogFilter, type LogFn, type LogLevel, type Logger, type LoggerIcon, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomOptions, type MutableAtomToken, NotFoundError, type Read, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type SelectorFamily, type SelectorFamilyOptions, type SelectorOptions, type SelectorToken, Silo, type StateToken, type StateUpdate, type TimelineOptions, type TimelineToken, type TimelineUpdate, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateHandler, type Transactors, type UpdateHandler, type Write, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, type ƒn };
|
package/dist/index.d.ts
CHANGED
|
@@ -49,16 +49,61 @@ declare class NotFoundError extends Error {
|
|
|
49
49
|
constructor(token: ReadonlySelectorToken<any> | StateToken<any>, store: Internal.Store);
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
declare const LoggerIconDictionary: {
|
|
53
|
+
readonly "\u231B": "Timeline event fully captured";
|
|
54
|
+
readonly "\u23E9": "Timeline redo";
|
|
55
|
+
readonly "\u23EA": "Timeline undo";
|
|
56
|
+
readonly "\u23ED\uFE0F": "Transaction redo";
|
|
57
|
+
readonly "\u23EE\uFE0F": "Transaction undo";
|
|
58
|
+
readonly "\u23F3": "Timeline event partially captured";
|
|
59
|
+
readonly "\u23F9\uFE0F": "Time-travel complete";
|
|
60
|
+
readonly "\uD83D\uDC81": "Notice";
|
|
61
|
+
readonly "\uD83D\uDD04": "Realtime transaction synchronized";
|
|
62
|
+
readonly "\u2705": "Realtime transaction success";
|
|
63
|
+
readonly "\u2728": "Computation complete";
|
|
64
|
+
readonly "\u274C": "Conflict prevents attempted action";
|
|
65
|
+
readonly "\u2B55": "Operation start";
|
|
66
|
+
readonly "\uD83D\uDC1E": "Possible bug in AtomIO";
|
|
67
|
+
readonly "\uD83D\uDC40": "Subscription added";
|
|
68
|
+
readonly "\uD83D\uDC6A": "Family member added";
|
|
69
|
+
readonly "\uD83D\uDCC1": "Stow update";
|
|
70
|
+
readonly "\uD83D\uDCC3": "Copy mutable";
|
|
71
|
+
readonly "\uD83D\uDCD6": "Read state";
|
|
72
|
+
readonly "\uD83D\uDCDD": "Write state";
|
|
73
|
+
readonly "\uD83D\uDCE2": "Notify subscribers";
|
|
74
|
+
readonly "\uD83D\uDD0C": "Register dependency";
|
|
75
|
+
readonly "\uD83D\uDD0D": "Discover root";
|
|
76
|
+
readonly "\uD83D\uDD25": "Delete state";
|
|
77
|
+
readonly "\uD83D\uDD27": "Create mutable atom";
|
|
78
|
+
readonly "\uD83D\uDD28": "Create immutable atom";
|
|
79
|
+
readonly "\uD83D\uDD34": "Operation complete";
|
|
80
|
+
readonly "\uD83D\uDDD1": "Evict cached value";
|
|
81
|
+
readonly "\uD83D\uDCA5": "Caught";
|
|
82
|
+
readonly "\uD83D\uDE48": "Subscription canceled";
|
|
83
|
+
readonly "\uD83D\uDEC4": "Apply transaction";
|
|
84
|
+
readonly "\uD83D\uDEE0\uFE0F": "Install atom into store";
|
|
85
|
+
readonly "\uD83D\uDEEB": "Begin transaction";
|
|
86
|
+
readonly "\uD83D\uDEEC": "Complete transaction";
|
|
87
|
+
readonly "\uD83E\uDDEE": "Computing selector";
|
|
88
|
+
readonly "\uD83E\uDDF9": "Prepare to evict";
|
|
89
|
+
readonly "\uD83E\uDE82": "Abort transaction";
|
|
90
|
+
};
|
|
91
|
+
type LoggerIcon = keyof typeof LoggerIconDictionary;
|
|
92
|
+
declare const LOG_LEVELS: readonly ["info", "warn", "error"];
|
|
93
|
+
type LogLevel = typeof LOG_LEVELS[number];
|
|
94
|
+
type LogFn = (icon: LoggerIcon, tokenType: `atom` | `readonly_selector` | `selector` | `state` | `timeline` | `transaction` | `unknown`, tokenKey: string, message: string, ...rest: any[]) => void;
|
|
95
|
+
type LogFilter = (...params: Parameters<LogFn>) => boolean;
|
|
96
|
+
type Logger = Record<LogLevel, LogFn>;
|
|
97
|
+
declare const simpleLog: (logLevel: keyof Logger) => LogFn;
|
|
98
|
+
declare const simpleLogger: Logger;
|
|
54
99
|
declare class AtomIOLogger implements Logger {
|
|
55
|
-
private readonly logger;
|
|
56
100
|
logLevel: `error` | `info` | `warn` | null;
|
|
57
101
|
private readonly filter?;
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
102
|
+
private readonly logger;
|
|
103
|
+
constructor(logLevel: `error` | `info` | `warn` | null, filter?: LogFilter | undefined, logger?: Logger);
|
|
104
|
+
error: LogFn;
|
|
105
|
+
info: LogFn;
|
|
106
|
+
warn: LogFn;
|
|
62
107
|
}
|
|
63
108
|
|
|
64
109
|
type TransactionToken<_> = {
|
|
@@ -193,4 +238,4 @@ type FamilyMetadata = {
|
|
|
193
238
|
subKey: string;
|
|
194
239
|
};
|
|
195
240
|
|
|
196
|
-
export { type AtomEffect, type AtomFamily, type AtomFamilyOptions, AtomIOLogger, type AtomOptions, type AtomToken, type Effectors, type FamilyMetadata, type KeyedStateUpdate, LOG_LEVELS, type Logger, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomOptions, type MutableAtomToken, NotFoundError, type Read, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type SelectorFamily, type SelectorFamilyOptions, type SelectorOptions, type SelectorToken, Silo, type StateToken, type StateUpdate, type TimelineOptions, type TimelineToken, type TimelineUpdate, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateHandler, type Transactors, type UpdateHandler, type Write, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, type ƒn };
|
|
241
|
+
export { type AtomEffect, type AtomFamily, type AtomFamilyOptions, AtomIOLogger, type AtomOptions, type AtomToken, type Effectors, type FamilyMetadata, type KeyedStateUpdate, LOG_LEVELS, type LogFilter, type LogFn, type LogLevel, type Logger, type LoggerIcon, type MutableAtomFamily, type MutableAtomFamilyOptions, type MutableAtomOptions, type MutableAtomToken, NotFoundError, type Read, type ReadonlySelectorFamily, type ReadonlySelectorFamilyOptions, type ReadonlySelectorOptions, type ReadonlySelectorToken, type ReadonlyTransactors, type SelectorFamily, type SelectorFamilyOptions, type SelectorOptions, type SelectorToken, Silo, type StateToken, type StateUpdate, type TimelineOptions, type TimelineToken, type TimelineUpdate, type TransactionIO, type TransactionOptions, type TransactionToken, type TransactionUpdate, type TransactionUpdateHandler, type Transactors, type UpdateHandler, type Write, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo, type ƒn };
|
package/dist/index.js
CHANGED
|
@@ -66,34 +66,41 @@ var NotFoundError = class extends Error {
|
|
|
66
66
|
};
|
|
67
67
|
|
|
68
68
|
// src/logger.ts
|
|
69
|
-
var LOG_LEVELS = [
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
var LOG_LEVELS = [`info`, `warn`, `error`];
|
|
70
|
+
var simpleLog = (logLevel) => (icon, tokenType, tokenKey, message, ...rest) => {
|
|
71
|
+
console[logLevel](
|
|
72
|
+
`${icon} ${tokenType} "${tokenKey}" ${message}`,
|
|
73
|
+
...rest.map((arg) => JSON.stringify(arg))
|
|
74
|
+
);
|
|
75
|
+
};
|
|
76
|
+
var simpleLogger = {
|
|
77
|
+
error: simpleLog(`error`),
|
|
78
|
+
info: simpleLog(`info`),
|
|
79
|
+
warn: simpleLog(`warn`)
|
|
80
|
+
};
|
|
74
81
|
var AtomIOLogger = class {
|
|
75
|
-
constructor(
|
|
76
|
-
this.logger = logger;
|
|
82
|
+
constructor(logLevel, filter, logger = simpleLogger) {
|
|
77
83
|
this.logLevel = logLevel;
|
|
78
84
|
this.filter = filter;
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
85
|
+
this.logger = logger;
|
|
86
|
+
this.error = (...args) => {
|
|
87
|
+
var _a, _b;
|
|
88
|
+
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== null) {
|
|
89
|
+
this.logger.error(...args);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
this.info = (...args) => {
|
|
93
|
+
var _a, _b;
|
|
94
|
+
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel === `info`) {
|
|
95
|
+
this.logger.info(...args);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
this.warn = (...args) => {
|
|
99
|
+
var _a, _b;
|
|
100
|
+
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== `error` && this.logLevel !== null) {
|
|
101
|
+
this.logger.warn(...args);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
97
104
|
}
|
|
98
105
|
};
|
|
99
106
|
function selector(options) {
|
|
@@ -137,16 +144,22 @@ function subscribe(token, handleUpdate, key = Math.random().toString(36).slice(2
|
|
|
137
144
|
);
|
|
138
145
|
}
|
|
139
146
|
const unsubFunction = state.subject.subscribe(key, handleUpdate);
|
|
140
|
-
store.logger.info(`\u{1F440} Adding subscription "${key}"
|
|
147
|
+
store.logger.info(`\u{1F440}`, state.type, state.key, `Adding subscription "${key}"`);
|
|
141
148
|
const dependencyUnsubFunctions = state.type !== `atom` ? Internal.subscribeToRootAtoms(state, store) : null;
|
|
142
149
|
const unsubscribe = dependencyUnsubFunctions === null ? () => {
|
|
143
150
|
store.logger.info(
|
|
144
|
-
`\u{1F648}
|
|
151
|
+
`\u{1F648}`,
|
|
152
|
+
state.type,
|
|
153
|
+
state.key,
|
|
154
|
+
`Removing subscription "${key}"`
|
|
145
155
|
);
|
|
146
156
|
unsubFunction();
|
|
147
157
|
} : () => {
|
|
148
158
|
store.logger.info(
|
|
149
|
-
`\u{1F648}
|
|
159
|
+
`\u{1F648}`,
|
|
160
|
+
state.type,
|
|
161
|
+
state.key,
|
|
162
|
+
`Removing subscription "${key}"`
|
|
150
163
|
);
|
|
151
164
|
unsubFunction();
|
|
152
165
|
for (const unsubFromDependency of dependencyUnsubFunctions) {
|
|
@@ -163,12 +176,18 @@ var subscribeToTransaction = (token, handleUpdate, key = Math.random().toString(
|
|
|
163
176
|
);
|
|
164
177
|
}
|
|
165
178
|
store.logger.info(
|
|
166
|
-
`\u{1F440}
|
|
179
|
+
`\u{1F440}`,
|
|
180
|
+
`transaction`,
|
|
181
|
+
token.key,
|
|
182
|
+
`Adding subscription "${key}"`
|
|
167
183
|
);
|
|
168
184
|
const unsubscribe = tx.subject.subscribe(key, handleUpdate);
|
|
169
185
|
return () => {
|
|
170
186
|
store.logger.info(
|
|
171
|
-
`\u{1F648}
|
|
187
|
+
`\u{1F648}`,
|
|
188
|
+
`transaction`,
|
|
189
|
+
token.key,
|
|
190
|
+
`Removing subscription "${key}"`
|
|
172
191
|
);
|
|
173
192
|
unsubscribe();
|
|
174
193
|
};
|
|
@@ -180,11 +199,14 @@ var subscribeToTimeline = (token, handleUpdate, key = Math.random().toString(36)
|
|
|
180
199
|
`Cannot subscribe to timeline "${token.key}": timeline not found in store "${store.config.name}".`
|
|
181
200
|
);
|
|
182
201
|
}
|
|
183
|
-
store.logger.info(`\u{1F440}
|
|
202
|
+
store.logger.info(`\u{1F440}`, `timeline`, token.key, `Adding subscription "${key}"`);
|
|
184
203
|
const unsubscribe = tl.subject.subscribe(key, handleUpdate);
|
|
185
204
|
return () => {
|
|
186
205
|
store.logger.info(
|
|
187
|
-
`\u{1F648}
|
|
206
|
+
`\u{1F648}`,
|
|
207
|
+
`timeline`,
|
|
208
|
+
token.key,
|
|
209
|
+
`Removing subscription "${key}" from timeline`
|
|
188
210
|
);
|
|
189
211
|
unsubscribe();
|
|
190
212
|
};
|
|
@@ -227,6 +249,8 @@ exports.runTransaction = runTransaction;
|
|
|
227
249
|
exports.selector = selector;
|
|
228
250
|
exports.selectorFamily = selectorFamily;
|
|
229
251
|
exports.setState = setState;
|
|
252
|
+
exports.simpleLog = simpleLog;
|
|
253
|
+
exports.simpleLogger = simpleLogger;
|
|
230
254
|
exports.subscribe = subscribe;
|
|
231
255
|
exports.subscribeToTimeline = subscribeToTimeline;
|
|
232
256
|
exports.subscribeToTransaction = subscribeToTransaction;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/atom.ts","../src/get-set.ts","../src/logger.ts","../src/selector.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["createAtom","createAtomFamily","createMutableAtom","createMutableAtomFamily","createSelector","createSelectorFamily","IMPLICIT","withdraw","redo__INTERNAL","timeline__INTERNAL","undo__INTERNAL","transaction__INTERNAL"],"mappings":"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","sourcesContent":["import type { Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tdeleteAtom,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } from \".\"\n\nexport { deleteAtom }\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => void\n\nexport type AtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<AtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: AtomOptions<T>): AtomToken<T>\nexport function atom<T>(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options)\n\t}\n\treturn createAtom<T>(options)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<T>>\n}\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends Json.Serializable,\n> = \n\t& JsonInterface<Core, SerializableCore>\n\t& ((key: Key) => MutableAtomToken<Core, SerializableCore>) \n\t& {\n\t\t\tkey: `${string}::mutable`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t}\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options)\n\t}\n\treturn createAtomFamily<T, K>(options)\n}\n","import * as Internal from \"atom.io/internal\"\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport const getState = <T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T => {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new NotFoundError(token, store)\n\t}\n\treturn Internal.getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void => {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new NotFoundError(token, store)\n\t}\n\tInternal.setState__INTERNAL(state, value, store)\n\tInternal.closeOperation(store)\n}\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nexport class NotFoundError extends Error {\n\tpublic constructor(\n\t\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n\t\tstore: Internal.Store,\n\t) {\n\t\tsuper(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n}\n","export type Logger = Pick<Console, `error` | `info` | `warn`>\n\nexport const LOG_LEVELS: ReadonlyArray<keyof Logger> = [\n\t`info`,\n\t`warn`,\n\t`error`,\n] as const\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tprivate readonly logger: Logger,\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: (message: string) => boolean,\n\t) {}\n\n\tpublic error(...args: any[]): void {\n\t\tif ((this.filter?.(args[0]) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info(...args: any[]): void {\n\t\tif ((this.filter?.(args[0]) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn(...args: any[]): void {\n\t\tif (\n\t\t\t(this.filter?.(args[0]) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Subject } from \"atom.io/internal\"\nimport { createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options)\n}\n\nexport type SelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\ttransaction__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tthis.store = s\n\t\tthis.atom = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtom(options, s)\n\t\t\t}\n\t\t\treturn createAtom(options, undefined, s)\n\t\t}\n\t\tthis.atomFamily = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtomFamily(options, s) as any\n\t\t\t}\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => transaction__INTERNAL(options, s)\n\t\tthis.timeline = (options) => timeline__INTERNAL(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => undo__INTERNAL(token, s)\n\t\tthis.redo = (token) => redo__INTERNAL(token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadonlySelectorToken,\n\tStateToken,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore: Store = IMPLICIT.STORE,\n): () => void {\n\tconst state = withdraw<T>(token, store)\n\tif (state === undefined) {\n\t\tthrow new Error(\n\t\t\t`State \"${token.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t)\n\t}\n\tconst unsubFunction = state.subject.subscribe(key, handleUpdate)\n\tstore.logger.info(`👀 Adding subscription \"${key}\" to \"${state.key}\"`)\n\tconst dependencyUnsubFunctions =\n\t\tstate.type !== `atom` ? subscribeToRootAtoms(state, store) : null\n\n\tconst unsubscribe =\n\t\tdependencyUnsubFunctions === null\n\t\t\t? () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈 Removing subscription \"${key}\" from \"${state.key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈 Removing subscription\t${key} from \"${state.key}\" and its dependencies`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t\t\tfor (const unsubFromDependency of dependencyUnsubFunctions) {\n\t\t\t\t\t\tunsubFromDependency()\n\t\t\t\t\t}\n\t\t\t }\n\n\treturn unsubscribe\n}\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(\n\t\t`👀 Adding subscription \"${key}\" to transaction \"${token.key}\"`,\n\t)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈 Removing subscription \"${key}\" from transaction \"${token.key}\"`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to timeline \"${token.key}\": timeline not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(`👀 Adding subscription \"${key}\" to timeline \"${token.key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈 Removing subscription \"${key}\" from timeline \"${token.key}\"`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineToken = {\n\tkey: string\n\ttype: `timeline`\n}\n\nexport type TimelineOptions = {\n\tkey: string\n\tatoms: (AtomFamily<any, any> | AtomToken<any>)[]\n\tshouldCapture?: (update: TimelineUpdate, timeline: Timeline) => boolean\n}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn timeline__INTERNAL(options)\n}\n\nexport const redo = (token: TimelineToken): void => {\n\tredo__INTERNAL(token, IMPLICIT.STORE)\n}\n\nexport const undo = (token: TimelineToken): void => {\n\tundo__INTERNAL(token, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, transaction__INTERNAL, withdraw } from \"atom.io/internal\"\n\nimport type { KeyedStateUpdate, ReadonlySelectorToken, StateToken, ƒn } from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tatomUpdates: KeyedStateUpdate<unknown>[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = {\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Write<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn transaction__INTERNAL(options)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(token: TransactionToken<ƒ>, store: Store = IMPLICIT.STORE) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(...parameters)\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot run transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/atom.ts","../src/get-set.ts","../src/logger.ts","../src/selector.ts","../src/silo.ts","../src/subscribe.ts","../src/timeline.ts","../src/transaction.ts"],"names":["createAtom","createAtomFamily","createMutableAtom","createMutableAtomFamily","createSelector","createSelectorFamily","IMPLICIT","withdraw","redo__INTERNAL","timeline__INTERNAL","undo__INTERNAL","transaction__INTERNAL"],"mappings":"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","sourcesContent":["import type { Subject, Transceiver } from \"atom.io/internal\"\nimport {\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tdeleteAtom,\n} from \"atom.io/internal\"\nimport type { Json, JsonInterface } from \"atom.io/json\"\n\nimport type { AtomToken, MutableAtomToken } from \".\"\n\nexport { deleteAtom }\n\nexport type Effectors<T> = {\n\tsetSelf: <V extends T>(next: V | ((oldValue: T) => V)) => void\n\tonSet: (callback: (options: { newValue: T; oldValue: T }) => void) => void\n}\n\nexport type AtomEffect<T> = (tools: Effectors<T>) => void\n\nexport type AtomOptions<T> = {\n\tkey: string\n\tdefault: T | (() => T)\n\teffects?: AtomEffect<T>[]\n}\n// biome-ignore format: complex intersection\nexport type MutableAtomOptions<T extends Transceiver<any>, J extends Json.Serializable> = \n\t& JsonInterface<T, J>\n\t& Omit<AtomOptions<T>, `default`> \n\t& { \n\t\t\tdefault: ()\t=> T\n\t\t\tmutable: true\n\t\t}\n\nexport function atom<T extends Transceiver<any>, J extends Json.Serializable>(\n\toptions: MutableAtomOptions<T, J>,\n): MutableAtomToken<T, J>\nexport function atom<T>(options: AtomOptions<T>): AtomToken<T>\nexport function atom<T>(\n\toptions: AtomOptions<any> | MutableAtomOptions<any, any>,\n): AtomToken<any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtom(options)\n\t}\n\treturn createAtom<T>(options)\n}\n\nexport type AtomFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tdefault: T | ((key: K) => T)\n\teffects?: (key: K) => AtomEffect<T>[]\n}\n\nexport type AtomFamily<T, K extends Json.Serializable = Json.Serializable> = ((\n\tkey: K,\n) => AtomToken<T>) & {\n\tkey: string\n\ttype: `atom_family`\n\tsubject: Subject<AtomToken<T>>\n}\n// biome-ignore format: intersection\nexport type MutableAtomFamilyOptions<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n> = \n\t& AtomFamilyOptions<T, K>\n\t& JsonInterface<T, J>\n\t& { mutable: true }\n\n// biome-ignore format: intersection\nexport type MutableAtomFamily<\n\tCore extends Transceiver<any>,\n\tSerializableCore extends Json.Serializable,\n\tKey extends Json.Serializable,\n> = \n\t& JsonInterface<Core, SerializableCore>\n\t& ((key: Key) => MutableAtomToken<Core, SerializableCore>) \n\t& {\n\t\t\tkey: `${string}::mutable`\n\t\t\ttype: `atom_family`\n\t\t\tsubject: Subject<MutableAtomToken<Core, SerializableCore>>\n\t\t}\n\nexport function atomFamily<\n\tT extends Transceiver<any>,\n\tJ extends Json.Serializable,\n\tK extends Json.Serializable,\n>(options: MutableAtomFamilyOptions<T, J, K>): MutableAtomFamily<T, J, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K>,\n): AtomFamily<T, K>\nexport function atomFamily<T, K extends Json.Serializable>(\n\toptions: AtomFamilyOptions<T, K> | MutableAtomFamilyOptions<any, any, any>,\n): AtomFamily<T, K> | MutableAtomFamily<any, any, any> {\n\tif (`mutable` in options) {\n\t\treturn createMutableAtomFamily(options)\n\t}\n\treturn createAtomFamily<T, K>(options)\n}\n","import * as Internal from \"atom.io/internal\"\nimport type { ReadonlySelectorToken, StateToken } from \".\"\n\nexport const getState = <T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): T => {\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new NotFoundError(token, store)\n\t}\n\treturn Internal.getState__INTERNAL(state, store)\n}\n\nexport const setState = <T, New extends T>(\n\ttoken: StateToken<T>,\n\tvalue: New | ((oldValue: T) => New),\n\tstore: Internal.Store = Internal.IMPLICIT.STORE,\n): void => {\n\tconst rejection = Internal.openOperation(token, store)\n\tif (rejection) {\n\t\treturn\n\t}\n\tconst state =\n\t\tInternal.withdraw(token, store) ??\n\t\tInternal.withdrawNewFamilyMember(token, store)\n\tif (state === undefined) {\n\t\tthrow new NotFoundError(token, store)\n\t}\n\tInternal.setState__INTERNAL(state, value, store)\n\tInternal.closeOperation(store)\n}\n\nconst capitalize = (str: string) => str[0].toUpperCase() + str.slice(1)\nexport class NotFoundError extends Error {\n\tpublic constructor(\n\t\ttoken: ReadonlySelectorToken<any> | StateToken<any>,\n\t\tstore: Internal.Store,\n\t) {\n\t\tsuper(\n\t\t\t`${capitalize(token.type)} \"${token.key}\" not found in store \"${\n\t\t\t\tstore.config.name\n\t\t\t}\".`,\n\t\t)\n\t}\n}\n","const LoggerIconDictionary = {\n\t\"⌛\": `Timeline event fully captured`,\n\t\"⏩\": `Timeline redo`,\n\t\"⏪\": `Timeline undo`,\n\t\"⏭️\": `Transaction redo`,\n\t\"⏮️\": `Transaction undo`,\n\t\"⏳\": `Timeline event partially captured`,\n\t\"⏹️\": `Time-travel complete`,\n\t\"💁\": `Notice`,\n\t\"🔄\": `Realtime transaction synchronized`,\n\t\"✅\": `Realtime transaction success`,\n\t\"✨\": `Computation complete`,\n\t\"❌\": `Conflict prevents attempted action`,\n\t\"⭕\": `Operation start`,\n\t\"🐞\": `Possible bug in AtomIO`,\n\t\"👀\": `Subscription added`,\n\t\"👪\": `Family member added`,\n\t\"📁\": `Stow update`,\n\t\"📃\": `Copy mutable`,\n\t\"📖\": `Read state`,\n\t\"📝\": `Write state`,\n\t\"📢\": `Notify subscribers`,\n\t\"🔌\": `Register dependency`,\n\t\"🔍\": `Discover root`,\n\t\"🔥\": `Delete state`,\n\t\"🔧\": `Create mutable atom`,\n\t\"🔨\": `Create immutable atom`,\n\t\"🔴\": `Operation complete`,\n\t\"🗑\": `Evict cached value`,\n\t\"💥\": `Caught`,\n\t\"🙈\": `Subscription canceled`,\n\t\"🛄\": `Apply transaction`,\n\t\"🛠️\": `Install atom into store`,\n\t\"🛫\": `Begin transaction`,\n\t\"🛬\": `Complete transaction`,\n\t\"🧮\": `Computing selector`,\n\t\"🧹\": `Prepare to evict`,\n\t\"🪂\": `Abort transaction`,\n} as const\nexport type LoggerIcon = keyof typeof LoggerIconDictionary\n\nexport const LOG_LEVELS = [`info`, `warn`, `error`] as const\nexport type LogLevel = typeof LOG_LEVELS[number]\n\nexport type LogFn = (\n\ticon: LoggerIcon,\n\ttokenType:\n\t\t| `atom`\n\t\t| `readonly_selector`\n\t\t| `selector`\n\t\t| `state`\n\t\t| `timeline`\n\t\t| `transaction`\n\t\t| `unknown`,\n\ttokenKey: string,\n\tmessage: string,\n\t...rest: any[]\n) => void\nexport type LogFilter = (...params: Parameters<LogFn>) => boolean\n\nexport type Logger = Record<LogLevel, LogFn>\n\nexport const simpleLog =\n\t(logLevel: keyof Logger): LogFn =>\n\t(icon, tokenType, tokenKey, message, ...rest) => {\n\t\tconsole[logLevel](\n\t\t\t`${icon} ${tokenType} \"${tokenKey}\" ${message}`,\n\t\t\t...rest.map((arg) => JSON.stringify(arg)),\n\t\t)\n\t}\nexport const simpleLogger: Logger = {\n\terror: simpleLog(`error`),\n\tinfo: simpleLog(`info`),\n\twarn: simpleLog(`warn`),\n}\n\nexport class AtomIOLogger implements Logger {\n\tpublic constructor(\n\t\tpublic logLevel: `error` | `info` | `warn` | null,\n\t\tprivate readonly filter?: LogFilter,\n\t\tprivate readonly logger: Logger = simpleLogger,\n\t) {}\n\n\tpublic error: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel !== null) {\n\t\t\tthis.logger.error(...args)\n\t\t}\n\t}\n\tpublic info: LogFn = (...args) => {\n\t\tif ((this.filter?.(...args) ?? true) && this.logLevel === `info`) {\n\t\t\tthis.logger.info(...args)\n\t\t}\n\t}\n\tpublic warn: LogFn = (...args) => {\n\t\tif (\n\t\t\t(this.filter?.(...args) ?? true) &&\n\t\t\tthis.logLevel !== `error` &&\n\t\t\tthis.logLevel !== null\n\t\t) {\n\t\t\tthis.logger.warn(...args)\n\t\t}\n\t}\n}\n","import type { Subject } from \"atom.io/internal\"\nimport { createSelector, createSelectorFamily } from \"atom.io/internal\"\nimport type { Json } from \"atom.io/json\"\n\nimport type { ReadonlySelectorToken, SelectorToken } from \".\"\nimport type { Read, Write } from \"./transaction\"\n\nexport type SelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n\tset: Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorOptions<T> = {\n\tkey: string\n\tget: Read<() => T>\n}\n\nexport function selector<T>(options: SelectorOptions<T>): SelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T>,\n): ReadonlySelectorToken<T>\nexport function selector<T>(\n\toptions: ReadonlySelectorOptions<T> | SelectorOptions<T>,\n): ReadonlySelectorToken<T> | SelectorToken<T> {\n\treturn createSelector(options)\n}\n\nexport type SelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n\tset: (key: K) => Write<(newValue: T) => void>\n}\nexport type ReadonlySelectorFamilyOptions<T, K extends Json.Serializable> = {\n\tkey: string\n\tget: (key: K) => Read<() => T>\n}\n\nexport type SelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => SelectorToken<T>) & {\n\tkey: string\n\ttype: `selector_family`\n\tsubject: Subject<SelectorToken<T>>\n}\n\nexport type ReadonlySelectorFamily<\n\tT,\n\tK extends Json.Serializable = Json.Serializable,\n> = ((key: K) => ReadonlySelectorToken<T>) & {\n\tkey: string\n\ttype: `readonly_selector_family`\n\tsubject: Subject<ReadonlySelectorToken<T>>\n}\n\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: SelectorFamilyOptions<T, K>,\n): SelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K>\nexport function selectorFamily<T, K extends Json.Serializable>(\n\toptions: ReadonlySelectorFamilyOptions<T, K> | SelectorFamilyOptions<T, K>,\n): ReadonlySelectorFamily<T, K> | SelectorFamily<T, K> {\n\treturn createSelectorFamily(options)\n}\n","import {\n\tStore,\n\tcreateAtom,\n\tcreateAtomFamily,\n\tcreateMutableAtom,\n\tcreateMutableAtomFamily,\n\tcreateSelector,\n\tcreateSelectorFamily,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\ttransaction__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { redo, timeline, undo } from \".\"\nimport { getState, setState, subscribe } from \".\"\nimport type { atom, atomFamily } from \"./atom\"\nimport type { selector, selectorFamily } from \"./selector\"\nimport type { transaction } from \"./transaction\"\n\nexport class Silo {\n\tpublic store: Store\n\tpublic atom: typeof atom\n\tpublic atomFamily: typeof atomFamily\n\tpublic selector: typeof selector\n\tpublic selectorFamily: typeof selectorFamily\n\tpublic transaction: typeof transaction\n\tpublic timeline: typeof timeline\n\tpublic getState: typeof getState\n\tpublic setState: typeof setState\n\tpublic subscribe: typeof subscribe\n\tpublic undo: typeof undo\n\tpublic redo: typeof redo\n\tpublic constructor(name: string, fromStore: Store | null = null) {\n\t\tconst s = new Store(name, fromStore)\n\t\tthis.store = s\n\t\tthis.atom = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtom(options, s)\n\t\t\t}\n\t\t\treturn createAtom(options, undefined, s)\n\t\t}\n\t\tthis.atomFamily = (options) => {\n\t\t\tif (`mutable` in options) {\n\t\t\t\treturn createMutableAtomFamily(options, s) as any\n\t\t\t}\n\t\t\treturn createAtomFamily(options, s)\n\t\t}\n\t\tthis.selector = (options) => createSelector(options, undefined, s) as any\n\t\tthis.selectorFamily = (options) => createSelectorFamily(options, s) as any\n\t\tthis.transaction = (options) => transaction__INTERNAL(options, s)\n\t\tthis.timeline = (options) => timeline__INTERNAL(options, s)\n\t\tthis.getState = (token) => getState(token, s)\n\t\tthis.setState = (token, newValue) => setState(token, newValue, s)\n\t\tthis.subscribe = (token, handler, key) => subscribe(token, handler, key, s)\n\t\tthis.undo = (token) => undo__INTERNAL(token, s)\n\t\tthis.redo = (token) => redo__INTERNAL(token, s)\n\t}\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, subscribeToRootAtoms, withdraw } from \"atom.io/internal\"\n\nimport type {\n\tFamilyMetadata,\n\tReadonlySelectorToken,\n\tStateToken,\n\tTimelineToken,\n\tTimelineUpdate,\n\tTransactionToken,\n\tTransactionUpdate,\n\tƒn,\n} from \".\"\n\nexport type StateUpdate<T> = { newValue: T; oldValue: T }\nexport type KeyedStateUpdate<T> = StateUpdate<T> & {\n\tkey: string\n\tfamily?: FamilyMetadata\n}\nexport type UpdateHandler<T> = (update: StateUpdate<T>) => void\n\nexport function subscribe<T>(\n\ttoken: ReadonlySelectorToken<T> | StateToken<T>,\n\thandleUpdate: UpdateHandler<T>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore: Store = IMPLICIT.STORE,\n): () => void {\n\tconst state = withdraw<T>(token, store)\n\tif (state === undefined) {\n\t\tthrow new Error(\n\t\t\t`State \"${token.key}\" not found in this store. Did you forget to initialize with the \"atom\" or \"selector\" function?`,\n\t\t)\n\t}\n\tconst unsubFunction = state.subject.subscribe(key, handleUpdate)\n\tstore.logger.info(`👀`, state.type, state.key, `Adding subscription \"${key}\"`)\n\tconst dependencyUnsubFunctions =\n\t\tstate.type !== `atom` ? subscribeToRootAtoms(state, store) : null\n\n\tconst unsubscribe =\n\t\tdependencyUnsubFunctions === null\n\t\t\t? () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈`,\n\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t`Removing subscription \"${key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t }\n\t\t\t: () => {\n\t\t\t\t\tstore.logger.info(\n\t\t\t\t\t\t`🙈`,\n\t\t\t\t\t\tstate.type,\n\t\t\t\t\t\tstate.key,\n\t\t\t\t\t\t`Removing subscription \"${key}\"`,\n\t\t\t\t\t)\n\t\t\t\t\tunsubFunction()\n\t\t\t\t\tfor (const unsubFromDependency of dependencyUnsubFunctions) {\n\t\t\t\t\t\tunsubFromDependency()\n\t\t\t\t\t}\n\t\t\t }\n\n\treturn unsubscribe\n}\n\nexport type TransactionUpdateHandler<ƒ extends ƒn> = (\n\tdata: TransactionUpdate<ƒ>,\n) => void\n\nexport const subscribeToTransaction = <ƒ extends ƒn>(\n\ttoken: TransactionToken<ƒ>,\n\thandleUpdate: TransactionUpdateHandler<ƒ>,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tx = withdraw(token, store)\n\tif (tx === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(\n\t\t`👀`,\n\t\t`transaction`,\n\t\ttoken.key,\n\t\t`Adding subscription \"${key}\"`,\n\t)\n\tconst unsubscribe = tx.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈`,\n\t\t\t`transaction`,\n\t\t\ttoken.key,\n\t\t\t`Removing subscription \"${key}\"`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n\nexport const subscribeToTimeline = (\n\ttoken: TimelineToken,\n\thandleUpdate: (update: TimelineUpdate | `redo` | `undo`) => void,\n\tkey: string = Math.random().toString(36).slice(2),\n\tstore = IMPLICIT.STORE,\n): (() => void) => {\n\tconst tl = withdraw(token, store)\n\tif (tl === undefined) {\n\t\tthrow new Error(\n\t\t\t`Cannot subscribe to timeline \"${token.key}\": timeline not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n\tstore.logger.info(`👀`, `timeline`, token.key, `Adding subscription \"${key}\"`)\n\tconst unsubscribe = tl.subject.subscribe(key, handleUpdate)\n\treturn () => {\n\t\tstore.logger.info(\n\t\t\t`🙈`,\n\t\t\t`timeline`,\n\t\t\ttoken.key,\n\t\t\t`Removing subscription \"${key}\" from timeline`,\n\t\t)\n\t\tunsubscribe()\n\t}\n}\n","import type {\n\tTimeline,\n\tTimelineAtomUpdate,\n\tTimelineSelectorUpdate,\n\tTimelineTransactionUpdate,\n} from \"atom.io/internal\"\nimport {\n\tIMPLICIT,\n\tredo__INTERNAL,\n\ttimeline__INTERNAL,\n\tundo__INTERNAL,\n} from \"atom.io/internal\"\n\nimport type { AtomFamily, AtomToken } from \".\"\n\nexport type TimelineToken = {\n\tkey: string\n\ttype: `timeline`\n}\n\nexport type TimelineOptions = {\n\tkey: string\n\tatoms: (AtomFamily<any, any> | AtomToken<any>)[]\n\tshouldCapture?: (update: TimelineUpdate, timeline: Timeline) => boolean\n}\n\nexport type TimelineUpdate =\n\t| TimelineAtomUpdate\n\t| TimelineSelectorUpdate\n\t| TimelineTransactionUpdate\n\nexport const timeline = (options: TimelineOptions): TimelineToken => {\n\treturn timeline__INTERNAL(options)\n}\n\nexport const redo = (token: TimelineToken): void => {\n\tredo__INTERNAL(token, IMPLICIT.STORE)\n}\n\nexport const undo = (token: TimelineToken): void => {\n\tundo__INTERNAL(token, IMPLICIT.STORE)\n}\n","import type { Store } from \"atom.io/internal\"\nimport { IMPLICIT, transaction__INTERNAL, withdraw } from \"atom.io/internal\"\n\nimport type { KeyedStateUpdate, ReadonlySelectorToken, StateToken, ƒn } from \".\"\n\nexport type TransactionToken<_> = {\n\tkey: string\n\ttype: `transaction`\n\t__brand?: _\n}\n\nexport type TransactionUpdate<ƒ extends ƒn> = {\n\tkey: string\n\tatomUpdates: KeyedStateUpdate<unknown>[]\n\tparams: Parameters<ƒ>\n\toutput: ReturnType<ƒ>\n}\n\nexport type Transactors = {\n\tget: <S>(state: ReadonlySelectorToken<S> | StateToken<S>) => S\n\tset: <S>(state: StateToken<S>, newValue: S | ((oldValue: S) => S)) => void\n}\nexport type ReadonlyTransactors = Pick<Transactors, `get`>\n\nexport type Read<ƒ extends ƒn> = (\n\ttransactors: ReadonlyTransactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type Write<ƒ extends ƒn> = (\n\ttransactors: Transactors,\n\t...parameters: Parameters<ƒ>\n) => ReturnType<ƒ>\n\nexport type TransactionOptions<ƒ extends ƒn> = {\n\tkey: string\n\tdo: Write<ƒ>\n}\n\nexport type TransactionIO<Token extends TransactionToken<any>> =\n\tToken extends TransactionToken<infer ƒ> ? ƒ : never\n\nexport function transaction<ƒ extends ƒn>(\n\toptions: TransactionOptions<ƒ>,\n): TransactionToken<ƒ> {\n\treturn transaction__INTERNAL(options)\n}\n\nexport const runTransaction =\n\t<ƒ extends ƒn>(token: TransactionToken<ƒ>, store: Store = IMPLICIT.STORE) =>\n\t(...parameters: Parameters<ƒ>): ReturnType<ƒ> => {\n\t\tconst tx = withdraw(token, store)\n\t\tif (tx) {\n\t\t\treturn tx.run(...parameters)\n\t\t}\n\t\tthrow new Error(\n\t\t\t`Cannot run transaction \"${token.key}\": transaction not found in store \"${store.config.name}\".`,\n\t\t)\n\t}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -46,34 +46,41 @@ var NotFoundError = class extends Error {
|
|
|
46
46
|
};
|
|
47
47
|
|
|
48
48
|
// src/logger.ts
|
|
49
|
-
var LOG_LEVELS = [
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
var LOG_LEVELS = [`info`, `warn`, `error`];
|
|
50
|
+
var simpleLog = (logLevel) => (icon, tokenType, tokenKey, message, ...rest) => {
|
|
51
|
+
console[logLevel](
|
|
52
|
+
`${icon} ${tokenType} "${tokenKey}" ${message}`,
|
|
53
|
+
...rest.map((arg) => JSON.stringify(arg))
|
|
54
|
+
);
|
|
55
|
+
};
|
|
56
|
+
var simpleLogger = {
|
|
57
|
+
error: simpleLog(`error`),
|
|
58
|
+
info: simpleLog(`info`),
|
|
59
|
+
warn: simpleLog(`warn`)
|
|
60
|
+
};
|
|
54
61
|
var AtomIOLogger = class {
|
|
55
|
-
constructor(
|
|
56
|
-
this.logger = logger;
|
|
62
|
+
constructor(logLevel, filter, logger = simpleLogger) {
|
|
57
63
|
this.logLevel = logLevel;
|
|
58
64
|
this.filter = filter;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
65
|
+
this.logger = logger;
|
|
66
|
+
this.error = (...args) => {
|
|
67
|
+
var _a, _b;
|
|
68
|
+
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== null) {
|
|
69
|
+
this.logger.error(...args);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
this.info = (...args) => {
|
|
73
|
+
var _a, _b;
|
|
74
|
+
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel === `info`) {
|
|
75
|
+
this.logger.info(...args);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
this.warn = (...args) => {
|
|
79
|
+
var _a, _b;
|
|
80
|
+
if (((_b = (_a = this.filter) == null ? void 0 : _a.call(this, ...args)) != null ? _b : true) && this.logLevel !== `error` && this.logLevel !== null) {
|
|
81
|
+
this.logger.warn(...args);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
77
84
|
}
|
|
78
85
|
};
|
|
79
86
|
function selector(options) {
|
|
@@ -117,16 +124,22 @@ function subscribe(token, handleUpdate, key = Math.random().toString(36).slice(2
|
|
|
117
124
|
);
|
|
118
125
|
}
|
|
119
126
|
const unsubFunction = state.subject.subscribe(key, handleUpdate);
|
|
120
|
-
store.logger.info(`\u{1F440} Adding subscription "${key}"
|
|
127
|
+
store.logger.info(`\u{1F440}`, state.type, state.key, `Adding subscription "${key}"`);
|
|
121
128
|
const dependencyUnsubFunctions = state.type !== `atom` ? subscribeToRootAtoms(state, store) : null;
|
|
122
129
|
const unsubscribe = dependencyUnsubFunctions === null ? () => {
|
|
123
130
|
store.logger.info(
|
|
124
|
-
`\u{1F648}
|
|
131
|
+
`\u{1F648}`,
|
|
132
|
+
state.type,
|
|
133
|
+
state.key,
|
|
134
|
+
`Removing subscription "${key}"`
|
|
125
135
|
);
|
|
126
136
|
unsubFunction();
|
|
127
137
|
} : () => {
|
|
128
138
|
store.logger.info(
|
|
129
|
-
`\u{1F648}
|
|
139
|
+
`\u{1F648}`,
|
|
140
|
+
state.type,
|
|
141
|
+
state.key,
|
|
142
|
+
`Removing subscription "${key}"`
|
|
130
143
|
);
|
|
131
144
|
unsubFunction();
|
|
132
145
|
for (const unsubFromDependency of dependencyUnsubFunctions) {
|
|
@@ -143,12 +156,18 @@ var subscribeToTransaction = (token, handleUpdate, key = Math.random().toString(
|
|
|
143
156
|
);
|
|
144
157
|
}
|
|
145
158
|
store.logger.info(
|
|
146
|
-
`\u{1F440}
|
|
159
|
+
`\u{1F440}`,
|
|
160
|
+
`transaction`,
|
|
161
|
+
token.key,
|
|
162
|
+
`Adding subscription "${key}"`
|
|
147
163
|
);
|
|
148
164
|
const unsubscribe = tx.subject.subscribe(key, handleUpdate);
|
|
149
165
|
return () => {
|
|
150
166
|
store.logger.info(
|
|
151
|
-
`\u{1F648}
|
|
167
|
+
`\u{1F648}`,
|
|
168
|
+
`transaction`,
|
|
169
|
+
token.key,
|
|
170
|
+
`Removing subscription "${key}"`
|
|
152
171
|
);
|
|
153
172
|
unsubscribe();
|
|
154
173
|
};
|
|
@@ -160,11 +179,14 @@ var subscribeToTimeline = (token, handleUpdate, key = Math.random().toString(36)
|
|
|
160
179
|
`Cannot subscribe to timeline "${token.key}": timeline not found in store "${store.config.name}".`
|
|
161
180
|
);
|
|
162
181
|
}
|
|
163
|
-
store.logger.info(`\u{1F440}
|
|
182
|
+
store.logger.info(`\u{1F440}`, `timeline`, token.key, `Adding subscription "${key}"`);
|
|
164
183
|
const unsubscribe = tl.subject.subscribe(key, handleUpdate);
|
|
165
184
|
return () => {
|
|
166
185
|
store.logger.info(
|
|
167
|
-
`\u{1F648}
|
|
186
|
+
`\u{1F648}`,
|
|
187
|
+
`timeline`,
|
|
188
|
+
token.key,
|
|
189
|
+
`Removing subscription "${key}" from timeline`
|
|
168
190
|
);
|
|
169
191
|
unsubscribe();
|
|
170
192
|
};
|
|
@@ -191,6 +213,6 @@ var runTransaction = (token, store = IMPLICIT.STORE) => (...parameters) => {
|
|
|
191
213
|
);
|
|
192
214
|
};
|
|
193
215
|
|
|
194
|
-
export { AtomIOLogger, LOG_LEVELS, NotFoundError, Silo, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo };
|
|
216
|
+
export { AtomIOLogger, LOG_LEVELS, NotFoundError, Silo, atom, atomFamily, getState, redo, runTransaction, selector, selectorFamily, setState, simpleLog, simpleLogger, subscribe, subscribeToTimeline, subscribeToTransaction, timeline, transaction, undo };
|
|
195
217
|
//# sourceMappingURL=out.js.map
|
|
196
218
|
//# sourceMappingURL=index.mjs.map
|