@vasanthcambium/marketplace-auth 0.1.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 +84 -0
- package/dist/browser/client.d.ts +3 -0
- package/dist/browser/client.d.ts.map +1 -0
- package/dist/browser/client.js +74 -0
- package/dist/browser/client.js.map +1 -0
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/types.d.ts +19 -0
- package/dist/browser/types.d.ts.map +1 -0
- package/dist/browser/types.js +2 -0
- package/dist/browser/types.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/react/AppProvider.d.ts +9 -0
- package/dist/react/AppProvider.d.ts.map +1 -0
- package/dist/react/AppProvider.js +36 -0
- package/dist/react/AppProvider.js.map +1 -0
- package/dist/react/index.d.ts +13 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +12 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useAccount.d.ts +9 -0
- package/dist/react/useAccount.d.ts.map +1 -0
- package/dist/react/useAccount.js +16 -0
- package/dist/react/useAccount.js.map +1 -0
- package/dist/react/useNBI.d.ts +10 -0
- package/dist/react/useNBI.d.ts.map +1 -0
- package/dist/react/useNBI.js +15 -0
- package/dist/react/useNBI.js.map +1 -0
- package/dist/react/useNBIMutation.d.ts +15 -0
- package/dist/react/useNBIMutation.d.ts.map +1 -0
- package/dist/react/useNBIMutation.js +31 -0
- package/dist/react/useNBIMutation.js.map +1 -0
- package/dist/react/useSession.d.ts +8 -0
- package/dist/react/useSession.d.ts.map +1 -0
- package/dist/react/useSession.js +22 -0
- package/dist/react/useSession.js.map +1 -0
- package/dist/server/createApp.d.ts +3 -0
- package/dist/server/createApp.d.ts.map +1 -0
- package/dist/server/createApp.js +201 -0
- package/dist/server/createApp.js.map +1 -0
- package/dist/server/express.d.ts +11 -0
- package/dist/server/express.d.ts.map +1 -0
- package/dist/server/express.js +86 -0
- package/dist/server/express.js.map +1 -0
- package/dist/server/hono.d.ts +4 -0
- package/dist/server/hono.d.ts.map +1 -0
- package/dist/server/hono.js +66 -0
- package/dist/server/hono.js.map +1 -0
- package/dist/server/index.d.ts +21 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +19 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/session.d.ts +15 -0
- package/dist/server/session.d.ts.map +1 -0
- package/dist/server/session.js +20 -0
- package/dist/server/session.js.map +1 -0
- package/dist/server/types.d.ts +60 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/shared/errors.d.ts +33 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +59 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/regions.d.ts +3 -0
- package/dist/shared/regions.d.ts.map +1 -0
- package/dist/shared/regions.js +13 -0
- package/dist/shared/regions.js.map +1 -0
- package/dist/shared/types.d.ts +41 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +7 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +58 -0
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# @cmbmwifi/marketplace-auth
|
|
2
|
+
|
|
3
|
+
Auth library for [MarketApps Platform](https://developers.apps.cloud.cambiumnetworks.com/api/docs) apps. One install gives you the BFF helper, browser fetch wrapper, and React hooks.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm install @cmbmwifi/marketplace-auth
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Three subpath exports, one package
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// In your BFF (Node)
|
|
13
|
+
import { createApp, expressMiddleware } from '@cmbmwifi/marketplace-auth/server';
|
|
14
|
+
|
|
15
|
+
// In your SPA (Browser, no React)
|
|
16
|
+
import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
|
|
17
|
+
|
|
18
|
+
// In your SPA (React)
|
|
19
|
+
import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The browser bundle never imports server code; the server bundle never imports DOM-only code. Tree-shaking is automatic.
|
|
23
|
+
|
|
24
|
+
## Server (BFF)
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import express from 'express';
|
|
28
|
+
import { createApp, expressMiddleware } from '@cmbmwifi/marketplace-auth/server';
|
|
29
|
+
|
|
30
|
+
const cn = createApp({
|
|
31
|
+
appId: 'my-app',
|
|
32
|
+
region: 'us-east-1',
|
|
33
|
+
authServiceUrl: 'https://auth.cloud.cambiumnetworks.com',
|
|
34
|
+
appCredentials: {
|
|
35
|
+
clientId: process.env.CN_APP_CLIENT_ID!,
|
|
36
|
+
clientSecret: process.env.CN_APP_CLIENT_SECRET!,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const server = express();
|
|
41
|
+
server.use(expressMiddleware(cn)); // installs /launch + /api/* + /healthz + /logout
|
|
42
|
+
server.listen(5174);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Hono adapter: `import { honoMiddleware } from '@cmbmwifi/marketplace-auth/server'`.
|
|
46
|
+
|
|
47
|
+
## Browser
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
|
|
51
|
+
|
|
52
|
+
const cn = createBridge({ baseUrl: '/' });
|
|
53
|
+
|
|
54
|
+
interface DeviceList { devices: { id: string; name: string }[] }
|
|
55
|
+
|
|
56
|
+
const data = await cn.fetch<DeviceList>('/api/v2/devices');
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## React
|
|
60
|
+
|
|
61
|
+
```tsx
|
|
62
|
+
import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
|
|
63
|
+
|
|
64
|
+
function Devices() {
|
|
65
|
+
const { data, error, isLoading } = useNBI<DeviceList>('/api/v2/devices');
|
|
66
|
+
if (isLoading) return <Spinner />;
|
|
67
|
+
if (error) return <ErrorBanner error={error} />;
|
|
68
|
+
return <DeviceTable rows={data!.devices} />;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default function App() {
|
|
72
|
+
return (
|
|
73
|
+
<AppProvider config={{ baseUrl: '/' }}>
|
|
74
|
+
<Devices />
|
|
75
|
+
</AppProvider>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Full documentation: [https://developers.apps.cloud.cambiumnetworks.com/api/docs/reference/sdk](https://developers.apps.cloud.cambiumnetworks.com/api/docs/reference/sdk)
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
Apache-2.0 © Cambium Networks, Ltd.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAEnE,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAAiB,GAAG,MAAM,CAkE9D"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
|
|
2
|
+
export function createBridge(config = {}) {
|
|
3
|
+
const baseUrl = (config.baseUrl ?? '/').replace(/\/$/, '');
|
|
4
|
+
const refreshOn401 = config.refreshOn401 ?? true;
|
|
5
|
+
const retryDelayMs = config.retryDelayMs ?? 250;
|
|
6
|
+
const expiredCbs = new Set();
|
|
7
|
+
let cachedSession = null;
|
|
8
|
+
void warmSession();
|
|
9
|
+
async function warmSession() {
|
|
10
|
+
try {
|
|
11
|
+
const res = await fetch(`${baseUrl}/api/v2/me`, { credentials: 'same-origin' });
|
|
12
|
+
if (res.ok)
|
|
13
|
+
cachedSession = await res.json().catch(() => null);
|
|
14
|
+
}
|
|
15
|
+
catch { /* swallow */ }
|
|
16
|
+
}
|
|
17
|
+
async function rawFetch(input, init) {
|
|
18
|
+
const url = typeof input === 'string' ? `${baseUrl}${input}` : input;
|
|
19
|
+
const headers = {};
|
|
20
|
+
// Headers is iterable as [name, value] pairs.
|
|
21
|
+
new Headers(init?.headers).forEach((v, k) => { headers[k] = v; });
|
|
22
|
+
if (init?.body && !(init.body instanceof FormData) && !headers['content-type']) {
|
|
23
|
+
headers['content-type'] = 'application/json';
|
|
24
|
+
}
|
|
25
|
+
return fetch(url, {
|
|
26
|
+
...init,
|
|
27
|
+
headers,
|
|
28
|
+
credentials: init?.credentials ?? 'same-origin',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
async fetch(input, init) {
|
|
33
|
+
let res = await rawFetch(input, init);
|
|
34
|
+
const method = (init?.method ?? 'GET').toUpperCase();
|
|
35
|
+
const isIdempotent = ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE'].includes(method);
|
|
36
|
+
if (res.status === 401 && refreshOn401 && isIdempotent) {
|
|
37
|
+
await delay(retryDelayMs);
|
|
38
|
+
res = await rawFetch(input, init);
|
|
39
|
+
}
|
|
40
|
+
if (res.status === 401) {
|
|
41
|
+
expiredCbs.forEach((cb) => { try {
|
|
42
|
+
cb();
|
|
43
|
+
}
|
|
44
|
+
catch { /* ignore */ } });
|
|
45
|
+
throw new SessionExpiredError();
|
|
46
|
+
}
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
let body;
|
|
49
|
+
try {
|
|
50
|
+
body = await res.clone().json();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
body = await res.text();
|
|
54
|
+
}
|
|
55
|
+
throw new BridgeHttpError(res.status, res.statusText, body);
|
|
56
|
+
}
|
|
57
|
+
if (init?.parseJson === false)
|
|
58
|
+
return res;
|
|
59
|
+
const ct = res.headers.get('content-type') ?? '';
|
|
60
|
+
if (!ct.includes('json'))
|
|
61
|
+
return res;
|
|
62
|
+
return res.json();
|
|
63
|
+
},
|
|
64
|
+
session() { return cachedSession; },
|
|
65
|
+
onSessionExpired(cb) {
|
|
66
|
+
expiredCbs.add(cb);
|
|
67
|
+
return () => expiredCbs.delete(cb);
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function delay(ms) {
|
|
72
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/browser/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth/browser — Browser fetch wrapper.
|
|
3
|
+
*
|
|
4
|
+
* import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
|
|
5
|
+
*
|
|
6
|
+
* Talks to your BFF same-origin. Never directly to the cnMaestro NBI.
|
|
7
|
+
*/
|
|
8
|
+
export { createBridge } from './client.js';
|
|
9
|
+
export type { Bridge, BridgeConfig, BridgeInit } from './types.js';
|
|
10
|
+
export type { Session } from '../shared/types.js';
|
|
11
|
+
export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth/browser — Browser fetch wrapper.
|
|
3
|
+
*
|
|
4
|
+
* import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
|
|
5
|
+
*
|
|
6
|
+
* Talks to your BFF same-origin. Never directly to the cnMaestro NBI.
|
|
7
|
+
*/
|
|
8
|
+
export { createBridge } from './client.js';
|
|
9
|
+
export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Session } from '../shared/types.js';
|
|
2
|
+
export interface BridgeConfig {
|
|
3
|
+
/** Base URL for the BFF. Default '/'. */
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
/** Retry once on 401 after a delay (the BFF will refresh transparently). Default true. */
|
|
6
|
+
refreshOn401?: boolean;
|
|
7
|
+
/** Delay before the retry, in ms. Default 250. */
|
|
8
|
+
retryDelayMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export interface BridgeInit extends RequestInit {
|
|
11
|
+
/** Parse the response as JSON. Default true. */
|
|
12
|
+
parseJson?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface Bridge {
|
|
15
|
+
fetch<T = unknown>(input: string | URL, init?: BridgeInit): Promise<T>;
|
|
16
|
+
session(): Session | null;
|
|
17
|
+
onSessionExpired(cb: () => void): () => void;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,gDAAgD;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvE,OAAO,IAAI,OAAO,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/browser/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth — root barrel.
|
|
3
|
+
*
|
|
4
|
+
* Most consumers import from a specific subpath instead so they get only the
|
|
5
|
+
* code they need (and the type system enforces the right environment):
|
|
6
|
+
*
|
|
7
|
+
* import { createApp } from '@cmbmwifi/marketplace-auth/server';
|
|
8
|
+
* import { createBridge } from '@cmbmwifi/marketplace-auth/browser';
|
|
9
|
+
* import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
|
|
10
|
+
*
|
|
11
|
+
* The root export here re-exports only the SHARED public types so both halves
|
|
12
|
+
* can talk about the same Session, ApiRoute, etc.
|
|
13
|
+
*/
|
|
14
|
+
export type { ApiRoute, Permission, Region, Session, UserRole, } from './shared/types.js';
|
|
15
|
+
export { AuthError, NonceVerificationError, TokenExchangeError, SessionNotFoundError, UpstreamError, BridgeHttpError, SessionExpiredError, } from './shared/errors.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,YAAY,EACV,QAAQ,EACR,UAAU,EACV,MAAM,EACN,OAAO,EACP,QAAQ,GACT,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { Bridge, BridgeConfig } from '../browser/types.js';
|
|
3
|
+
export interface AppProviderProps {
|
|
4
|
+
config: BridgeConfig;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function AppProvider({ config, children }: AppProviderProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export declare function useBridge(): Bridge;
|
|
9
|
+
//# sourceMappingURL=AppProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppProvider.d.ts","sourceRoot":"","sources":["../../src/react/AppProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA2D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEhG,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIhE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,gBAAgB,kDA0BjE;AAED,wBAAgB,SAAS,IAAI,MAAM,CAIlC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useEffect, useMemo, useState } from 'react';
|
|
3
|
+
import { createBridge } from '../browser/client.js';
|
|
4
|
+
const BridgeCtx = createContext(null);
|
|
5
|
+
export function AppProvider({ config, children }) {
|
|
6
|
+
const bridge = useMemo(() => createBridge(config), []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
7
|
+
const [launched, setLaunched] = useState(false);
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const url = new URL(window.location.href);
|
|
10
|
+
const token = url.searchParams.get('token') ?? url.searchParams.get('nonce');
|
|
11
|
+
if (!token) {
|
|
12
|
+
setLaunched(true);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
void fetch(`${(config.baseUrl ?? '/').replace(/\/$/, '')}/launch?token=${encodeURIComponent(token)}`, {
|
|
16
|
+
credentials: 'same-origin',
|
|
17
|
+
redirect: 'follow',
|
|
18
|
+
})
|
|
19
|
+
.then(() => {
|
|
20
|
+
url.searchParams.delete('token');
|
|
21
|
+
url.searchParams.delete('nonce');
|
|
22
|
+
window.history.replaceState({}, '', url.toString());
|
|
23
|
+
})
|
|
24
|
+
.finally(() => setLaunched(true));
|
|
25
|
+
}, [config.baseUrl]);
|
|
26
|
+
if (!launched)
|
|
27
|
+
return null;
|
|
28
|
+
return _jsx(BridgeCtx.Provider, { value: bridge, children: children });
|
|
29
|
+
}
|
|
30
|
+
export function useBridge() {
|
|
31
|
+
const v = useContext(BridgeCtx);
|
|
32
|
+
if (!v)
|
|
33
|
+
throw new Error('useBridge must be called inside <AppProvider>');
|
|
34
|
+
return v;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=AppProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppProvider.js","sourceRoot":"","sources":["../../src/react/AppProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAChG,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,MAAM,SAAS,GAAG,aAAa,CAAgB,IAAI,CAAC,CAAC;AAOrD,MAAM,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAoB;IAChE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kDAAkD;IAC1G,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,KAAK,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE;YACpG,WAAW,EAAE,aAAa;YAC1B,QAAQ,EAAE,QAAQ;SACnB,CAAC;aACC,IAAI,CAAC,GAAG,EAAE;YACT,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAErB,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,OAAO,KAAC,SAAS,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAAG,QAAQ,GAAsB,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACzE,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth/react — React hooks layered on the browser fetch wrapper.
|
|
3
|
+
*
|
|
4
|
+
* import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
|
|
5
|
+
*/
|
|
6
|
+
export { AppProvider, useBridge } from './AppProvider.js';
|
|
7
|
+
export { useSession } from './useSession.js';
|
|
8
|
+
export { useNBI } from './useNBI.js';
|
|
9
|
+
export { useNBIMutation } from './useNBIMutation.js';
|
|
10
|
+
export { useAccount, useUser } from './useAccount.js';
|
|
11
|
+
export type { AppProviderProps } from './AppProvider.js';
|
|
12
|
+
export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @cmbmwifi/marketplace-auth/react — React hooks layered on the browser fetch wrapper.
|
|
3
|
+
*
|
|
4
|
+
* import { AppProvider, useNBI } from '@cmbmwifi/marketplace-auth/react';
|
|
5
|
+
*/
|
|
6
|
+
export { AppProvider, useBridge } from './AppProvider.js';
|
|
7
|
+
export { useSession } from './useSession.js';
|
|
8
|
+
export { useNBI } from './useNBI.js';
|
|
9
|
+
export { useNBIMutation } from './useNBIMutation.js';
|
|
10
|
+
export { useAccount, useUser } from './useAccount.js';
|
|
11
|
+
export { BridgeHttpError, SessionExpiredError } from '../shared/errors.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAccount.d.ts","sourceRoot":"","sources":["../../src/react/useAccount.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,IAAI;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMrF;AAED,wBAAgB,OAAO,IAAI;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMvE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { useSession } from './useSession.js';
|
|
2
|
+
export function useAccount() {
|
|
3
|
+
const { session } = useSession();
|
|
4
|
+
return {
|
|
5
|
+
cambiumId: session?.accountCid ?? null,
|
|
6
|
+
accountName: null, // Reserved for v0.2 once /healthz exposes it.
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function useUser() {
|
|
10
|
+
const { session } = useSession();
|
|
11
|
+
return {
|
|
12
|
+
email: null, // Reserved for v0.2.
|
|
13
|
+
role: session?.userRole ?? null,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=useAccount.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAccount.js","sourceRoot":"","sources":["../../src/react/useAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACjC,OAAO;QACL,SAAS,EAAI,OAAO,EAAE,UAAU,IAAI,IAAI;QACxC,WAAW,EAAE,IAAI,EAAa,8CAA8C;KAC7E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;IACjC,OAAO;QACL,KAAK,EAAE,IAAI,EAAmB,qBAAqB;QACnD,IAAI,EAAG,OAAO,EAAE,QAAQ,IAAI,IAAI;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type SWRConfiguration, type SWRResponse } from 'swr';
|
|
2
|
+
export interface UseNBIResult<T> extends SWRResponse<T, Error> {
|
|
3
|
+
isLoading: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Read from the cnMaestro NBI through your BFF. SWR-backed.
|
|
7
|
+
* Pass `null` as the path to skip the fetch.
|
|
8
|
+
*/
|
|
9
|
+
export declare function useNBI<T = unknown>(path: string | null, options?: SWRConfiguration<T, Error>): UseNBIResult<T>;
|
|
10
|
+
//# sourceMappingURL=useNBI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNBI.d.ts","sourceRoot":"","sources":["../../src/react/useNBI.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,KAAK,CAAC;AAGtE,MAAM,WAAW,YAAY,CAAC,CAAC,CAAE,SAAQ,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;IAC5D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,GAAG,OAAO,EAChC,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,KAAK,CAAC,GACnC,YAAY,CAAC,CAAC,CAAC,CAWjB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import useSWR from 'swr';
|
|
2
|
+
import { useBridge } from './AppProvider.js';
|
|
3
|
+
/**
|
|
4
|
+
* Read from the cnMaestro NBI through your BFF. SWR-backed.
|
|
5
|
+
* Pass `null` as the path to skip the fetch.
|
|
6
|
+
*/
|
|
7
|
+
export function useNBI(path, options) {
|
|
8
|
+
const bridge = useBridge();
|
|
9
|
+
const swr = useSWR(path, (key) => bridge.fetch(key), options);
|
|
10
|
+
return {
|
|
11
|
+
...swr,
|
|
12
|
+
isLoading: !swr.data && !swr.error && path !== null,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=useNBI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNBI.js","sourceRoot":"","sources":["../../src/react/useNBI.ts"],"names":[],"mappings":"AAAA,OAAO,MAAmD,MAAM,KAAK,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAM7C;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,IAAmB,EACnB,OAAoC;IAEpC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAChB,IAAI,EACJ,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAI,GAAG,CAAC,EACrC,OAAO,CACR,CAAC;IACF,OAAO;QACL,GAAG,GAAG;QACN,SAAS,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI;KACpD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type Method = 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
2
|
+
export interface UseNBIMutationResult<TResponse, TBody> {
|
|
3
|
+
trigger: (body?: TBody) => Promise<TResponse>;
|
|
4
|
+
isPending: boolean;
|
|
5
|
+
error: Error | null;
|
|
6
|
+
reset: () => void;
|
|
7
|
+
}
|
|
8
|
+
export interface UseNBIMutationOptions<TResponse> {
|
|
9
|
+
onMutate?: () => Promise<void> | void;
|
|
10
|
+
onSuccess?: (data: TResponse) => Promise<void> | void;
|
|
11
|
+
onError?: (err: Error) => Promise<void> | void;
|
|
12
|
+
}
|
|
13
|
+
export declare function useNBIMutation<TResponse = unknown, TBody = unknown>(path: string, method?: Method, options?: UseNBIMutationOptions<TResponse>): UseNBIMutationResult<TResponse, TBody>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=useNBIMutation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNBIMutation.d.ts","sourceRoot":"","sources":["../../src/react/useNBIMutation.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElD,MAAM,WAAW,oBAAoB,CAAC,SAAS,EAAE,KAAK;IACpD,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB,CAAC,SAAS;IAC9C,QAAQ,CAAC,EAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,EAAI,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAClD;AAED,wBAAgB,cAAc,CAAC,SAAS,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACjE,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAe,EACvB,OAAO,GAAE,qBAAqB,CAAC,SAAS,CAAM,GAC7C,oBAAoB,CAAC,SAAS,EAAE,KAAK,CAAC,CA6BxC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
import { useBridge } from './AppProvider.js';
|
|
3
|
+
export function useNBIMutation(path, method = 'POST', options = {}) {
|
|
4
|
+
const bridge = useBridge();
|
|
5
|
+
const [isPending, setIsPending] = useState(false);
|
|
6
|
+
const [error, setError] = useState(null);
|
|
7
|
+
const trigger = useCallback(async (body) => {
|
|
8
|
+
setIsPending(true);
|
|
9
|
+
setError(null);
|
|
10
|
+
try {
|
|
11
|
+
await options.onMutate?.();
|
|
12
|
+
const init = { method };
|
|
13
|
+
if (body != null)
|
|
14
|
+
init.body = JSON.stringify(body);
|
|
15
|
+
const data = await bridge.fetch(path, init);
|
|
16
|
+
await options.onSuccess?.(data);
|
|
17
|
+
return data;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
21
|
+
setError(e);
|
|
22
|
+
await options.onError?.(e);
|
|
23
|
+
throw e;
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
setIsPending(false);
|
|
27
|
+
}
|
|
28
|
+
}, [bridge, path, method, options]);
|
|
29
|
+
return { trigger, isPending, error, reset: () => setError(null) };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=useNBIMutation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useNBIMutation.js","sourceRoot":"","sources":["../../src/react/useNBIMutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiB7C,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,SAAiB,MAAM,EACvB,UAA4C,EAAE;IAE9C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAK,QAAQ,CAAC,GAAM,QAAQ,CAAe,IAAI,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,WAAW,CACzB,KAAK,EAAE,IAAY,EAAsB,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAsC,EAAE,MAAM,EAAE,CAAC;YAC3D,IAAI,IAAI,IAAI,IAAI;gBAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAY,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,QAAQ,CAAC,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC;QACV,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAChC,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSession.d.ts","sourceRoot":"","sources":["../../src/react/useSession.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAGlD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED,wBAAgB,UAAU,IAAI,gBAAgB,CAmB7C"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useBridge } from './AppProvider.js';
|
|
3
|
+
export function useSession() {
|
|
4
|
+
const bridge = useBridge();
|
|
5
|
+
const [state, setState] = useState({
|
|
6
|
+
session: bridge.session(),
|
|
7
|
+
isReady: bridge.session() !== null,
|
|
8
|
+
error: null,
|
|
9
|
+
});
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
if (state.session)
|
|
12
|
+
return;
|
|
13
|
+
let mounted = true;
|
|
14
|
+
bridge
|
|
15
|
+
.fetch('/api/v2/me')
|
|
16
|
+
.then((s) => mounted && setState({ session: s, isReady: true, error: null }))
|
|
17
|
+
.catch((err) => mounted && setState({ session: null, isReady: true, error: err }));
|
|
18
|
+
return () => { mounted = false; };
|
|
19
|
+
}, [bridge, state.session]);
|
|
20
|
+
return state;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=useSession.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSession.js","sourceRoot":"","sources":["../../src/react/useSession.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAQ7C,MAAM,UAAU,UAAU;IACxB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAmB;QACnD,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI;QAClC,KAAK,EAAI,IAAI;KACd,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO;QAC1B,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,MAAM;aACH,KAAK,CAAU,YAAY,CAAC;aAC5B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aAC5E,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5F,OAAO,GAAG,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createApp.d.ts","sourceRoot":"","sources":["../../src/server/createApp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAA6C,MAAM,YAAY,CAAC;AAM5F,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,GAAG,CAqKhD"}
|