@zedtech/zedkit-observability 0.0.0-stage → 0.2.0
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/LICENSE +21 -0
- package/README.md +14 -2
- package/dist/consent/banner.d.ts +10 -0
- package/dist/consent/banner.d.ts.map +1 -0
- package/dist/consent/banner.js +23 -0
- package/dist/consent/banner.js.map +1 -0
- package/dist/consent/gated-tracker.d.ts +8 -0
- package/dist/consent/gated-tracker.d.ts.map +1 -0
- package/dist/consent/gated-tracker.js +38 -0
- package/dist/consent/gated-tracker.js.map +1 -0
- package/dist/consent/index.d.ts +4 -0
- package/dist/consent/index.d.ts.map +1 -0
- package/dist/consent/index.js +4 -0
- package/dist/consent/index.js.map +1 -0
- package/dist/consent/react.d.ts +19 -0
- package/dist/consent/react.d.ts.map +1 -0
- package/dist/consent/react.js +43 -0
- package/dist/consent/react.js.map +1 -0
- package/dist/consent/store.d.ts +22 -0
- package/dist/consent/store.d.ts.map +1 -0
- package/dist/consent/store.js +51 -0
- package/dist/consent/store.js.map +1 -0
- package/dist/consent-react.d.ts +3 -0
- package/dist/consent-react.d.ts.map +1 -0
- package/dist/consent-react.js +3 -0
- package/dist/consent-react.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +23 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +41 -0
- package/dist/logger.js.map +1 -0
- package/dist/pino-logger.d.ts +12 -0
- package/dist/pino-logger.d.ts.map +1 -0
- package/dist/pino-logger.js +27 -0
- package/dist/pino-logger.js.map +1 -0
- package/dist/posthog-tracker.d.ts +10 -0
- package/dist/posthog-tracker.d.ts.map +1 -0
- package/dist/posthog-tracker.js +9 -0
- package/dist/posthog-tracker.js.map +1 -0
- package/dist/react.d.ts +7 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +26 -0
- package/dist/react.js.map +1 -0
- package/dist/react.types.d.ts +13 -0
- package/dist/react.types.d.ts.map +1 -0
- package/dist/react.types.js +2 -0
- package/dist/react.types.js.map +1 -0
- package/dist/tracker.d.ts +20 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +34 -0
- package/dist/tracker.js.map +1 -0
- package/package.json +110 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 zedtech-fr
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @zedtech/zedkit-observability
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Logger and product-analytics **ports** with console, noop, and in-memory
|
|
4
|
+
adapters. React apps mount `ObservabilityProvider` and read
|
|
5
|
+
`useLogger` / `useTracker`. Optional subpaths wrap `pino` and a browser
|
|
6
|
+
analytics SDK (peer dependencies).
|
|
7
|
+
|
|
8
|
+
Original work by the same author.
|
|
9
|
+
|
|
10
|
+
```ts
|
|
11
|
+
import { createConsoleLogger, createNoopTracker } from "@zedtech/zedkit-observability";
|
|
12
|
+
import { ObservabilityProvider } from "@zedtech/zedkit-observability/react";
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
See [CATALOG.md](./CATALOG.md) for needs and examples.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface ConsentBannerProps {
|
|
2
|
+
title: string;
|
|
3
|
+
description: string;
|
|
4
|
+
analyticsLabel: string;
|
|
5
|
+
marketingLabel: string;
|
|
6
|
+
acceptAllLabel: string;
|
|
7
|
+
saveLabel: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function ConsentBanner(props: ConsentBannerProps): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=banner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../src/consent/banner.tsx"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAqDtD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
// Original work by the same author.
|
|
4
|
+
import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Label, Switch, } from "@zedtech/zedkit-ui";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
|
+
import { useConsentRecord, useConsentStoreInstance } from "./react.js";
|
|
7
|
+
export function ConsentBanner(props) {
|
|
8
|
+
const store = useConsentStoreInstance();
|
|
9
|
+
const record = useConsentRecord();
|
|
10
|
+
const open = record === null;
|
|
11
|
+
const [draft, setDraft] = useState({ analytics: false, marketing: false });
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (record === null) {
|
|
14
|
+
setDraft({ analytics: false, marketing: false });
|
|
15
|
+
}
|
|
16
|
+
}, [record]);
|
|
17
|
+
const save = (preferences) => store.write(preferences);
|
|
18
|
+
return (_jsx(Dialog, { open: open, onOpenChange: (next) => {
|
|
19
|
+
if (!next && store.read() === null)
|
|
20
|
+
return;
|
|
21
|
+
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: props.title }), _jsx(DialogDescription, { children: props.description })] }), _jsxs("div", { className: "flex flex-col gap-4 py-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx(Label, { htmlFor: "consent-analytics", children: props.analyticsLabel }), _jsx(Switch, { id: "consent-analytics", checked: draft.analytics, onCheckedChange: (checked) => setDraft((prev) => ({ ...prev, analytics: checked })) })] }), _jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx(Label, { htmlFor: "consent-marketing", children: props.marketingLabel }), _jsx(Switch, { id: "consent-marketing", checked: draft.marketing, onCheckedChange: (checked) => setDraft((prev) => ({ ...prev, marketing: checked })) })] })] }), _jsxs(DialogFooter, { children: [_jsx(Button, { type: "button", variant: "secondary", onClick: () => save({ analytics: true, marketing: true }), children: props.acceptAllLabel }), _jsx(Button, { type: "button", onClick: () => save(draft), children: props.saveLabel })] })] }) }));
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/consent/banner.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EventMap, Tracker } from "../tracker.js";
|
|
2
|
+
import type { ConsentCategory, ConsentStore } from "./store.js";
|
|
3
|
+
/** Drops tracker calls until the store grants the given category. */
|
|
4
|
+
export declare function createConsentGatedTracker<TEvents extends EventMap = EventMap>(tracker: Tracker<TEvents>, store: ConsentStore, category: ConsentCategory): Tracker<TEvents>;
|
|
5
|
+
export type ConsentLoader = () => void | (() => void);
|
|
6
|
+
/** Runs `load` once when consent for `category` is granted; optional cleanup on revoke. */
|
|
7
|
+
export declare function runConsentGatedLoader(store: ConsentStore, category: ConsentCategory, load: ConsentLoader): () => void;
|
|
8
|
+
//# sourceMappingURL=gated-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gated-tracker.d.ts","sourceRoot":"","sources":["../../src/consent/gated-tracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGhE,qEAAqE;AACrE,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAC3E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC,CAWlB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;AAEtD,2FAA2F;AAC3F,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,aAAa,GAClB,MAAM,IAAI,CAqBZ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { isCategoryGranted } from "./store.js";
|
|
2
|
+
/** Drops tracker calls until the store grants the given category. */
|
|
3
|
+
export function createConsentGatedTracker(tracker, store, category) {
|
|
4
|
+
const allowed = () => isCategoryGranted(store.read(), category);
|
|
5
|
+
return {
|
|
6
|
+
identify: (userId, traits) => {
|
|
7
|
+
if (allowed())
|
|
8
|
+
tracker.identify(userId, traits);
|
|
9
|
+
},
|
|
10
|
+
capture: (event, properties) => {
|
|
11
|
+
if (allowed())
|
|
12
|
+
tracker.capture(event, properties);
|
|
13
|
+
},
|
|
14
|
+
reset: () => tracker.reset(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/** Runs `load` once when consent for `category` is granted; optional cleanup on revoke. */
|
|
18
|
+
export function runConsentGatedLoader(store, category, load) {
|
|
19
|
+
let cleanup;
|
|
20
|
+
let loaded = false;
|
|
21
|
+
const sync = () => {
|
|
22
|
+
const granted = isCategoryGranted(store.read(), category);
|
|
23
|
+
if (granted && !loaded) {
|
|
24
|
+
loaded = true;
|
|
25
|
+
const result = load();
|
|
26
|
+
cleanup = typeof result === "function" ? result : undefined;
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (!granted && loaded) {
|
|
30
|
+
loaded = false;
|
|
31
|
+
cleanup?.();
|
|
32
|
+
cleanup = undefined;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
sync();
|
|
36
|
+
return store.subscribe(sync);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=gated-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gated-tracker.js","sourceRoot":"","sources":["../../src/consent/gated-tracker.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,qEAAqE;AACrE,MAAM,UAAU,yBAAyB,CACvC,OAAyB,EACzB,KAAmB,EACnB,QAAyB;IAEzB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAChE,OAAO;QACL,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;YAC3B,IAAI,OAAO,EAAE;gBAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE;YAC7B,IAAI,OAAO,EAAE;gBAAE,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE;KAC7B,CAAC;AACJ,CAAC;AAID,2FAA2F;AAC3F,MAAM,UAAU,qBAAqB,CACnC,KAAmB,EACnB,QAAyB,EACzB,IAAmB;IAEnB,IAAI,OAAiC,CAAC;IACtC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC;YACtB,OAAO,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;YACvB,MAAM,GAAG,KAAK,CAAC;YACf,OAAO,EAAE,EAAE,CAAC;YACZ,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,EAAE,CAAC;IACP,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createConsentGatedTracker, runConsentGatedLoader, type ConsentLoader, } from "./gated-tracker.js";
|
|
2
|
+
export { CONSENT_CATEGORIES } from "./store.js";
|
|
3
|
+
export { type ConsentCategory, type ConsentPreferences, type ConsentRecord, type ConsentStore, type LocalStorageConsentOptions, createLocalStorageConsentStore, createMemoryConsentStore, isCategoryGranted, } from "./store.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/consent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,0BAA0B,EAC/B,8BAA8B,EAC9B,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createConsentGatedTracker, runConsentGatedLoader, } from "./gated-tracker.js";
|
|
2
|
+
export { CONSENT_CATEGORIES } from "./store.js";
|
|
3
|
+
export { createLocalStorageConsentStore, createMemoryConsentStore, isCategoryGranted, } from "./store.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/consent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAML,8BAA8B,EAC9B,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type ConsentLoader } from "./gated-tracker.js";
|
|
3
|
+
import { type ConsentCategory, type ConsentRecord, type ConsentStore } from "./store.js";
|
|
4
|
+
export interface ConsentProviderProps {
|
|
5
|
+
store: ConsentStore;
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
export declare function ConsentProvider(props: ConsentProviderProps): import("react").JSX.Element;
|
|
9
|
+
export declare function useConsentRecord(): ConsentRecord | null;
|
|
10
|
+
export declare function useConsentCategory(category: ConsentCategory): boolean;
|
|
11
|
+
export interface ConsentGateProps {
|
|
12
|
+
category: ConsentCategory;
|
|
13
|
+
children: ReactNode;
|
|
14
|
+
fallback?: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
export declare function ConsentGate(props: ConsentGateProps): ReactNode;
|
|
17
|
+
export declare function useConsentGatedLoader(category: ConsentCategory, load: ConsentLoader): void;
|
|
18
|
+
export declare function useConsentStoreInstance(): ConsentStore;
|
|
19
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/consent/react.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA0D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/F,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,YAAY,EAElB,MAAM,YAAY,CAAC;AAIpB,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,+BAE1D;AAUD,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAKvD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAGrE;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,aAIlD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAQ1F;AAED,wBAAgB,uBAAuB,IAAI,YAAY,CAEtD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
// Original work by the same author.
|
|
4
|
+
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
5
|
+
import { runConsentGatedLoader } from "./gated-tracker.js";
|
|
6
|
+
import { isCategoryGranted, } from "./store.js";
|
|
7
|
+
const ConsentContext = createContext(null);
|
|
8
|
+
export function ConsentProvider(props) {
|
|
9
|
+
return _jsx(ConsentContext.Provider, { value: props.store, children: props.children });
|
|
10
|
+
}
|
|
11
|
+
function useConsentStore() {
|
|
12
|
+
const store = useContext(ConsentContext);
|
|
13
|
+
if (!store) {
|
|
14
|
+
throw new Error("ConsentProvider is missing above this component.");
|
|
15
|
+
}
|
|
16
|
+
return store;
|
|
17
|
+
}
|
|
18
|
+
export function useConsentRecord() {
|
|
19
|
+
const store = useConsentStore();
|
|
20
|
+
const [record, setRecord] = useState(store.read());
|
|
21
|
+
useEffect(() => store.subscribe(() => setRecord(store.read())), [store]);
|
|
22
|
+
return record;
|
|
23
|
+
}
|
|
24
|
+
export function useConsentCategory(category) {
|
|
25
|
+
const record = useConsentRecord();
|
|
26
|
+
return isCategoryGranted(record, category);
|
|
27
|
+
}
|
|
28
|
+
export function ConsentGate(props) {
|
|
29
|
+
const granted = useConsentCategory(props.category);
|
|
30
|
+
if (!granted)
|
|
31
|
+
return props.fallback ?? null;
|
|
32
|
+
return props.children;
|
|
33
|
+
}
|
|
34
|
+
export function useConsentGatedLoader(category, load) {
|
|
35
|
+
const store = useConsentStore();
|
|
36
|
+
const loadRef = useRef(load);
|
|
37
|
+
loadRef.current = load;
|
|
38
|
+
useEffect(() => runConsentGatedLoader(store, category, () => loadRef.current()), [store, category]);
|
|
39
|
+
}
|
|
40
|
+
export function useConsentStoreInstance() {
|
|
41
|
+
return useConsentStore();
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/consent/react.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,oCAAoC;AACpC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAsB,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAIL,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,MAAM,cAAc,GAAG,aAAa,CAAsB,IAAI,CAAC,CAAC;AAOhE,MAAM,UAAU,eAAe,CAAC,KAA2B;IACzD,OAAO,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,KAAK,CAAC,QAAQ,GAA2B,CAAC;AACjG,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,SAAS,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,OAAO,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAQD,MAAM,UAAU,WAAW,CAAC,KAAuB;IACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAyB,EAAE,IAAmB;IAClF,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,SAAS,CACP,GAAG,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EACrE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAClB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare const CONSENT_CATEGORIES: readonly ["analytics", "marketing"];
|
|
2
|
+
export type ConsentCategory = (typeof CONSENT_CATEGORIES)[number];
|
|
3
|
+
export interface ConsentPreferences {
|
|
4
|
+
analytics: boolean;
|
|
5
|
+
marketing: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ConsentRecord extends ConsentPreferences {
|
|
8
|
+
updatedAt: number;
|
|
9
|
+
}
|
|
10
|
+
export interface ConsentStore {
|
|
11
|
+
read(): ConsentRecord | null;
|
|
12
|
+
write(preferences: ConsentPreferences): void;
|
|
13
|
+
subscribe(listener: () => void): () => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function isCategoryGranted(record: ConsentRecord | null, category: ConsentCategory): boolean;
|
|
16
|
+
export declare function createMemoryConsentStore(initial?: ConsentRecord | null): ConsentStore;
|
|
17
|
+
export interface LocalStorageConsentOptions {
|
|
18
|
+
key: string;
|
|
19
|
+
storage?: Pick<Storage, "getItem" | "setItem">;
|
|
20
|
+
}
|
|
21
|
+
export declare function createLocalStorageConsentStore(options: LocalStorageConsentOptions): ConsentStore;
|
|
22
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/consent/store.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,qCAAsC,CAAC;AAEtE,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,aAAa,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC7C,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAGlG;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,aAAa,GAAG,IAAW,GAAG,YAAY,CAc3F;AAED,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAC,CAAC;CAChD;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,0BAA0B,GAAG,YAAY,CA0BhG"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
import { tryCatch } from "@zedtech/zedkit-core";
|
|
3
|
+
export const CONSENT_CATEGORIES = ["analytics", "marketing"];
|
|
4
|
+
export function isCategoryGranted(record, category) {
|
|
5
|
+
if (record === null)
|
|
6
|
+
return false;
|
|
7
|
+
return record[category];
|
|
8
|
+
}
|
|
9
|
+
export function createMemoryConsentStore(initial = null) {
|
|
10
|
+
let current = initial;
|
|
11
|
+
const listeners = new Set();
|
|
12
|
+
return {
|
|
13
|
+
read: () => current,
|
|
14
|
+
write: (preferences) => {
|
|
15
|
+
current = { ...preferences, updatedAt: Date.now() };
|
|
16
|
+
listeners.forEach((listener) => listener());
|
|
17
|
+
},
|
|
18
|
+
subscribe: (listener) => {
|
|
19
|
+
listeners.add(listener);
|
|
20
|
+
return () => listeners.delete(listener);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function createLocalStorageConsentStore(options) {
|
|
25
|
+
const storage = options.storage ?? globalThis.localStorage;
|
|
26
|
+
const memory = createMemoryConsentStore(null);
|
|
27
|
+
const hydrate = () => {
|
|
28
|
+
const raw = storage.getItem(options.key);
|
|
29
|
+
if (!raw)
|
|
30
|
+
return;
|
|
31
|
+
const parsed = tryCatch(() => JSON.parse(raw));
|
|
32
|
+
if (!parsed.ok)
|
|
33
|
+
return;
|
|
34
|
+
const value = parsed.value;
|
|
35
|
+
if (typeof value.analytics === "boolean" && typeof value.marketing === "boolean") {
|
|
36
|
+
memory.write({ analytics: value.analytics, marketing: value.marketing });
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
hydrate();
|
|
40
|
+
return {
|
|
41
|
+
read: () => memory.read(),
|
|
42
|
+
write: (preferences) => {
|
|
43
|
+
memory.write(preferences);
|
|
44
|
+
const record = memory.read();
|
|
45
|
+
if (record)
|
|
46
|
+
storage.setItem(options.key, JSON.stringify(record));
|
|
47
|
+
},
|
|
48
|
+
subscribe: (listener) => memory.subscribe(listener),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/consent/store.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAU,CAAC;AAmBtE,MAAM,UAAU,iBAAiB,CAAC,MAA4B,EAAE,QAAyB;IACvF,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAgC,IAAI;IAC3E,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO;QACnB,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE;YACrB,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACpD,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9C,CAAC;QACD,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;KACF,CAAC;AACJ,CAAC;AAOD,MAAM,UAAU,8BAA8B,CAAC,OAAmC;IAChF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,YAAY,CAAC;IAC3D,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjF,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,EAAE,CAAC;IAEV,OAAO;QACL,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE;YACrB,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,MAAM;gBAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;KACpD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { ConsentBanner, type ConsentBannerProps } from "./consent/banner.js";
|
|
2
|
+
export { ConsentGate, ConsentProvider, type ConsentGateProps, type ConsentProviderProps, useConsentCategory, useConsentGatedLoader, useConsentRecord, useConsentStoreInstance, } from "./consent/react.js";
|
|
3
|
+
//# sourceMappingURL=consent-react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-react.d.ts","sourceRoot":"","sources":["../src/consent-react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,WAAW,EACX,eAAe,EACf,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consent-react.js","sourceRoot":"","sources":["../src/consent-react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA2B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,WAAW,EACX,eAAe,EAGf,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { type CapturedLog, createConsoleLogger, createMemoryLogger, type LogContext, type LogLevel, type Logger, noopLogger, } from "./logger.js";
|
|
2
|
+
export { createConsoleTracker, createMemoryTracker, createNoopTracker, type EventMap, type Tracker, } from "./tracker.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,QAAQ,EACb,KAAK,OAAO,GACb,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,EACnB,kBAAkB,EAIlB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,GAGlB,MAAM,cAAc,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
export type LogContext = Record<string, unknown> & {
|
|
3
|
+
error?: unknown;
|
|
4
|
+
};
|
|
5
|
+
export interface Logger {
|
|
6
|
+
debug(message: string, context?: LogContext): void;
|
|
7
|
+
info(message: string, context?: LogContext): void;
|
|
8
|
+
warn(message: string, context?: LogContext): void;
|
|
9
|
+
error(message: string, context?: LogContext): void;
|
|
10
|
+
child(bindings: LogContext): Logger;
|
|
11
|
+
}
|
|
12
|
+
export declare const noopLogger: Logger;
|
|
13
|
+
export declare function createConsoleLogger(bindings?: LogContext): Logger;
|
|
14
|
+
export interface CapturedLog {
|
|
15
|
+
level: LogLevel;
|
|
16
|
+
message: string;
|
|
17
|
+
context: LogContext;
|
|
18
|
+
}
|
|
19
|
+
export declare function createMemoryLogger(): {
|
|
20
|
+
logger: Logger;
|
|
21
|
+
entries: CapturedLog[];
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAClD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACnD,KAAK,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;CACrC;AAED,eAAO,MAAM,UAAU,EAAE,MAMxB,CAAC;AASF,wBAAgB,mBAAmB,CAAC,QAAQ,GAAE,UAAe,GAAG,MAAM,CAcrE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,CAAC;CACrB;AAED,wBAAgB,kBAAkB,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE,CAU/E"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
export const noopLogger = {
|
|
3
|
+
debug: () => undefined,
|
|
4
|
+
info: () => undefined,
|
|
5
|
+
warn: () => undefined,
|
|
6
|
+
error: () => undefined,
|
|
7
|
+
child: () => noopLogger,
|
|
8
|
+
};
|
|
9
|
+
const CONSOLE_METHOD_BY_LEVEL = {
|
|
10
|
+
debug: "debug",
|
|
11
|
+
info: "info",
|
|
12
|
+
warn: "warn",
|
|
13
|
+
error: "error",
|
|
14
|
+
};
|
|
15
|
+
export function createConsoleLogger(bindings = {}) {
|
|
16
|
+
const sink = globalThis.console;
|
|
17
|
+
const emit = (level, message, context) => {
|
|
18
|
+
const payload = { ...bindings, ...context };
|
|
19
|
+
const args = Object.keys(payload).length > 0 ? [message, payload] : [message];
|
|
20
|
+
sink[CONSOLE_METHOD_BY_LEVEL[level]](...args);
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
debug: (m, c) => emit("debug", m, c),
|
|
24
|
+
info: (m, c) => emit("info", m, c),
|
|
25
|
+
warn: (m, c) => emit("warn", m, c),
|
|
26
|
+
error: (m, c) => emit("error", m, c),
|
|
27
|
+
child: (extra) => createConsoleLogger({ ...bindings, ...extra }),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function createMemoryLogger() {
|
|
31
|
+
const entries = [];
|
|
32
|
+
const make = (bindings) => ({
|
|
33
|
+
debug: (m, c) => entries.push({ level: "debug", message: m, context: { ...bindings, ...c } }),
|
|
34
|
+
info: (m, c) => entries.push({ level: "info", message: m, context: { ...bindings, ...c } }),
|
|
35
|
+
warn: (m, c) => entries.push({ level: "warn", message: m, context: { ...bindings, ...c } }),
|
|
36
|
+
error: (m, c) => entries.push({ level: "error", message: m, context: { ...bindings, ...c } }),
|
|
37
|
+
child: (extra) => make({ ...bindings, ...extra }),
|
|
38
|
+
});
|
|
39
|
+
return { logger: make({}), entries };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type DestinationStream } from "pino";
|
|
2
|
+
import type { Logger, LogLevel } from "./logger.js";
|
|
3
|
+
export interface PinoLoggerOptions {
|
|
4
|
+
name: string;
|
|
5
|
+
level?: LogLevel;
|
|
6
|
+
stream?: DestinationStream;
|
|
7
|
+
/** Synchronous writes (useful in tests). */
|
|
8
|
+
sync?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Wraps a `pino` instance behind the shared {@link Logger} port. */
|
|
11
|
+
export declare function createPinoLogger(options: PinoLoggerOptions): Logger;
|
|
12
|
+
//# sourceMappingURL=pino-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pino-logger.d.ts","sourceRoot":"","sources":["../src/pino-logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,KAAK,iBAAiB,EAA6B,MAAM,MAAM,CAAC;AAC/E,OAAO,KAAK,EAAc,MAAM,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,4CAA4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAiBD,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAUnE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
import { pino } from "pino";
|
|
3
|
+
function wrap(instance) {
|
|
4
|
+
const split = (context) => {
|
|
5
|
+
if (!context)
|
|
6
|
+
return {};
|
|
7
|
+
const { error, ...rest } = context;
|
|
8
|
+
return error === undefined ? rest : { ...rest, err: error };
|
|
9
|
+
};
|
|
10
|
+
return {
|
|
11
|
+
debug: (message, context) => instance.debug(split(context), message),
|
|
12
|
+
info: (message, context) => instance.info(split(context), message),
|
|
13
|
+
warn: (message, context) => instance.warn(split(context), message),
|
|
14
|
+
error: (message, context) => instance.error(split(context), message),
|
|
15
|
+
child: (bindings) => wrap(instance.child(bindings)),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** Wraps a `pino` instance behind the shared {@link Logger} port. */
|
|
19
|
+
export function createPinoLogger(options) {
|
|
20
|
+
const instance = pino({
|
|
21
|
+
name: options.name,
|
|
22
|
+
level: options.level ?? "info",
|
|
23
|
+
...(options.sync ? { sync: true } : {}),
|
|
24
|
+
}, options.stream);
|
|
25
|
+
return wrap(instance);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=pino-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pino-logger.js","sourceRoot":"","sources":["../src/pino-logger.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,OAAO,EAAE,IAAI,EAAqD,MAAM,MAAM,CAAC;AAW/E,SAAS,IAAI,CAAC,QAAoB;IAChC,MAAM,KAAK,GAAG,CAAC,OAAoB,EAAE,EAAE;QACrC,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;QACnC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAC9D,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QACpE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClE,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAClE,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QACpE,KAAK,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,MAAM,QAAQ,GAAG,IAAI,CACnB;QACE,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM;QAC9B,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,EACD,OAAO,CAAC,MAAM,CACf,CAAC;IACF,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EventMap, Tracker } from "./tracker.js";
|
|
2
|
+
/** Minimal surface of a browser analytics client (for example `posthog-js`). */
|
|
3
|
+
export interface ProductAnalyticsClient {
|
|
4
|
+
identify(distinctId: string, properties?: Record<string, unknown>): void;
|
|
5
|
+
capture(event: string, properties?: Record<string, unknown>): void;
|
|
6
|
+
reset(): void;
|
|
7
|
+
}
|
|
8
|
+
/** Forwards typed events to a product-analytics SDK at the composition root. */
|
|
9
|
+
export declare function createProductAnalyticsTracker<TEvents extends EventMap = EventMap>(client: ProductAnalyticsClient): Tracker<TEvents>;
|
|
10
|
+
//# sourceMappingURL=posthog-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posthog-tracker.d.ts","sourceRoot":"","sources":["../src/posthog-tracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEtD,gFAAgF;AAChF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACnE,KAAK,IAAI,IAAI,CAAC;CACf;AAED,gFAAgF;AAChF,wBAAgB,6BAA6B,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,EAC/E,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAMlB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Forwards typed events to a product-analytics SDK at the composition root. */
|
|
2
|
+
export function createProductAnalyticsTracker(client) {
|
|
3
|
+
return {
|
|
4
|
+
identify: (userId, traits) => client.identify(userId, traits),
|
|
5
|
+
capture: (event, properties) => client.capture(event, properties),
|
|
6
|
+
reset: () => client.reset(),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=posthog-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posthog-tracker.js","sourceRoot":"","sources":["../src/posthog-tracker.ts"],"names":[],"mappings":"AAUA,gFAAgF;AAChF,MAAM,UAAU,6BAA6B,CAC3C,MAA8B;IAE9B,OAAO;QACL,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAC7D,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC;QACjE,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;KAC5B,CAAC;AACJ,CAAC"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Logger } from "./logger.js";
|
|
2
|
+
import type { ObservabilityProviderProps } from "./react.types.js";
|
|
3
|
+
import { type EventMap, type Tracker } from "./tracker.js";
|
|
4
|
+
export declare function ObservabilityProvider(props: ObservabilityProviderProps): import("react").JSX.Element;
|
|
5
|
+
export declare function useLogger(): Logger;
|
|
6
|
+
export declare function useTracker<TEvents extends EventMap = EventMap>(): Tracker<TEvents>;
|
|
7
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAuB,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAA6B,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAqB,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAU9E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,+BAStE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,UAAU,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAElF"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
// Original work by the same author.
|
|
4
|
+
import { createContext, useContext, useMemo } from "react";
|
|
5
|
+
import { createConsoleLogger } from "./logger.js";
|
|
6
|
+
import { createNoopTracker } from "./tracker.js";
|
|
7
|
+
const defaultLogger = createConsoleLogger();
|
|
8
|
+
const defaultTracker = createNoopTracker();
|
|
9
|
+
const ObservabilityContext = createContext({
|
|
10
|
+
logger: defaultLogger,
|
|
11
|
+
tracker: defaultTracker,
|
|
12
|
+
});
|
|
13
|
+
export function ObservabilityProvider(props) {
|
|
14
|
+
const value = useMemo(() => ({
|
|
15
|
+
logger: props.logger ?? defaultLogger,
|
|
16
|
+
tracker: props.tracker ?? defaultTracker,
|
|
17
|
+
}), [props.logger, props.tracker]);
|
|
18
|
+
return _jsx(ObservabilityContext.Provider, { value: value, children: props.children });
|
|
19
|
+
}
|
|
20
|
+
export function useLogger() {
|
|
21
|
+
return useContext(ObservabilityContext).logger;
|
|
22
|
+
}
|
|
23
|
+
export function useTracker() {
|
|
24
|
+
return useContext(ObservabilityContext).tracker;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,oCAAoC;AACpC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAe,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,iBAAiB,EAA+B,MAAM,cAAc,CAAC;AAE9E,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;AAC5C,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;AAE3C,MAAM,oBAAoB,GAAG,aAAa,CAA4B;IACpE,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,cAAc;CACxB,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,KAAiC;IACrE,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,aAAa;QACrC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,cAAc;KACzC,CAAC,EACF,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAC9B,CAAC;IACF,OAAO,KAAC,oBAAoB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,KAAK,CAAC,QAAQ,GAAiC,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,UAAU,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,UAAU,CAAC,oBAAoB,CAAC,CAAC,OAA2B,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { Logger } from "./logger.js";
|
|
3
|
+
import type { Tracker } from "./tracker.js";
|
|
4
|
+
export interface ObservabilityContextValue {
|
|
5
|
+
logger: Logger;
|
|
6
|
+
tracker: Tracker;
|
|
7
|
+
}
|
|
8
|
+
export interface ObservabilityProviderProps {
|
|
9
|
+
logger?: Logger;
|
|
10
|
+
tracker?: Tracker;
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=react.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.types.d.ts","sourceRoot":"","sources":["../src/react.types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.types.js","sourceRoot":"","sources":["../src/react.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type EventMap = Record<string, Record<string, unknown>>;
|
|
2
|
+
export interface Tracker<TEvents extends EventMap = EventMap> {
|
|
3
|
+
identify(userId: string, traits?: Record<string, unknown>): void;
|
|
4
|
+
capture<TName extends keyof TEvents & string>(event: TName, properties: TEvents[TName]): void;
|
|
5
|
+
reset(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createNoopTracker<TEvents extends EventMap = EventMap>(): Tracker<TEvents>;
|
|
8
|
+
export declare function createConsoleTracker<TEvents extends EventMap = EventMap>(): Tracker<TEvents>;
|
|
9
|
+
export declare function createMemoryTracker<TEvents extends EventMap = EventMap>(): {
|
|
10
|
+
tracker: Tracker<TEvents>;
|
|
11
|
+
captured: Array<{
|
|
12
|
+
event: string;
|
|
13
|
+
properties: Record<string, unknown>;
|
|
14
|
+
}>;
|
|
15
|
+
identified: Array<{
|
|
16
|
+
userId: string;
|
|
17
|
+
traits?: Record<string, unknown>;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/D,MAAM,WAAW,OAAO,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ;IAC1D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACjE,OAAO,CAAC,KAAK,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IAC9F,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,iBAAiB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAEzF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAO5F;AAED,wBAAgB,mBAAmB,CAAC,OAAO,SAAS,QAAQ,GAAG,QAAQ,KAAK;IAC1E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IACxE,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;CACzE,CAkBA"}
|
package/dist/tracker.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Original work by the same author.
|
|
2
|
+
export function createNoopTracker() {
|
|
3
|
+
return { identify: () => undefined, capture: () => undefined, reset: () => undefined };
|
|
4
|
+
}
|
|
5
|
+
export function createConsoleTracker() {
|
|
6
|
+
const sink = globalThis.console;
|
|
7
|
+
return {
|
|
8
|
+
identify: (userId, traits) => sink.info("[tracker] identify", userId, traits ?? {}),
|
|
9
|
+
capture: (event, properties) => sink.info("[tracker] capture", event, properties),
|
|
10
|
+
reset: () => sink.info("[tracker] reset"),
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function createMemoryTracker() {
|
|
14
|
+
const captured = [];
|
|
15
|
+
const identified = [];
|
|
16
|
+
return {
|
|
17
|
+
captured,
|
|
18
|
+
identified,
|
|
19
|
+
tracker: {
|
|
20
|
+
identify: (userId, traits) => {
|
|
21
|
+
if (traits === undefined)
|
|
22
|
+
identified.push({ userId });
|
|
23
|
+
else
|
|
24
|
+
identified.push({ userId, traits });
|
|
25
|
+
},
|
|
26
|
+
capture: (event, properties) => void captured.push({ event, properties }),
|
|
27
|
+
reset: () => {
|
|
28
|
+
captured.length = 0;
|
|
29
|
+
identified.length = 0;
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAUpC,MAAM,UAAU,iBAAiB;IAC/B,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC;IAChC,OAAO;QACL,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC;QACnF,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK,EAAE,UAAU,CAAC;QACjF,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IAKjC,MAAM,QAAQ,GAAkE,EAAE,CAAC;IACnF,MAAM,UAAU,GAAgE,EAAE,CAAC;IACnF,OAAO;QACL,QAAQ;QACR,UAAU;QACV,OAAO,EAAE;YACP,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;gBAC3B,IAAI,MAAM,KAAK,SAAS;oBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;;oBACjD,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;YACzE,KAAK,EAAE,GAAG,EAAE;gBACV,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACpB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YACxB,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,113 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zedtech/zedkit-observability",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public",
|
|
6
|
+
"registry": "https://registry.npmjs.org/"
|
|
7
|
+
},
|
|
8
|
+
"description": "Logger and Tracker ports with swappable adapters and React hooks — wire backends at the composition root, not inside features. Original work by the same author.",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"logging",
|
|
11
|
+
"analytics",
|
|
12
|
+
"observability",
|
|
13
|
+
"react",
|
|
14
|
+
"typescript",
|
|
15
|
+
"ports",
|
|
16
|
+
"pino",
|
|
17
|
+
"product-analytics"
|
|
18
|
+
],
|
|
19
|
+
"homepage": "https://github.com/zedtech-fr/zedkit/tree/main/packages/observability",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/zedtech-fr/zedkit/issues"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/zedtech-fr/zedkit",
|
|
27
|
+
"directory": "packages/observability"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"imports": {
|
|
32
|
+
"#*": "./src/*"
|
|
33
|
+
},
|
|
34
|
+
"main": "./dist/index.js",
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"import": "./dist/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./react": {
|
|
42
|
+
"types": "./dist/react.d.ts",
|
|
43
|
+
"import": "./dist/react.js"
|
|
44
|
+
},
|
|
45
|
+
"./pino": {
|
|
46
|
+
"types": "./dist/pino-logger.d.ts",
|
|
47
|
+
"import": "./dist/pino-logger.js"
|
|
48
|
+
},
|
|
49
|
+
"./posthog": {
|
|
50
|
+
"types": "./dist/posthog-tracker.d.ts",
|
|
51
|
+
"import": "./dist/posthog-tracker.js"
|
|
52
|
+
},
|
|
53
|
+
"./consent": {
|
|
54
|
+
"types": "./dist/consent/index.d.ts",
|
|
55
|
+
"import": "./dist/consent/index.js"
|
|
56
|
+
},
|
|
57
|
+
"./consent/react": {
|
|
58
|
+
"types": "./dist/consent-react.d.ts",
|
|
59
|
+
"import": "./dist/consent-react.js"
|
|
60
|
+
},
|
|
61
|
+
"./package.json": "./package.json"
|
|
62
|
+
},
|
|
63
|
+
"files": [
|
|
64
|
+
"dist"
|
|
65
|
+
],
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@zedtech/zedkit-core": "0.2.0"
|
|
68
|
+
},
|
|
69
|
+
"peerDependencies": {
|
|
70
|
+
"pino": "10.4.0",
|
|
71
|
+
"posthog-js": "1.440.0",
|
|
72
|
+
"react": "19.3.1",
|
|
73
|
+
"react-dom": "19.3.1",
|
|
74
|
+
"@zedtech/zedkit-ui": "0.7.0"
|
|
75
|
+
},
|
|
76
|
+
"peerDependenciesMeta": {
|
|
77
|
+
"pino": {
|
|
78
|
+
"optional": true
|
|
79
|
+
},
|
|
80
|
+
"posthog-js": {
|
|
81
|
+
"optional": true
|
|
82
|
+
},
|
|
83
|
+
"@zedtech/zedkit-ui": {
|
|
84
|
+
"optional": true
|
|
85
|
+
},
|
|
86
|
+
"react": {
|
|
87
|
+
"optional": true
|
|
88
|
+
},
|
|
89
|
+
"react-dom": {
|
|
90
|
+
"optional": true
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"devDependencies": {
|
|
94
|
+
"@testing-library/react": "16.3.3",
|
|
95
|
+
"@types/react": "19.3.0",
|
|
96
|
+
"@types/react-dom": "19.3.0",
|
|
97
|
+
"jsdom": "30.1.3",
|
|
98
|
+
"pino": "10.4.0",
|
|
99
|
+
"posthog-js": "1.440.0",
|
|
100
|
+
"react": "19.3.1",
|
|
101
|
+
"react-dom": "19.3.1",
|
|
102
|
+
"typescript": "5.9.3",
|
|
103
|
+
"vitest": "5.0.5",
|
|
104
|
+
"@zedtech/zedkit-ui": "0.7.0",
|
|
105
|
+
"@zedtech/zedkit-quality": "0.4.0"
|
|
106
|
+
},
|
|
107
|
+
"scripts": {
|
|
108
|
+
"build": "tsc -p tsconfig.json",
|
|
109
|
+
"test": "vitest run",
|
|
110
|
+
"typecheck": "tsc --noEmit -p tsconfig.tests.json",
|
|
111
|
+
"lint": "eslint src tests"
|
|
112
|
+
}
|
|
6
113
|
}
|