@adhese/sdk-react 0.7.0 → 0.8.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/README.md +96 -41
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,57 +1,112 @@
|
|
|
1
|
-
# Adhese SDK
|
|
1
|
+
# Adhese React SDK
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
This monorepo contains the Adhese SDK for web. The project uses Turborepo to manage the monorepo. Make sure to run
|
|
5
|
-
everything from the root of the project.
|
|
3
|
+
For React developers, we provide a React SDK that allows you to easily integrate our services into your React application.
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
npm i
|
|
11
|
-
```
|
|
12
|
-
> Only use `npm` to install dependencies. `pnpm` and `yarn` will create their own lockfiles and will cause issues when
|
|
13
|
-
> maintaining the project.
|
|
5
|
+
> The React SDK is built on top of the [Adhese JavaScript SDK](https:/adhese.github.com/sdk_typescript/index.html) and
|
|
6
|
+
> doesn't need the Adhese JavaScript SDK to be installed separately.
|
|
14
7
|
|
|
15
|
-
|
|
16
|
-
Start the dev server:
|
|
8
|
+
## Installation
|
|
17
9
|
```bash
|
|
18
|
-
npm
|
|
10
|
+
npm install @adhese/sdk-react
|
|
19
11
|
```
|
|
20
12
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
`
|
|
13
|
+
## `AdheseProvider`
|
|
14
|
+
The `AdheseProvider` component is a context provider that makes the Adhese instance available to all child components.
|
|
15
|
+
It should be placed at the root of your application. It accepts an `options` prop that is passed to the `createAdhese`
|
|
16
|
+
function. When the `options` prop changes, the Adhese instance is recreated. This provider replaces the `createAdhese`
|
|
17
|
+
function.
|
|
24
18
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
> The `AdheseProvider` component is a wrapper around the `createAdhese` function. It is required to use the
|
|
20
|
+
> `AdheseProvider` if you want to use the `useAdhese` or `useAdheseSlot` hooks.
|
|
21
|
+
|
|
22
|
+
```jsx
|
|
23
|
+
import { AdheseProvider } from '@adhese/sdk-react';
|
|
24
|
+
|
|
25
|
+
function Devtools() {
|
|
26
|
+
return (
|
|
27
|
+
<AdheseProvider options={{
|
|
28
|
+
account: 'your-account-id',
|
|
29
|
+
}}>
|
|
30
|
+
<YourApp />
|
|
31
|
+
</AdheseProvider>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
29
34
|
```
|
|
30
35
|
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
## `useAdhese`
|
|
37
|
+
The `useAdhese` hook returns the Adhese instance that is created by the `AdheseProvider`. It can be used to access the Adhese instance in any child component.
|
|
33
38
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
```jsx
|
|
40
|
+
import { useAdhese } from '@adhese/sdk-react';
|
|
41
|
+
|
|
42
|
+
function YourComponent() {
|
|
43
|
+
const adhese = useAdhese();
|
|
44
|
+
// Use the adhese instance
|
|
45
|
+
}
|
|
38
46
|
```
|
|
39
47
|
|
|
40
|
-
|
|
48
|
+
## `useAdheseSlot`
|
|
49
|
+
The `useAdheseSlot` hook returns a slot object for a given slot name. Use the to create a slot in your component.
|
|
41
50
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
51
|
+
It accepts the following arguments:
|
|
52
|
+
- `elementRef`: A ref to the element that the slot should be attached to.
|
|
53
|
+
- `options`: An object with options for the slot. This object is passed to the `adhese.addSlot` function.
|
|
54
|
+
|
|
55
|
+
When your component is unmounted, the slot is automatically removed from the Adhese instance.
|
|
56
|
+
|
|
57
|
+
```jsx
|
|
58
|
+
import { useAdheseSlot } from '@adhese/sdk-react';
|
|
59
|
+
|
|
60
|
+
function YourComponent() {
|
|
61
|
+
const elementRef = useRef(null);
|
|
62
|
+
|
|
63
|
+
const slot = useAdheseSlot(elementRef, {
|
|
64
|
+
format: 'your-format',
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
return (
|
|
68
|
+
<div ref={elementRef} />
|
|
69
|
+
);
|
|
70
|
+
}
|
|
46
71
|
```
|
|
47
72
|
|
|
48
|
-
|
|
73
|
+
## `useAdheseSlot` with `onBeforeRender`
|
|
74
|
+
Like described in the
|
|
75
|
+
[slots documentation](https:/adhese.github.com/sdk_typescript/slots.html#hijacking-the-rendering-process), you can use
|
|
76
|
+
the `onBeforeRender` callback to intercept the to be rendered ad. The example there is written in vanilla JavaScript. To
|
|
77
|
+
use`jsx` you can use the React `renderToStaticMarkup` function to create static HTML while still having the benefits of
|
|
78
|
+
JSX.
|
|
79
|
+
|
|
80
|
+
```jsx
|
|
81
|
+
import { renderToStaticMarkup } from 'react-dom/server';
|
|
82
|
+
import { useAdheseSlot } from '@adhese/sdk-react';
|
|
49
83
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
|
|
84
|
+
function YourComponent() {
|
|
85
|
+
const adhese = useAdhese();
|
|
86
|
+
const elementRef = useRef(null);
|
|
87
|
+
|
|
88
|
+
const slot = useAdheseSlot(elementRef, {
|
|
89
|
+
format: 'your-format',
|
|
90
|
+
onBeforeRender: (ad) => {
|
|
91
|
+
if (typeof ad.tag !== 'object') {
|
|
92
|
+
// If the tag is not an object, return the ad as is
|
|
93
|
+
return ad;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
...ad,
|
|
98
|
+
tag: renderToStaticMarkup((
|
|
99
|
+
<div>
|
|
100
|
+
<h1>{ad.tag.title}</h1>
|
|
101
|
+
<p>{ad.tag.description}</p>
|
|
102
|
+
</div>
|
|
103
|
+
)),
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<div ref={slot.elementRef} />
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
```
|
package/dist/index.cjs
CHANGED
|
@@ -26,7 +26,7 @@ function useAdheseSlot(elementRef, options) {
|
|
|
26
26
|
useDeepCompareEffect(() => {
|
|
27
27
|
let intermediate;
|
|
28
28
|
if (adhese && elementRef.current) {
|
|
29
|
-
intermediate = adhese.
|
|
29
|
+
intermediate = adhese.addSlot(
|
|
30
30
|
{
|
|
31
31
|
...options,
|
|
32
32
|
containingElement: elementRef.current
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/adheseContext.tsx","../src/useAdheseSlot.ts"],"sourcesContent":["'use client';\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { type Adhese, type AdheseOptions, createAdhese } from '@adhese/sdk';\n\nconst adheseContext = createContext<Adhese | undefined>(undefined);\n\n/**\n * Provider to create an Adhese instance with the given options. Via the `useAdhese` hook, the Adhese instance can be\n * used in all child components.\n * @param children The children to render\n * @param options The options to create the Adhese instance with. When the options change, the Adhese instance will be recreated.\n * @constructor\n */\n// eslint-disable-next-line ts/naming-convention\nexport function AdheseProvider({ children, options }: PropsWithChildren<{ options: AdheseOptions }>): ReactElement {\n const [adhese, setAdhese] = useState<Adhese | undefined>(undefined);\n\n useEffect(() => {\n const instance = createAdhese(options);\n setAdhese(instance);\n\n return () => {\n instance.dispose();\n };\n }, [options]);\n\n return (\n <adheseContext.Provider value={adhese}>\n {children}\n </adheseContext.Provider>\n );\n}\n\n/**\n * Hook to get the Adhese instance from the nearest `AdheseProvider`. When the Adhese instance is not available yet, `null`\n */\nexport function useAdhese(): Adhese | undefined {\n return useContext(adheseContext);\n}\n","import { type RefObject, useState } from 'react';\nimport type { AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport useDeepCompareEffect from 'use-deep-compare-effect';\nimport { omit } from 'remeda';\nimport { useAdhese } from './adheseContext';\n\n/**\n * Hook to create an Adhese slot. The slot will be disposed when the component is unmounted. The slot will be created\n * when the containing element is available and the Adhese instance is available.\n * @param elementRef The ref to the containing element\n * @param options The options to create the slot\n */\nexport function useAdheseSlot(elementRef: RefObject<HTMLElement>, options: Omit<AdheseSlotOptions, 'containingElement' | 'context'>): AdheseSlot | null {\n const [slot, setSlot] = useState<AdheseSlot | null>(null);\n const adhese = useAdhese();\n\n useDeepCompareEffect(() => {\n let intermediate: AdheseSlot | undefined;\n\n if (adhese && elementRef.current) {\n intermediate = adhese.
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/adheseContext.tsx","../src/useAdheseSlot.ts"],"sourcesContent":["'use client';\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { type Adhese, type AdheseOptions, createAdhese } from '@adhese/sdk';\n\nconst adheseContext = createContext<Adhese | undefined>(undefined);\n\n/**\n * Provider to create an Adhese instance with the given options. Via the `useAdhese` hook, the Adhese instance can be\n * used in all child components.\n * @param children The children to render\n * @param options The options to create the Adhese instance with. When the options change, the Adhese instance will be recreated.\n * @constructor\n */\n// eslint-disable-next-line ts/naming-convention\nexport function AdheseProvider({ children, options }: PropsWithChildren<{ options: AdheseOptions }>): ReactElement {\n const [adhese, setAdhese] = useState<Adhese | undefined>(undefined);\n\n useEffect(() => {\n const instance = createAdhese(options);\n setAdhese(instance);\n\n return () => {\n instance.dispose();\n };\n }, [options]);\n\n return (\n <adheseContext.Provider value={adhese}>\n {children}\n </adheseContext.Provider>\n );\n}\n\n/**\n * Hook to get the Adhese instance from the nearest `AdheseProvider`. When the Adhese instance is not available yet, `null`\n */\nexport function useAdhese(): Adhese | undefined {\n return useContext(adheseContext);\n}\n","import { type RefObject, useState } from 'react';\nimport type { AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport useDeepCompareEffect from 'use-deep-compare-effect';\nimport { omit } from 'remeda';\nimport { useAdhese } from './adheseContext';\n\n/**\n * Hook to create an Adhese slot. The slot will be disposed when the component is unmounted. The slot will be created\n * when the containing element is available and the Adhese instance is available.\n * @param elementRef The ref to the containing element\n * @param options The options to create the slot\n */\nexport function useAdheseSlot(elementRef: RefObject<HTMLElement>, options: Omit<AdheseSlotOptions, 'containingElement' | 'context'>): AdheseSlot | null {\n const [slot, setSlot] = useState<AdheseSlot | null>(null);\n const adhese = useAdhese();\n\n useDeepCompareEffect(() => {\n let intermediate: AdheseSlot | undefined;\n\n if (adhese && elementRef.current) {\n intermediate = adhese.addSlot(\n {\n ...options,\n containingElement: elementRef.current,\n },\n );\n\n setSlot(intermediate);\n }\n\n return () => {\n intermediate?.dispose();\n };\n }, [adhese, omit(options, Object.entries(options).filter(([, value]) => typeof value === 'function').map(([key]) => key as keyof typeof options)), elementRef.current]);\n\n return slot;\n}\n"],"names":["createContext","useState","useEffect","createAdhese","useContext","omit"],"mappings":";;;;;;;AAYA,MAAM,gBAAgBA,MAAAA,cAAkC,MAAS;AAU1D,SAAS,eAAe,EAAE,UAAU,WAAwE;AACjH,QAAM,CAAC,QAAQ,SAAS,IAAIC,MAAAA,SAA6B,MAAS;AAElEC,QAAAA,UAAU,MAAM;AACR,UAAA,WAAWC,iBAAa,OAAO;AACrC,cAAU,QAAQ;AAElB,WAAO,MAAM;AACX,eAAS,QAAQ;AAAA,IAAA;AAAA,EACnB,GACC,CAAC,OAAO,CAAC;AAEZ,wCACG,cAAc,UAAd,EAAuB,OAAO,QAC5B,SACH,CAAA;AAEJ;AAKO,SAAS,YAAgC;AAC9C,SAAOC,MAAAA,WAAW,aAAa;AACjC;AClCgB,SAAA,cAAc,YAAoC,SAAsF;AACtJ,QAAM,CAAC,MAAM,OAAO,IAAIH,eAA4B,IAAI;AACxD,QAAM,SAAS;AAEf,uBAAqB,MAAM;AACrB,QAAA;AAEA,QAAA,UAAU,WAAW,SAAS;AAChC,qBAAe,OAAO;AAAA,QACpB;AAAA,UACE,GAAG;AAAA,UACH,mBAAmB,WAAW;AAAA,QAChC;AAAA,MAAA;AAGF,cAAQ,YAAY;AAAA,IACtB;AAEA,WAAO,MAAM;AACX,mDAAc;AAAA,IAAQ;AAAA,EAEvB,GAAA,CAAC,QAAQI,YAAK,SAAS,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM,OAAO,UAAU,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,GAA2B,CAAC,GAAG,WAAW,OAAO,CAAC;AAE/J,SAAA;AACT;;;;"}
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ function useAdheseSlot(elementRef, options) {
|
|
|
24
24
|
useDeepCompareEffect(() => {
|
|
25
25
|
let intermediate;
|
|
26
26
|
if (adhese && elementRef.current) {
|
|
27
|
-
intermediate = adhese.
|
|
27
|
+
intermediate = adhese.addSlot(
|
|
28
28
|
{
|
|
29
29
|
...options,
|
|
30
30
|
containingElement: elementRef.current
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/adheseContext.tsx","../src/useAdheseSlot.ts"],"sourcesContent":["'use client';\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { type Adhese, type AdheseOptions, createAdhese } from '@adhese/sdk';\n\nconst adheseContext = createContext<Adhese | undefined>(undefined);\n\n/**\n * Provider to create an Adhese instance with the given options. Via the `useAdhese` hook, the Adhese instance can be\n * used in all child components.\n * @param children The children to render\n * @param options The options to create the Adhese instance with. When the options change, the Adhese instance will be recreated.\n * @constructor\n */\n// eslint-disable-next-line ts/naming-convention\nexport function AdheseProvider({ children, options }: PropsWithChildren<{ options: AdheseOptions }>): ReactElement {\n const [adhese, setAdhese] = useState<Adhese | undefined>(undefined);\n\n useEffect(() => {\n const instance = createAdhese(options);\n setAdhese(instance);\n\n return () => {\n instance.dispose();\n };\n }, [options]);\n\n return (\n <adheseContext.Provider value={adhese}>\n {children}\n </adheseContext.Provider>\n );\n}\n\n/**\n * Hook to get the Adhese instance from the nearest `AdheseProvider`. When the Adhese instance is not available yet, `null`\n */\nexport function useAdhese(): Adhese | undefined {\n return useContext(adheseContext);\n}\n","import { type RefObject, useState } from 'react';\nimport type { AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport useDeepCompareEffect from 'use-deep-compare-effect';\nimport { omit } from 'remeda';\nimport { useAdhese } from './adheseContext';\n\n/**\n * Hook to create an Adhese slot. The slot will be disposed when the component is unmounted. The slot will be created\n * when the containing element is available and the Adhese instance is available.\n * @param elementRef The ref to the containing element\n * @param options The options to create the slot\n */\nexport function useAdheseSlot(elementRef: RefObject<HTMLElement>, options: Omit<AdheseSlotOptions, 'containingElement' | 'context'>): AdheseSlot | null {\n const [slot, setSlot] = useState<AdheseSlot | null>(null);\n const adhese = useAdhese();\n\n useDeepCompareEffect(() => {\n let intermediate: AdheseSlot | undefined;\n\n if (adhese && elementRef.current) {\n intermediate = adhese.
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/adheseContext.tsx","../src/useAdheseSlot.ts"],"sourcesContent":["'use client';\n\nimport {\n type PropsWithChildren,\n type ReactElement,\n createContext,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport { type Adhese, type AdheseOptions, createAdhese } from '@adhese/sdk';\n\nconst adheseContext = createContext<Adhese | undefined>(undefined);\n\n/**\n * Provider to create an Adhese instance with the given options. Via the `useAdhese` hook, the Adhese instance can be\n * used in all child components.\n * @param children The children to render\n * @param options The options to create the Adhese instance with. When the options change, the Adhese instance will be recreated.\n * @constructor\n */\n// eslint-disable-next-line ts/naming-convention\nexport function AdheseProvider({ children, options }: PropsWithChildren<{ options: AdheseOptions }>): ReactElement {\n const [adhese, setAdhese] = useState<Adhese | undefined>(undefined);\n\n useEffect(() => {\n const instance = createAdhese(options);\n setAdhese(instance);\n\n return () => {\n instance.dispose();\n };\n }, [options]);\n\n return (\n <adheseContext.Provider value={adhese}>\n {children}\n </adheseContext.Provider>\n );\n}\n\n/**\n * Hook to get the Adhese instance from the nearest `AdheseProvider`. When the Adhese instance is not available yet, `null`\n */\nexport function useAdhese(): Adhese | undefined {\n return useContext(adheseContext);\n}\n","import { type RefObject, useState } from 'react';\nimport type { AdheseSlot, AdheseSlotOptions } from '@adhese/sdk';\nimport useDeepCompareEffect from 'use-deep-compare-effect';\nimport { omit } from 'remeda';\nimport { useAdhese } from './adheseContext';\n\n/**\n * Hook to create an Adhese slot. The slot will be disposed when the component is unmounted. The slot will be created\n * when the containing element is available and the Adhese instance is available.\n * @param elementRef The ref to the containing element\n * @param options The options to create the slot\n */\nexport function useAdheseSlot(elementRef: RefObject<HTMLElement>, options: Omit<AdheseSlotOptions, 'containingElement' | 'context'>): AdheseSlot | null {\n const [slot, setSlot] = useState<AdheseSlot | null>(null);\n const adhese = useAdhese();\n\n useDeepCompareEffect(() => {\n let intermediate: AdheseSlot | undefined;\n\n if (adhese && elementRef.current) {\n intermediate = adhese.addSlot(\n {\n ...options,\n containingElement: elementRef.current,\n },\n );\n\n setSlot(intermediate);\n }\n\n return () => {\n intermediate?.dispose();\n };\n }, [adhese, omit(options, Object.entries(options).filter(([, value]) => typeof value === 'function').map(([key]) => key as keyof typeof options)), elementRef.current]);\n\n return slot;\n}\n"],"names":[],"mappings":";;;;;AAYA,MAAM,gBAAgB,cAAkC,MAAS;AAU1D,SAAS,eAAe,EAAE,UAAU,WAAwE;AACjH,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA6B,MAAS;AAElE,YAAU,MAAM;AACR,UAAA,WAAW,aAAa,OAAO;AACrC,cAAU,QAAQ;AAElB,WAAO,MAAM;AACX,eAAS,QAAQ;AAAA,IAAA;AAAA,EACnB,GACC,CAAC,OAAO,CAAC;AAEZ,6BACG,cAAc,UAAd,EAAuB,OAAO,QAC5B,SACH,CAAA;AAEJ;AAKO,SAAS,YAAgC;AAC9C,SAAO,WAAW,aAAa;AACjC;AClCgB,SAAA,cAAc,YAAoC,SAAsF;AACtJ,QAAM,CAAC,MAAM,OAAO,IAAI,SAA4B,IAAI;AACxD,QAAM,SAAS;AAEf,uBAAqB,MAAM;AACrB,QAAA;AAEA,QAAA,UAAU,WAAW,SAAS;AAChC,qBAAe,OAAO;AAAA,QACpB;AAAA,UACE,GAAG;AAAA,UACH,mBAAmB,WAAW;AAAA,QAChC;AAAA,MAAA;AAGF,cAAQ,YAAY;AAAA,IACtB;AAEA,WAAO,MAAM;AACX,mDAAc;AAAA,IAAQ;AAAA,EAEvB,GAAA,CAAC,QAAQ,KAAK,SAAS,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM,OAAO,UAAU,UAAU,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,GAA2B,CAAC,GAAG,WAAW,OAAO,CAAC;AAE/J,SAAA;AACT;"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adhese/sdk-react",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"description": "Adhese SDK",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -17,8 +17,8 @@
|
|
|
17
17
|
],
|
|
18
18
|
"scripts": {
|
|
19
19
|
"build": "vite build && tsup src/index.ts --dts-only --minify --format esm",
|
|
20
|
-
"lint": "eslint .",
|
|
21
|
-
"lint:fix": "eslint --fix .",
|
|
20
|
+
"lint": "eslint . --ignore-pattern **/*.md/**/*",
|
|
21
|
+
"lint:fix": "eslint --fix . --ignore-pattern **/*.md/**/*",
|
|
22
22
|
"clean": "rm -rf dist",
|
|
23
23
|
"typecheck": "tsc --noEmit",
|
|
24
24
|
"prepareRelease": "npm run build"
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"react-dom": ">=16.13"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@adhese/sdk": "^0.
|
|
32
|
-
"remeda": "^1.
|
|
31
|
+
"@adhese/sdk": "^0.8.0",
|
|
32
|
+
"remeda": "^1.61.0",
|
|
33
33
|
"use-deep-compare-effect": "^1.8.1"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|