@mongrov/analytics 0.1.0-alpha.1 → 0.1.0-alpha.10
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/README.md +472 -0
- package/dist/core/context.d.ts +24 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +30 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/engine.d.ts +56 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +119 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/core/errors.d.ts +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/extensions.d.ts +33 -0
- package/dist/core/extensions.d.ts.map +1 -0
- package/dist/core/extensions.js +58 -0
- package/dist/core/extensions.js.map +1 -0
- package/dist/core/factory.d.ts +22 -5
- package/dist/core/factory.d.ts.map +1 -1
- package/dist/core/factory.js +231 -6
- package/dist/core/factory.js.map +1 -1
- package/dist/core/hooks.d.ts +32 -13
- package/dist/core/hooks.d.ts.map +1 -1
- package/dist/core/hooks.js +137 -15
- package/dist/core/hooks.js.map +1 -1
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +3 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/logger.d.ts +25 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +33 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/machine.d.ts +174 -0
- package/dist/core/machine.d.ts.map +1 -0
- package/dist/core/machine.js +228 -0
- package/dist/core/machine.js.map +1 -0
- package/dist/core/metric_metadata.d.ts +128 -0
- package/dist/core/metric_metadata.d.ts.map +1 -0
- package/dist/core/metric_metadata.js +47 -0
- package/dist/core/metric_metadata.js.map +1 -0
- package/dist/core/migrations.d.ts +52 -0
- package/dist/core/migrations.d.ts.map +1 -0
- package/dist/core/migrations.js +66 -0
- package/dist/core/migrations.js.map +1 -0
- package/dist/core/persistence.d.ts +50 -0
- package/dist/core/persistence.d.ts.map +1 -0
- package/dist/core/persistence.js +80 -0
- package/dist/core/persistence.js.map +1 -0
- package/dist/core/retention.d.ts +90 -0
- package/dist/core/retention.d.ts.map +1 -0
- package/dist/core/retention.js +119 -0
- package/dist/core/retention.js.map +1 -0
- package/dist/core/schemas.d.ts +35 -0
- package/dist/core/schemas.d.ts.map +1 -0
- package/dist/core/schemas.js +209 -0
- package/dist/core/schemas.js.map +1 -0
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/warehouse.d.ts +58 -0
- package/dist/core/warehouse.d.ts.map +1 -0
- package/dist/core/warehouse.js +116 -0
- package/dist/core/warehouse.js.map +1 -0
- package/dist/rules/__fakes__/fakeClock.d.ts +7 -0
- package/dist/rules/__fakes__/fakeClock.d.ts.map +1 -0
- package/dist/rules/__fakes__/fakeClock.js +13 -0
- package/dist/rules/__fakes__/fakeClock.js.map +1 -0
- package/dist/rules/__fakes__/fakeEngine.d.ts +12 -0
- package/dist/rules/__fakes__/fakeEngine.d.ts.map +1 -0
- package/dist/rules/__fakes__/fakeEngine.js +33 -0
- package/dist/rules/__fakes__/fakeEngine.js.map +1 -0
- package/dist/rules/__fakes__/fakeStorage.d.ts +7 -0
- package/dist/rules/__fakes__/fakeStorage.d.ts.map +1 -0
- package/dist/rules/__fakes__/fakeStorage.js +22 -0
- package/dist/rules/__fakes__/fakeStorage.js.map +1 -0
- package/dist/rules/compiler-cache.d.ts +16 -0
- package/dist/rules/compiler-cache.d.ts.map +1 -0
- package/dist/rules/compiler-cache.js +29 -0
- package/dist/rules/compiler-cache.js.map +1 -0
- package/dist/rules/compiler.d.ts +27 -0
- package/dist/rules/compiler.d.ts.map +1 -0
- package/dist/rules/compiler.js +210 -0
- package/dist/rules/compiler.js.map +1 -0
- package/dist/rules/defaults/index.d.ts +13 -0
- package/dist/rules/defaults/index.d.ts.map +1 -0
- package/dist/rules/defaults/index.js +13 -0
- package/dist/rules/defaults/index.js.map +1 -0
- package/dist/rules/defaults/loader.d.ts +18 -0
- package/dist/rules/defaults/loader.d.ts.map +1 -0
- package/dist/rules/defaults/loader.js +37 -0
- package/dist/rules/defaults/loader.js.map +1 -0
- package/dist/rules/defaults/luminx.d.ts +6 -0
- package/dist/rules/defaults/luminx.d.ts.map +1 -0
- package/dist/rules/defaults/luminx.js +64 -0
- package/dist/rules/defaults/luminx.js.map +1 -0
- package/dist/rules/defaults/viva.d.ts +6 -0
- package/dist/rules/defaults/viva.d.ts.map +1 -0
- package/dist/rules/defaults/viva.js +45 -0
- package/dist/rules/defaults/viva.js.map +1 -0
- package/dist/rules/defaults/yogaring.d.ts +6 -0
- package/dist/rules/defaults/yogaring.d.ts.map +1 -0
- package/dist/rules/defaults/yogaring.js +45 -0
- package/dist/rules/defaults/yogaring.js.map +1 -0
- package/dist/rules/defaults/ziva.d.ts +10 -0
- package/dist/rules/defaults/ziva.d.ts.map +1 -0
- package/dist/rules/defaults/ziva.js +87 -0
- package/dist/rules/defaults/ziva.js.map +1 -0
- package/dist/rules/emitter.d.ts +20 -0
- package/dist/rules/emitter.d.ts.map +1 -0
- package/dist/rules/emitter.js +32 -0
- package/dist/rules/emitter.js.map +1 -0
- package/dist/rules/evaluator.d.ts +44 -0
- package/dist/rules/evaluator.d.ts.map +1 -0
- package/dist/rules/evaluator.js +127 -0
- package/dist/rules/evaluator.js.map +1 -0
- package/dist/rules/factory.d.ts +13 -0
- package/dist/rules/factory.d.ts.map +1 -0
- package/dist/rules/factory.js +56 -0
- package/dist/rules/factory.js.map +1 -0
- package/dist/rules/hooks/useRuleRegistry.d.ts +16 -0
- package/dist/rules/hooks/useRuleRegistry.d.ts.map +1 -0
- package/dist/rules/hooks/useRuleRegistry.js +26 -0
- package/dist/rules/hooks/useRuleRegistry.js.map +1 -0
- package/dist/rules/hooks/useRuleViolations.d.ts +21 -0
- package/dist/rules/hooks/useRuleViolations.d.ts.map +1 -0
- package/dist/rules/hooks/useRuleViolations.js +32 -0
- package/dist/rules/hooks/useRuleViolations.js.map +1 -0
- package/dist/rules/index.d.ts +30 -1
- package/dist/rules/index.d.ts.map +1 -1
- package/dist/rules/index.js +36 -1
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/registry.d.ts +32 -0
- package/dist/rules/registry.d.ts.map +1 -0
- package/dist/rules/registry.js +98 -0
- package/dist/rules/registry.js.map +1 -0
- package/dist/rules/schema.d.ts +221 -0
- package/dist/rules/schema.d.ts.map +1 -0
- package/dist/rules/schema.js +80 -0
- package/dist/rules/schema.js.map +1 -0
- package/dist/rules/throttle.d.ts +27 -0
- package/dist/rules/throttle.d.ts.map +1 -0
- package/dist/rules/throttle.js +76 -0
- package/dist/rules/throttle.js.map +1 -0
- package/dist/rules/types.d.ts +88 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +9 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/rules/validator.d.ts +27 -0
- package/dist/rules/validator.d.ts.map +1 -0
- package/dist/rules/validator.js +97 -0
- package/dist/rules/validator.js.map +1 -0
- package/dist/sync/buffer.d.ts +51 -0
- package/dist/sync/buffer.d.ts.map +1 -0
- package/dist/sync/buffer.js +188 -0
- package/dist/sync/buffer.js.map +1 -0
- package/dist/sync/context.d.ts +17 -0
- package/dist/sync/context.d.ts.map +1 -0
- package/dist/sync/context.js +23 -0
- package/dist/sync/context.js.map +1 -0
- package/dist/sync/errors.d.ts +19 -0
- package/dist/sync/errors.d.ts.map +1 -0
- package/dist/sync/errors.js +21 -0
- package/dist/sync/errors.js.map +1 -0
- package/dist/sync/events.d.ts +49 -0
- package/dist/sync/events.d.ts.map +1 -0
- package/dist/sync/events.js +46 -0
- package/dist/sync/events.js.map +1 -0
- package/dist/sync/factory.d.ts +65 -0
- package/dist/sync/factory.d.ts.map +1 -0
- package/dist/sync/factory.js +279 -0
- package/dist/sync/factory.js.map +1 -0
- package/dist/sync/fetcher.d.ts +74 -0
- package/dist/sync/fetcher.d.ts.map +1 -0
- package/dist/sync/fetcher.js +166 -0
- package/dist/sync/fetcher.js.map +1 -0
- package/dist/sync/flusher.d.ts +99 -0
- package/dist/sync/flusher.d.ts.map +1 -0
- package/dist/sync/flusher.js +246 -0
- package/dist/sync/flusher.js.map +1 -0
- package/dist/sync/hooks.d.ts +17 -0
- package/dist/sync/hooks.d.ts.map +1 -0
- package/dist/sync/hooks.js +48 -0
- package/dist/sync/hooks.js.map +1 -0
- package/dist/sync/index.d.ts +32 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +36 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/manager.d.ts +48 -0
- package/dist/sync/manager.d.ts.map +1 -0
- package/dist/sync/manager.js +9 -0
- package/dist/sync/manager.js.map +1 -0
- package/dist/sync/mapper/activity.d.ts +31 -0
- package/dist/sync/mapper/activity.d.ts.map +1 -0
- package/dist/sync/mapper/activity.js +56 -0
- package/dist/sync/mapper/activity.js.map +1 -0
- package/dist/sync/mapper/battery.d.ts +12 -0
- package/dist/sync/mapper/battery.d.ts.map +1 -0
- package/dist/sync/mapper/battery.js +22 -0
- package/dist/sync/mapper/battery.js.map +1 -0
- package/dist/sync/mapper/firmware.d.ts +28 -0
- package/dist/sync/mapper/firmware.d.ts.map +1 -0
- package/dist/sync/mapper/firmware.js +43 -0
- package/dist/sync/mapper/firmware.js.map +1 -0
- package/dist/sync/mapper/heart-rate.d.ts +10 -0
- package/dist/sync/mapper/heart-rate.d.ts.map +1 -0
- package/dist/sync/mapper/heart-rate.js +19 -0
- package/dist/sync/mapper/heart-rate.js.map +1 -0
- package/dist/sync/mapper/hrv.d.ts +22 -0
- package/dist/sync/mapper/hrv.d.ts.map +1 -0
- package/dist/sync/mapper/hrv.js +56 -0
- package/dist/sync/mapper/hrv.js.map +1 -0
- package/dist/sync/mapper/ring-config.d.ts +33 -0
- package/dist/sync/mapper/ring-config.d.ts.map +1 -0
- package/dist/sync/mapper/ring-config.js +48 -0
- package/dist/sync/mapper/ring-config.js.map +1 -0
- package/dist/sync/mapper/sleep.d.ts +32 -0
- package/dist/sync/mapper/sleep.d.ts.map +1 -0
- package/dist/sync/mapper/sleep.js +103 -0
- package/dist/sync/mapper/sleep.js.map +1 -0
- package/dist/sync/mapper/spo2.d.ts +9 -0
- package/dist/sync/mapper/spo2.d.ts.map +1 -0
- package/dist/sync/mapper/spo2.js +18 -0
- package/dist/sync/mapper/spo2.js.map +1 -0
- package/dist/sync/mapper/temperature.d.ts +10 -0
- package/dist/sync/mapper/temperature.d.ts.map +1 -0
- package/dist/sync/mapper/temperature.js +19 -0
- package/dist/sync/mapper/temperature.js.map +1 -0
- package/dist/sync/mapper/time.d.ts +49 -0
- package/dist/sync/mapper/time.d.ts.map +1 -0
- package/dist/sync/mapper/time.js +107 -0
- package/dist/sync/mapper/time.js.map +1 -0
- package/dist/sync/mapper/types.d.ts +152 -0
- package/dist/sync/mapper/types.d.ts.map +1 -0
- package/dist/sync/mapper/types.js +15 -0
- package/dist/sync/mapper/types.js.map +1 -0
- package/dist/sync/overflow.d.ts +30 -0
- package/dist/sync/overflow.d.ts.map +1 -0
- package/dist/sync/overflow.js +114 -0
- package/dist/sync/overflow.js.map +1 -0
- package/dist/sync/pusher.d.ts +59 -0
- package/dist/sync/pusher.d.ts.map +1 -0
- package/dist/sync/pusher.js +115 -0
- package/dist/sync/pusher.js.map +1 -0
- package/dist/sync/scheduler.d.ts +84 -0
- package/dist/sync/scheduler.d.ts.map +1 -0
- package/dist/sync/scheduler.js +132 -0
- package/dist/sync/scheduler.js.map +1 -0
- package/dist/sync/triggers.d.ts +64 -0
- package/dist/sync/triggers.d.ts.map +1 -0
- package/dist/sync/triggers.js +113 -0
- package/dist/sync/triggers.js.map +1 -0
- package/dist/sync/types.d.ts +50 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +8 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/watermark.d.ts +32 -0
- package/dist/sync/watermark.d.ts.map +1 -0
- package/dist/sync/watermark.js +61 -0
- package/dist/sync/watermark.js.map +1 -0
- package/dist/tools/__fakes__/engine.d.ts +25 -0
- package/dist/tools/__fakes__/engine.d.ts.map +1 -0
- package/dist/tools/__fakes__/engine.js +37 -0
- package/dist/tools/__fakes__/engine.js.map +1 -0
- package/dist/tools/audit.d.ts +31 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +157 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/authorize.d.ts +36 -0
- package/dist/tools/authorize.d.ts.map +1 -0
- package/dist/tools/authorize.js +87 -0
- package/dist/tools/authorize.js.map +1 -0
- package/dist/tools/budget.d.ts +15 -0
- package/dist/tools/budget.d.ts.map +1 -0
- package/dist/tools/budget.js +64 -0
- package/dist/tools/budget.js.map +1 -0
- package/dist/tools/factory.d.ts +43 -0
- package/dist/tools/factory.d.ts.map +1 -0
- package/dist/tools/factory.js +137 -0
- package/dist/tools/factory.js.map +1 -0
- package/dist/tools/formatters.d.ts +17 -0
- package/dist/tools/formatters.d.ts.map +1 -0
- package/dist/tools/formatters.js +30 -0
- package/dist/tools/formatters.js.map +1 -0
- package/dist/tools/impls/activity.d.ts +15 -0
- package/dist/tools/impls/activity.d.ts.map +1 -0
- package/dist/tools/impls/activity.js +61 -0
- package/dist/tools/impls/activity.js.map +1 -0
- package/dist/tools/impls/anomaly.d.ts +21 -0
- package/dist/tools/impls/anomaly.d.ts.map +1 -0
- package/dist/tools/impls/anomaly.js +70 -0
- package/dist/tools/impls/anomaly.js.map +1 -0
- package/dist/tools/impls/compare.d.ts +21 -0
- package/dist/tools/impls/compare.d.ts.map +1 -0
- package/dist/tools/impls/compare.js +68 -0
- package/dist/tools/impls/compare.js.map +1 -0
- package/dist/tools/impls/hrv.d.ts +15 -0
- package/dist/tools/impls/hrv.d.ts.map +1 -0
- package/dist/tools/impls/hrv.js +36 -0
- package/dist/tools/impls/hrv.js.map +1 -0
- package/dist/tools/impls/insights.d.ts +18 -0
- package/dist/tools/impls/insights.d.ts.map +1 -0
- package/dist/tools/impls/insights.js +41 -0
- package/dist/tools/impls/insights.js.map +1 -0
- package/dist/tools/impls/sleep.d.ts +15 -0
- package/dist/tools/impls/sleep.d.ts.map +1 -0
- package/dist/tools/impls/sleep.js +43 -0
- package/dist/tools/impls/sleep.js.map +1 -0
- package/dist/tools/index.d.ts +13 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +21 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp/adapter.d.ts +33 -0
- package/dist/tools/mcp/adapter.d.ts.map +1 -0
- package/dist/tools/mcp/adapter.js +56 -0
- package/dist/tools/mcp/adapter.js.map +1 -0
- package/dist/tools/mcp/guard.d.ts +17 -0
- package/dist/tools/mcp/guard.d.ts.map +1 -0
- package/dist/tools/mcp/guard.js +22 -0
- package/dist/tools/mcp/guard.js.map +1 -0
- package/dist/tools/mcp/index.d.ts +20 -0
- package/dist/tools/mcp/index.d.ts.map +1 -0
- package/dist/tools/mcp/index.js +16 -0
- package/dist/tools/mcp/index.js.map +1 -0
- package/dist/tools/mcp/server.d.ts +39 -0
- package/dist/tools/mcp/server.d.ts.map +1 -0
- package/dist/tools/mcp/server.js +70 -0
- package/dist/tools/mcp/server.js.map +1 -0
- package/dist/tools/mcp/transports/http.d.ts +54 -0
- package/dist/tools/mcp/transports/http.d.ts.map +1 -0
- package/dist/tools/mcp/transports/http.js +133 -0
- package/dist/tools/mcp/transports/http.js.map +1 -0
- package/dist/tools/mcp/transports/stdio.d.ts +22 -0
- package/dist/tools/mcp/transports/stdio.d.ts.map +1 -0
- package/dist/tools/mcp/transports/stdio.js +19 -0
- package/dist/tools/mcp/transports/stdio.js.map +1 -0
- package/dist/tools/rate-limit.d.ts +26 -0
- package/dist/tools/rate-limit.d.ts.map +1 -0
- package/dist/tools/rate-limit.js +67 -0
- package/dist/tools/rate-limit.js.map +1 -0
- package/dist/tools/types.d.ts +121 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +16 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/wrap.d.ts +53 -0
- package/dist/tools/wrap.d.ts.map +1 -0
- package/dist/tools/wrap.js +135 -0
- package/dist/tools/wrap.js.map +1 -0
- package/package.json +28 -2
package/dist/core/hooks.js
CHANGED
|
@@ -1,23 +1,145 @@
|
|
|
1
|
-
import { NotImplementedError } from './errors';
|
|
2
1
|
/**
|
|
3
|
-
* React hooks over the analytics engine.
|
|
4
|
-
* `useSyncExternalStore` on `engine.subscribe()` lands in Phase 5 (T-11/12/13).
|
|
2
|
+
* React hooks over the analytics engine.
|
|
5
3
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* All three hooks resolve the engine via `useAnalyticsEngine()` (context) and
|
|
5
|
+
* subscribe to state transitions with `useSyncExternalStore`. Query hooks
|
|
6
|
+
* (`useTimeseries`, `useInsight`) block until the engine is attached; a
|
|
7
|
+
* detach + re-attach (family switch) refires them via the state subscription.
|
|
8
|
+
*/
|
|
9
|
+
import { useCallback, useEffect, useMemo, useReducer, useRef, useSyncExternalStore } from 'react';
|
|
10
|
+
import { useAnalyticsEngine } from './context';
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to the engine's state machine. Re-renders on every transition.
|
|
13
|
+
* `isReady` is true from `ready` onward (engine opened); `isAttached` is true
|
|
14
|
+
* only in the `attached` state.
|
|
10
15
|
*/
|
|
11
|
-
// T-11 — public shape per analytics-core/spec.md §Hooks
|
|
12
16
|
export function useAnalytics() {
|
|
13
|
-
|
|
17
|
+
const engine = useAnalyticsEngine();
|
|
18
|
+
const state = useEngineState(engine);
|
|
19
|
+
return {
|
|
20
|
+
state,
|
|
21
|
+
isReady: state !== 'idle' && state !== 'opening' && state !== 'error',
|
|
22
|
+
isAttached: state === 'attached',
|
|
23
|
+
error: state === 'error' ? engine.lastError : null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function timeseriesReducer(state, action) {
|
|
27
|
+
switch (action.type) {
|
|
28
|
+
case 'start':
|
|
29
|
+
return { ...state, loading: true, error: null };
|
|
30
|
+
case 'success':
|
|
31
|
+
return { data: action.data, loading: false, error: null };
|
|
32
|
+
case 'failure':
|
|
33
|
+
return { ...state, loading: false, error: action.error };
|
|
34
|
+
case 'reset':
|
|
35
|
+
return { data: undefined, loading: false, error: null };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Runs `sql` (with `params`) against the engine whenever `key`, `sql`,
|
|
40
|
+
* `params`, or the engine's attached state changes. `key === undefined`
|
|
41
|
+
* disables the query (data stays `undefined`).
|
|
42
|
+
*
|
|
43
|
+
* `refetch()` re-runs the current query; stale results from prior effects are
|
|
44
|
+
* discarded via a per-effect abort flag so out-of-order responses never win.
|
|
45
|
+
*/
|
|
46
|
+
export function useTimeseries(key, sql, params) {
|
|
47
|
+
const engine = useAnalyticsEngine();
|
|
48
|
+
const state = useEngineState(engine);
|
|
49
|
+
const attached = state === 'attached';
|
|
50
|
+
// Stable string key for params so effect deps don't retrigger on new refs.
|
|
51
|
+
const paramsKey = useMemo(() => (params ? stableJson(params) : ''), [params]);
|
|
52
|
+
const [store, dispatch] = useReducer(timeseriesReducer, { data: undefined, loading: false, error: null });
|
|
53
|
+
// Keep the latest params ref so refetch uses fresh values without re-arming
|
|
54
|
+
// the effect (params object identity changes on every render).
|
|
55
|
+
const latestParamsRef = useRef(params);
|
|
56
|
+
latestParamsRef.current = params;
|
|
57
|
+
const runQuery = useCallback(async (abortRef) => {
|
|
58
|
+
dispatch({ type: 'start' });
|
|
59
|
+
try {
|
|
60
|
+
const rows = await engine.execute(sql, latestParamsRef.current);
|
|
61
|
+
if (abortRef.aborted)
|
|
62
|
+
return;
|
|
63
|
+
dispatch({ type: 'success', data: rows });
|
|
64
|
+
}
|
|
65
|
+
catch (cause) {
|
|
66
|
+
if (abortRef.aborted)
|
|
67
|
+
return;
|
|
68
|
+
dispatch({
|
|
69
|
+
type: 'failure',
|
|
70
|
+
error: cause instanceof Error ? cause : new Error(String(cause)),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}, [engine, sql]);
|
|
74
|
+
// Track the currently active abort ref so `refetch()` can invalidate the
|
|
75
|
+
// background effect run without waiting for the deps to change.
|
|
76
|
+
const activeAbortRef = useRef(null);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (key === undefined) {
|
|
79
|
+
dispatch({ type: 'reset' });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (!attached) {
|
|
83
|
+
// Waiting for engine to attach; leave `data` as-is and don't set loading.
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const abortRef = { aborted: false };
|
|
87
|
+
activeAbortRef.current = abortRef;
|
|
88
|
+
void runQuery(abortRef);
|
|
89
|
+
return () => {
|
|
90
|
+
abortRef.aborted = true;
|
|
91
|
+
if (activeAbortRef.current === abortRef) {
|
|
92
|
+
activeAbortRef.current = null;
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
// paramsKey is a stable stringified marker; sql + key + attached round out deps.
|
|
96
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
97
|
+
}, [key, sql, paramsKey, attached, runQuery]);
|
|
98
|
+
const refetch = useCallback(async () => {
|
|
99
|
+
if (key === undefined || !attached)
|
|
100
|
+
return;
|
|
101
|
+
// Cancel any in-flight query so its result can't overwrite ours.
|
|
102
|
+
if (activeAbortRef.current) {
|
|
103
|
+
activeAbortRef.current.aborted = true;
|
|
104
|
+
}
|
|
105
|
+
const abortRef = { aborted: false };
|
|
106
|
+
activeAbortRef.current = abortRef;
|
|
107
|
+
await runQuery(abortRef);
|
|
108
|
+
}, [key, attached, runQuery]);
|
|
109
|
+
return { data: store.data, loading: store.loading, error: store.error, refetch };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Reads a single insight row by id. Returns `undefined` if the engine is not
|
|
113
|
+
* attached or the row does not exist.
|
|
114
|
+
*/
|
|
115
|
+
export function useInsight(id) {
|
|
116
|
+
const engine = useAnalyticsEngine();
|
|
117
|
+
const catalog = engine.catalog;
|
|
118
|
+
const sql = catalog
|
|
119
|
+
? `SELECT * FROM ${catalog}.insight WHERE id = $id LIMIT 1`
|
|
120
|
+
: '';
|
|
121
|
+
const params = useMemo(() => ({ id }), [id]);
|
|
122
|
+
const { data, loading } = useTimeseries(catalog ? id : undefined, sql, params);
|
|
123
|
+
return {
|
|
124
|
+
insight: data?.[0],
|
|
125
|
+
loading,
|
|
126
|
+
};
|
|
14
127
|
}
|
|
15
|
-
//
|
|
16
|
-
|
|
17
|
-
|
|
128
|
+
// -------------------- internal --------------------
|
|
129
|
+
/** `useSyncExternalStore` bound to the engine's subscribe surface. */
|
|
130
|
+
function useEngineState(engine) {
|
|
131
|
+
return useSyncExternalStore(useCallback((onStoreChange) => engine.subscribe(onStoreChange), [engine]), useCallback(() => engine.state, [engine]), useCallback(() => engine.state, [engine]));
|
|
18
132
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Deterministic JSON for effect-dep keys. Object.keys() order is
|
|
135
|
+
* insertion-defined in modern engines; we sort to be safe when apps compute
|
|
136
|
+
* params objects with varying key order.
|
|
137
|
+
*/
|
|
138
|
+
function stableJson(value) {
|
|
139
|
+
const keys = Object.keys(value).sort();
|
|
140
|
+
const out = {};
|
|
141
|
+
for (const k of keys)
|
|
142
|
+
out[k] = value[k];
|
|
143
|
+
return JSON.stringify(out);
|
|
22
144
|
}
|
|
23
145
|
//# sourceMappingURL=hooks.js.map
|
package/dist/core/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/core/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
*/
|
|
7
7
|
export { createAnalytics } from './factory';
|
|
8
8
|
export { useAnalytics, useInsight, useTimeseries } from './hooks';
|
|
9
|
+
export type { UseAnalyticsResult, UseInsightResult, UseTimeseriesResult, } from './hooks';
|
|
10
|
+
export { AnalyticsProvider } from './context';
|
|
11
|
+
export type { AnalyticsProviderProps } from './context';
|
|
9
12
|
export { AnalyticsError, NotImplementedError } from './errors';
|
|
10
13
|
export type { AnalyticsErrorCode } from './errors';
|
|
11
14
|
export type { AnalyticsAppender, AnalyticsConfig, AnalyticsEngine, AnalyticsLogger, AnalyticsState, AttachContext, EventBus, FamilyMembersProvider, Insight, KVStore, TenantScope, TokenContext, TokenResponse, TokenVendor, Unsubscribe, } from './types';
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjE,YAAY,EACV,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7C,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAGvD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAGlD,YAAY,EACV,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,EACR,qBAAqB,EACrB,OAAO,EACP,OAAO,EACP,WAAW,EACX,YAAY,EACZ,aAAa,EACb,WAAW,EACX,WAAW,GACZ,MAAM,SAAS,CAAA"}
|
package/dist/core/index.js
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
*/
|
|
7
7
|
// Factory (T-02 stub → T-10 real)
|
|
8
8
|
export { createAnalytics } from './factory';
|
|
9
|
-
// Hooks (T-
|
|
9
|
+
// Hooks (T-11/12/13)
|
|
10
10
|
export { useAnalytics, useInsight, useTimeseries } from './hooks';
|
|
11
|
+
// Provider (Phase 5)
|
|
12
|
+
export { AnalyticsProvider } from './context';
|
|
11
13
|
// Errors
|
|
12
14
|
export { AnalyticsError, NotImplementedError } from './errors';
|
|
13
15
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kCAAkC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,qBAAqB;AACrB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAOjE,qBAAqB;AACrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAG7C,SAAS;AACT,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logger plumbing for @mongrov/analytics.
|
|
3
|
+
*
|
|
4
|
+
* Apps supply an `AnalyticsLogger` via `AnalyticsConfig.logger`. When absent
|
|
5
|
+
* we fall back to a no-op sink so callers can `log.debug(...)` unconditionally
|
|
6
|
+
* without null-checks. The library only emits at these levels:
|
|
7
|
+
*
|
|
8
|
+
* - **debug** — state transitions (hot on attach/detach churn; app can drop)
|
|
9
|
+
* - **info** — lifecycle milestones (attached, detached, closed)
|
|
10
|
+
* - **warn** — best-effort operations that failed but didn't reject the caller
|
|
11
|
+
* (retention sweep miss, last-attach persist miss, KV eviction)
|
|
12
|
+
* - **error** — reserved for callers who want to surface an
|
|
13
|
+
* `AnalyticsError` before re-throwing (not used by the library
|
|
14
|
+
* today — errors bubble via `throw`)
|
|
15
|
+
*
|
|
16
|
+
* No logs on the hot query path (`execute`, `stream`, `createAppender`) per
|
|
17
|
+
* T-17 AC — apps can enable debug tracing at their integration layer if
|
|
18
|
+
* needed.
|
|
19
|
+
*/
|
|
20
|
+
import type { AnalyticsLogger } from './types';
|
|
21
|
+
/** No-op logger — used when `AnalyticsConfig.logger` is absent. */
|
|
22
|
+
export declare function noopLogger(): AnalyticsLogger;
|
|
23
|
+
/** Resolve the effective logger — provided or no-op. */
|
|
24
|
+
export declare function resolveLogger(provided: AnalyticsLogger | undefined): AnalyticsLogger;
|
|
25
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9C,mEAAmE;AACnE,wBAAgB,UAAU,IAAI,eAAe,CAO5C;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,eAAe,GAAG,SAAS,GAAG,eAAe,CAEpF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured logger plumbing for @mongrov/analytics.
|
|
3
|
+
*
|
|
4
|
+
* Apps supply an `AnalyticsLogger` via `AnalyticsConfig.logger`. When absent
|
|
5
|
+
* we fall back to a no-op sink so callers can `log.debug(...)` unconditionally
|
|
6
|
+
* without null-checks. The library only emits at these levels:
|
|
7
|
+
*
|
|
8
|
+
* - **debug** — state transitions (hot on attach/detach churn; app can drop)
|
|
9
|
+
* - **info** — lifecycle milestones (attached, detached, closed)
|
|
10
|
+
* - **warn** — best-effort operations that failed but didn't reject the caller
|
|
11
|
+
* (retention sweep miss, last-attach persist miss, KV eviction)
|
|
12
|
+
* - **error** — reserved for callers who want to surface an
|
|
13
|
+
* `AnalyticsError` before re-throwing (not used by the library
|
|
14
|
+
* today — errors bubble via `throw`)
|
|
15
|
+
*
|
|
16
|
+
* No logs on the hot query path (`execute`, `stream`, `createAppender`) per
|
|
17
|
+
* T-17 AC — apps can enable debug tracing at their integration layer if
|
|
18
|
+
* needed.
|
|
19
|
+
*/
|
|
20
|
+
/** No-op logger — used when `AnalyticsConfig.logger` is absent. */
|
|
21
|
+
export function noopLogger() {
|
|
22
|
+
return {
|
|
23
|
+
debug() { },
|
|
24
|
+
info() { },
|
|
25
|
+
warn() { },
|
|
26
|
+
error() { },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Resolve the effective logger — provided or no-op. */
|
|
30
|
+
export function resolveLogger(provided) {
|
|
31
|
+
return provided ?? noopLogger();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,mEAAmE;AACnE,MAAM,UAAU,UAAU;IACxB,OAAO;QACL,KAAK,KAAI,CAAC;QACV,IAAI,KAAI,CAAC;QACT,IAAI,KAAI,CAAC;QACT,KAAK,KAAI,CAAC;KACX,CAAA;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,aAAa,CAAC,QAAqC;IACjE,OAAO,QAAQ,IAAI,UAAU,EAAE,CAAA;AACjC,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XState v5 state machine that drives the analytics engine lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* `idle → opening → ready → attaching → attached → detaching → error`
|
|
5
|
+
*
|
|
6
|
+
* The machine owns lifecycle transitions only; side effects live in injected
|
|
7
|
+
* actors (`openEngine`, `attachEngine`, `detachEngine`, `refreshToken`) so
|
|
8
|
+
* tests can substitute fakes without a real DuckDB.
|
|
9
|
+
*
|
|
10
|
+
* Token refresh runs silently on `attached` via a delayed self-transition
|
|
11
|
+
* to `refreshing`, computed as 75% of the remaining TTL (spec §Token
|
|
12
|
+
* refresh policy). Refresh success re-enters `attached` and re-arms the
|
|
13
|
+
* timer; failure lands in `error`.
|
|
14
|
+
*
|
|
15
|
+
* Consumers (T-10 factory + T-11 hook) drive the machine via `send` and
|
|
16
|
+
* observe via `subscribe`.
|
|
17
|
+
*/
|
|
18
|
+
import { AnalyticsError } from './errors';
|
|
19
|
+
import type { AttachContext } from './types';
|
|
20
|
+
/**
|
|
21
|
+
* Compute the delay before firing `TOKEN_REFRESH_TICK`. Spec calls for 75%
|
|
22
|
+
* TTL. Falls back to a 30-minute default when the vendor's `expiresAt` is
|
|
23
|
+
* missing or already in the past — the refresh will fail loudly rather than
|
|
24
|
+
* silently skipping.
|
|
25
|
+
*/
|
|
26
|
+
export declare function computeRefreshDelay(now: number, expiresAt: number | undefined): number;
|
|
27
|
+
export interface AttachSuccess {
|
|
28
|
+
warehouseSecret: string;
|
|
29
|
+
tokenExpiresAt: number;
|
|
30
|
+
}
|
|
31
|
+
export interface RefreshSuccess {
|
|
32
|
+
tokenExpiresAt: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Actors are injected by the factory (T-10). Each returns a promise the
|
|
36
|
+
* machine invokes on entry to the relevant state.
|
|
37
|
+
*/
|
|
38
|
+
export interface MachineActors {
|
|
39
|
+
openEngine: () => Promise<void>;
|
|
40
|
+
attachEngine: (input: {
|
|
41
|
+
ctx: AttachContext;
|
|
42
|
+
}) => Promise<AttachSuccess>;
|
|
43
|
+
detachEngine: (input: {
|
|
44
|
+
ctx: AttachContext;
|
|
45
|
+
}) => Promise<void>;
|
|
46
|
+
refreshToken: (input: {
|
|
47
|
+
ctx: AttachContext;
|
|
48
|
+
}) => Promise<RefreshSuccess>;
|
|
49
|
+
}
|
|
50
|
+
export interface MachineContext {
|
|
51
|
+
deps: MachineActors;
|
|
52
|
+
ctx: AttachContext | undefined;
|
|
53
|
+
tokenExpiresAt: number | undefined;
|
|
54
|
+
warehouseSecret: string | undefined;
|
|
55
|
+
lastError: AnalyticsError | undefined;
|
|
56
|
+
}
|
|
57
|
+
export type MachineEvent = {
|
|
58
|
+
type: 'OPEN';
|
|
59
|
+
} | {
|
|
60
|
+
type: 'ATTACH';
|
|
61
|
+
ctx: AttachContext;
|
|
62
|
+
} | {
|
|
63
|
+
type: 'DETACH';
|
|
64
|
+
} | {
|
|
65
|
+
type: 'CLOSE';
|
|
66
|
+
} | {
|
|
67
|
+
type: 'TOKEN_REFRESH_TICK';
|
|
68
|
+
};
|
|
69
|
+
export interface MachineInput {
|
|
70
|
+
deps: MachineActors;
|
|
71
|
+
}
|
|
72
|
+
export type MachineState = 'idle' | 'opening' | 'ready' | 'attaching' | 'attached' | 'refreshing' | 'detaching' | 'error';
|
|
73
|
+
export declare const analyticsMachine: import("xstate").StateMachine<MachineContext, {
|
|
74
|
+
type: "OPEN";
|
|
75
|
+
} | {
|
|
76
|
+
type: "ATTACH";
|
|
77
|
+
ctx: AttachContext;
|
|
78
|
+
} | {
|
|
79
|
+
type: "DETACH";
|
|
80
|
+
} | {
|
|
81
|
+
type: "CLOSE";
|
|
82
|
+
} | {
|
|
83
|
+
type: "TOKEN_REFRESH_TICK";
|
|
84
|
+
}, {
|
|
85
|
+
[x: string]: import("xstate").ActorRefFromLogic<import("xstate").PromiseActorLogic<void, {
|
|
86
|
+
deps: MachineActors;
|
|
87
|
+
}, import("xstate").EventObject>> | import("xstate").ActorRefFromLogic<import("xstate").PromiseActorLogic<AttachSuccess, {
|
|
88
|
+
deps: MachineActors;
|
|
89
|
+
ctx: AttachContext;
|
|
90
|
+
}, import("xstate").EventObject>> | import("xstate").ActorRefFromLogic<import("xstate").PromiseActorLogic<void, {
|
|
91
|
+
deps: MachineActors;
|
|
92
|
+
ctx: AttachContext;
|
|
93
|
+
}, import("xstate").EventObject>> | import("xstate").ActorRefFromLogic<import("xstate").PromiseActorLogic<RefreshSuccess, {
|
|
94
|
+
deps: MachineActors;
|
|
95
|
+
ctx: AttachContext;
|
|
96
|
+
}, import("xstate").EventObject>> | undefined;
|
|
97
|
+
}, {
|
|
98
|
+
src: "openEngine";
|
|
99
|
+
logic: import("xstate").PromiseActorLogic<void, {
|
|
100
|
+
deps: MachineActors;
|
|
101
|
+
}, import("xstate").EventObject>;
|
|
102
|
+
id: string | undefined;
|
|
103
|
+
} | {
|
|
104
|
+
src: "attachEngine";
|
|
105
|
+
logic: import("xstate").PromiseActorLogic<AttachSuccess, {
|
|
106
|
+
deps: MachineActors;
|
|
107
|
+
ctx: AttachContext;
|
|
108
|
+
}, import("xstate").EventObject>;
|
|
109
|
+
id: string | undefined;
|
|
110
|
+
} | {
|
|
111
|
+
src: "detachEngine";
|
|
112
|
+
logic: import("xstate").PromiseActorLogic<void, {
|
|
113
|
+
deps: MachineActors;
|
|
114
|
+
ctx: AttachContext;
|
|
115
|
+
}, import("xstate").EventObject>;
|
|
116
|
+
id: string | undefined;
|
|
117
|
+
} | {
|
|
118
|
+
src: "refreshToken";
|
|
119
|
+
logic: import("xstate").PromiseActorLogic<RefreshSuccess, {
|
|
120
|
+
deps: MachineActors;
|
|
121
|
+
ctx: AttachContext;
|
|
122
|
+
}, import("xstate").EventObject>;
|
|
123
|
+
id: string | undefined;
|
|
124
|
+
}, {
|
|
125
|
+
type: "assignAttachCtx";
|
|
126
|
+
params: import("xstate").NonReducibleUnknown;
|
|
127
|
+
} | {
|
|
128
|
+
type: "assignAttachSuccess";
|
|
129
|
+
params: {
|
|
130
|
+
output: AttachSuccess;
|
|
131
|
+
};
|
|
132
|
+
} | {
|
|
133
|
+
type: "assignRefreshSuccess";
|
|
134
|
+
params: {
|
|
135
|
+
output: RefreshSuccess;
|
|
136
|
+
};
|
|
137
|
+
} | {
|
|
138
|
+
type: "assignOpenError";
|
|
139
|
+
params: {
|
|
140
|
+
error: unknown;
|
|
141
|
+
};
|
|
142
|
+
} | {
|
|
143
|
+
type: "assignAttachError";
|
|
144
|
+
params: {
|
|
145
|
+
error: unknown;
|
|
146
|
+
};
|
|
147
|
+
} | {
|
|
148
|
+
type: "assignRefreshError";
|
|
149
|
+
params: {
|
|
150
|
+
error: unknown;
|
|
151
|
+
};
|
|
152
|
+
} | {
|
|
153
|
+
type: "clearError";
|
|
154
|
+
params: import("xstate").NonReducibleUnknown;
|
|
155
|
+
} | {
|
|
156
|
+
type: "clearAttachState";
|
|
157
|
+
params: import("xstate").NonReducibleUnknown;
|
|
158
|
+
}, {
|
|
159
|
+
type: "hasAttachCtx";
|
|
160
|
+
params: unknown;
|
|
161
|
+
}, "tokenRefresh", "idle" | "opening" | "ready" | "attaching" | "attached" | "detaching" | "error" | "refreshing", string, MachineInput, import("xstate").NonReducibleUnknown, import("xstate").EventObject, import("xstate").MetaObject, {
|
|
162
|
+
id: "analytics";
|
|
163
|
+
states: {
|
|
164
|
+
readonly idle: {};
|
|
165
|
+
readonly opening: {};
|
|
166
|
+
readonly ready: {};
|
|
167
|
+
readonly attaching: {};
|
|
168
|
+
readonly attached: {};
|
|
169
|
+
readonly refreshing: {};
|
|
170
|
+
readonly detaching: {};
|
|
171
|
+
readonly error: {};
|
|
172
|
+
};
|
|
173
|
+
}>;
|
|
174
|
+
//# sourceMappingURL=machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"machine.d.ts","sourceRoot":"","sources":["../../src/core/machine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAI5C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMtF;AAID,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,aAAa,CAAA;KAAE,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;IACvE,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,aAAa,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9D,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,aAAa,CAAA;KAAE,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;CACzE;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAA;IACnB,GAAG,EAAE,aAAa,GAAG,SAAS,CAAA;IAC9B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,SAAS,EAAE,cAAc,GAAG,SAAS,CAAA;CACtC;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,aAAa,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAElC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,aAAa,CAAA;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,SAAS,GACT,OAAO,GACP,WAAW,GACX,UAAU,GACV,YAAY,GACZ,WAAW,GACX,OAAO,CAAA;AAgBX,eAAO,MAAM,gBAAgB;UAlCjB,MAAM;;UACN,QAAQ;SAAO,aAAa;;UAC5B,QAAQ;;UACR,OAAO;;UACP,oBAAoB;;;cAqCU,aAAa;;cAGF,aAAa;aAAO,aAAa;;cAG1C,aAAa;aAAO,aAAa;;cAKvB,aAAa;aAAO,aAAa;;;;;cAX7C,aAAa;;;;;;cAGF,aAAa;aAAO,aAAa;;;;;;cAG1C,aAAa;aAAO,aAAa;;;;;;cAKvB,aAAa;aAAO,aAAa;;;;;;;;;gBASjC,aAAa;;;;;gBAKZ,cAAc;;;;;eAIpB,OAAO;;;;;eAGL,OAAO;;;;;eAGN,OAAO;;;;;;;;;;;;;;;;;;;;;;;EAoJzD,CAAA"}
|