@burdenoff/fe-libs 2026.1021.13 → 2026.1021.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin-overview/AdminOverviewActionsContext.d.ts +11 -0
- package/dist/admin-overview/AdminOverviewActionsContext.js +17 -0
- package/dist/admin-overview/AdminOverviewPage.d.ts +4 -0
- package/dist/admin-overview/AdminOverviewPage.js +524 -0
- package/dist/admin-overview/buildHierarchyGraph.d.ts +36 -0
- package/dist/admin-overview/buildHierarchyGraph.js +172 -0
- package/dist/admin-overview/index.d.ts +10 -0
- package/dist/admin-overview/nodes/OrganizationNode.d.ts +9 -0
- package/dist/admin-overview/nodes/OrganizationNode.js +85 -0
- package/dist/admin-overview/nodes/ProjectNode.d.ts +9 -0
- package/dist/admin-overview/nodes/ProjectNode.js +69 -0
- package/dist/admin-overview/nodes/TenantNode.d.ts +9 -0
- package/dist/admin-overview/nodes/TenantNode.js +78 -0
- package/dist/admin-overview/nodes/WorkspaceNode.d.ts +9 -0
- package/dist/admin-overview/nodes/WorkspaceNode.js +136 -0
- package/dist/admin-overview/nodes/nodeStyles.d.ts +7 -0
- package/dist/admin-overview/nodes/nodeStyles.js +10 -0
- package/dist/admin-overview/operations.d.ts +45 -0
- package/dist/admin-overview/operations.js +42 -0
- package/dist/admin-overview.d.ts +2 -0
- package/dist/admin-overview.js +3 -0
- package/dist/chrome/GlobalSearch.js +9 -9
- package/dist/chrome/HeaderThemeSwitcher.js +7 -7
- package/dist/chrome.js +44 -44
- package/dist/platform-pages/AcceptShareRoute.d.ts +33 -0
- package/dist/platform-pages/AcceptShareRoute.js +72 -0
- package/dist/platform-pages/AffiliatesPage.d.ts +16 -0
- package/dist/platform-pages/AffiliatesPage.js +583 -0
- package/dist/platform-pages/AppearanceSettingsPage.d.ts +14 -0
- package/dist/platform-pages/AppearanceSettingsPage.js +14 -0
- package/dist/platform-pages/index.d.ts +20 -0
- package/dist/platform-pages.d.ts +2 -0
- package/dist/platform-pages.js +4 -0
- package/dist/shared/components/DocsLink.d.ts +56 -0
- package/dist/shared/components/DocsLink.js +97 -0
- package/dist/shared/components/index.d.ts +2 -0
- package/dist/shared/config/docsUrls.d.ts +91 -0
- package/dist/shared/config/docsUrls.js +70 -0
- package/dist/shared/config/index.d.ts +2 -0
- package/dist/shared/config/shellRoutes.js +7 -0
- package/dist/shared/feature-flags/FeatureFlagProvider.d.ts +10 -0
- package/dist/shared/feature-flags/FeatureFlagProvider.js +4 -1
- package/dist/shared/feature-flags/index.d.ts +2 -2
- package/dist/shared/feature-flags/useFeatureFlag.d.ts +26 -1
- package/dist/shared/feature-flags/useFeatureFlag.js +25 -12
- package/dist/shared/hooks/usePushDeviceRegistration.js +1 -1
- package/dist/shared/providers/AppShellProvider.js +6 -6
- package/dist/shared-components.js +7 -6
- package/dist/shared-config.js +10 -9
- package/dist/shared-feature-flags.js +4 -4
- package/dist/shared-hooks.js +25 -25
- package/dist/shared-native.js +15 -15
- package/dist/shared-providers-shell.js +12 -12
- package/dist/shared.js +132 -130
- package/dist/shell-native/push-optin.js +4 -4
- package/package.json +16 -3
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { normalizeProductSlug as e } from "../config/productSlug.js";
|
|
2
|
+
import { buildProductDocsUrl as t, resolveProductDocsOrigin as n, toTrustedDocsOrigin as r } from "../config/docsUrls.js";
|
|
3
|
+
import { useSafeGateway as i } from "../graphql/GatewayContext.js";
|
|
4
|
+
import { useAppShell as a } from "../providers/shell/AppShellContext.js";
|
|
5
|
+
import { useEffect as o, useState as s } from "react";
|
|
6
|
+
import { Fragment as c, jsx as l } from "react/jsx-runtime";
|
|
7
|
+
import { gql as u } from "@apollo/client/core";
|
|
8
|
+
//#region src/shared/components/DocsLink.tsx
|
|
9
|
+
var d = u`
|
|
10
|
+
query PublicProductDocsUrl($slug: String!) {
|
|
11
|
+
publicProduct(slug: $slug) {
|
|
12
|
+
docsUrl
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
`, f = /* @__PURE__ */ new Map(), p = /* @__PURE__ */ new Map();
|
|
16
|
+
function m(e) {
|
|
17
|
+
if (!e || typeof e != "object") return null;
|
|
18
|
+
let t = e.publicProduct;
|
|
19
|
+
if (!t || typeof t != "object") return null;
|
|
20
|
+
let n = t.docsUrl;
|
|
21
|
+
return typeof n == "string" && r(n) ? n : null;
|
|
22
|
+
}
|
|
23
|
+
function h(t) {
|
|
24
|
+
return f.get(e(t));
|
|
25
|
+
}
|
|
26
|
+
function g(t, n) {
|
|
27
|
+
let r = e(n), i = f.get(r);
|
|
28
|
+
if (i !== void 0) return Promise.resolve(i);
|
|
29
|
+
let a = p.get(r);
|
|
30
|
+
if (a) return a;
|
|
31
|
+
let o = t.query({
|
|
32
|
+
query: d,
|
|
33
|
+
variables: { slug: r },
|
|
34
|
+
fetchPolicy: "cache-first"
|
|
35
|
+
}).then((e) => {
|
|
36
|
+
let t = m(e.data);
|
|
37
|
+
return f.set(r, t), t;
|
|
38
|
+
}).catch(() => null).finally(() => {
|
|
39
|
+
p.delete(r);
|
|
40
|
+
});
|
|
41
|
+
return p.set(r, o), o;
|
|
42
|
+
}
|
|
43
|
+
function _(e, t) {
|
|
44
|
+
let n = i(), [r, a] = s(() => h(e) ?? null);
|
|
45
|
+
return o(() => {
|
|
46
|
+
if (!t || !n) return;
|
|
47
|
+
let r = h(e);
|
|
48
|
+
if (r !== void 0) {
|
|
49
|
+
a(r);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
a(null);
|
|
53
|
+
let i = !0;
|
|
54
|
+
return g(n.getClient("global"), e).then((e) => {
|
|
55
|
+
i && a(e);
|
|
56
|
+
}), () => {
|
|
57
|
+
i = !1;
|
|
58
|
+
};
|
|
59
|
+
}, [
|
|
60
|
+
t,
|
|
61
|
+
n,
|
|
62
|
+
e
|
|
63
|
+
]), t ? r : null;
|
|
64
|
+
}
|
|
65
|
+
function v(e = {}) {
|
|
66
|
+
let t = a(), r = e.productSlug ?? t.productSlug;
|
|
67
|
+
return n(r, {
|
|
68
|
+
registryDocsUrl: _(r, e.registry !== !1),
|
|
69
|
+
domain: e.productSlug ? void 0 : t.domain,
|
|
70
|
+
environment: e.environment
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function y(e, n = {}) {
|
|
74
|
+
let r = a(), i = n.productSlug ?? r.productSlug;
|
|
75
|
+
return t(i, e, {
|
|
76
|
+
registryDocsUrl: _(i, n.registry !== !1),
|
|
77
|
+
domain: n.productSlug ? void 0 : r.domain,
|
|
78
|
+
environment: n.environment
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function b({ path: e, productSlug: t, registry: n, environment: r, children: i, ...a }) {
|
|
82
|
+
let o = y(e, {
|
|
83
|
+
productSlug: t,
|
|
84
|
+
registry: n,
|
|
85
|
+
environment: r
|
|
86
|
+
});
|
|
87
|
+
return o ? /* @__PURE__ */ l("a", {
|
|
88
|
+
...a,
|
|
89
|
+
href: o,
|
|
90
|
+
target: "_blank",
|
|
91
|
+
rel: "noopener noreferrer",
|
|
92
|
+
"data-docs-link": "",
|
|
93
|
+
children: i
|
|
94
|
+
}) : /* @__PURE__ */ l(c, { children: i });
|
|
95
|
+
}
|
|
96
|
+
//#endregion
|
|
97
|
+
export { b as DocsLink, d as PUBLIC_PRODUCT_DOCS_URL_QUERY, g as fetchRegistryDocsUrl, m as readRegistryDocsUrl, v as useProductDocsOrigin, y as useProductDocsUrl };
|
|
@@ -30,6 +30,8 @@ export type { QuotaUpgradeBridgeProps, QuotaUpgradeBridgeOptions, QuotaUpgradeCo
|
|
|
30
30
|
export { getSSORedirectUrl, redirectToSSO, SSORedirectSpinner, checkSLO, checkRemoteSLO, clearLocalAuthState, } from './SSORedirectGuard';
|
|
31
31
|
export { MAIN_CONTENT_ID, MainLandmark, PublicLayout, SkipToContentLink, focusSkipTarget, useInsideMainLandmark, } from './SkipToContent';
|
|
32
32
|
export type { MainLandmarkProps, PublicLayoutProps, SkipTarget, SkipToContentLinkProps, } from './SkipToContent';
|
|
33
|
+
export { DocsLink, useProductDocsOrigin, useProductDocsUrl, fetchRegistryDocsUrl, readRegistryDocsUrl, PUBLIC_PRODUCT_DOCS_URL_QUERY, } from './DocsLink';
|
|
34
|
+
export type { DocsLinkProps, DocsRegistryClient, UseProductDocsOptions } from './DocsLink';
|
|
33
35
|
export { LandingOrDashboardRedirect, LandingGateView, resolveLandingGate, hasStoredValidSession, } from './LandingOrDashboardRedirect';
|
|
34
36
|
export type { LandingOrDashboardRedirectProps, LandingGateViewProps, LandingGateDecision, LandingGateInput, } from './LandingOrDashboardRedirect';
|
|
35
37
|
export { AssistantWidget, ASSISTANT_WIDGET_TOGGLE_EVENT } from './assistantWidget/AssistantWidget';
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Environment-aware product documentation URLs (G91).
|
|
3
|
+
*
|
|
4
|
+
* Every product publishes its docs at `docs.<product-domain>` in production
|
|
5
|
+
* and `alphadocs.<product-domain>` in alpha (behind Cloudflare Access, like
|
|
6
|
+
* every other alpha host). In-app "Learn more" and Help links must follow the
|
|
7
|
+
* environment the shell is running in: an alpha shell that links to the prod
|
|
8
|
+
* docs shows readers documentation for a build they are not using.
|
|
9
|
+
*
|
|
10
|
+
* Resolution, highest precedence first:
|
|
11
|
+
* 1. The product registry `docsUrl` (`publicProduct(slug).docsUrl`), when it
|
|
12
|
+
* is an https URL on a trusted product domain.
|
|
13
|
+
* 2. The static catalog: the product's production app host with `app.`
|
|
14
|
+
* swapped for `docs.`.
|
|
15
|
+
* 3. `docs.<domain>` from the shell's own `domain`, for a product the static
|
|
16
|
+
* catalog does not know yet.
|
|
17
|
+
*
|
|
18
|
+
* The chosen origin is then canonicalised (legacy docs hosts are mapped to
|
|
19
|
+
* their canonical twin — FluidGrids' canonical domain is fluidgrids.ai) and
|
|
20
|
+
* converted to the current environment (`docs.` ↔ `alphadocs.`).
|
|
21
|
+
*
|
|
22
|
+
* @module @burdenoff/fe-libs/shared/config/docsUrls
|
|
23
|
+
*/
|
|
24
|
+
/** The docs estate a link should point at. Local dev servers read the prod docs. */
|
|
25
|
+
export type DocsEnvironment = 'prod' | 'alpha';
|
|
26
|
+
/**
|
|
27
|
+
* Legacy docs hosts and the canonical host each one 301s to. A registry row or
|
|
28
|
+
* shell config that still carries the legacy host resolves straight to the
|
|
29
|
+
* canonical one, so a link never relies on the redirect.
|
|
30
|
+
*/
|
|
31
|
+
export declare const CANONICAL_DOCS_HOSTS: Readonly<Record<string, string>>;
|
|
32
|
+
/**
|
|
33
|
+
* Parse a docs base URL and return its `https://host` origin, or null when it
|
|
34
|
+
* is not a usable docs origin: not https, not on a known product domain,
|
|
35
|
+
* or not parseable. Registry values are user-editable admin data, so an
|
|
36
|
+
* arbitrary host must never become an in-app link.
|
|
37
|
+
*/
|
|
38
|
+
export declare function toTrustedDocsOrigin(url: string | null | undefined): string | null;
|
|
39
|
+
/** Map a legacy docs origin to its canonical twin; other origins are returned unchanged. */
|
|
40
|
+
export declare function canonicalizeDocsOrigin(origin: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Convert a docs origin to the given environment: `docs.x` ↔ `alphadocs.x`.
|
|
43
|
+
* An origin that follows neither convention is returned unchanged, because
|
|
44
|
+
* guessing an alpha twin for it could produce a host that does not exist.
|
|
45
|
+
*/
|
|
46
|
+
export declare function toEnvironmentDocsOrigin(origin: string, environment: DocsEnvironment): string;
|
|
47
|
+
/**
|
|
48
|
+
* The default prod docs origin for a product from the static catalog
|
|
49
|
+
* (`app.<domain>` → `docs.<domain>`), canonicalised. Undefined when the
|
|
50
|
+
* catalog does not know the product.
|
|
51
|
+
*/
|
|
52
|
+
export declare function getCatalogDocsOrigin(productSlug: string): string | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Which docs estate the running shell belongs to.
|
|
55
|
+
*
|
|
56
|
+
* - Desktop (Electron): the baked runtime config's `environment`.
|
|
57
|
+
* - Capacitor: the build's deploy target (the WebView origin is always localhost).
|
|
58
|
+
* - Web: `alphaapp.*` / `alphaadmin.*` hosts are alpha; everything else is prod.
|
|
59
|
+
* A localhost dev server built for alpha (`VITE_DEPLOY_ENV=alpha` or
|
|
60
|
+
* `VITE_GATEWAY_TARGET=alpha`) reads the alpha docs; otherwise prod, because
|
|
61
|
+
* docs are not served by the local stack.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveDocsEnvironment(hostname?: string): DocsEnvironment;
|
|
64
|
+
export interface ResolveDocsOriginOptions {
|
|
65
|
+
/** The registry's `docsUrl` for the product, when the shell has it. */
|
|
66
|
+
registryDocsUrl?: string | null;
|
|
67
|
+
/** The shell's own domain (AppShellConfig `domain`), for products missing from the catalog. */
|
|
68
|
+
domain?: string;
|
|
69
|
+
/** Override the detected environment (tests, previews). */
|
|
70
|
+
environment?: DocsEnvironment;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The environment-correct docs origin for a product, e.g.
|
|
74
|
+
* `https://alphadocs.vibecontrols.com` on alphaapp.vibecontrols.com.
|
|
75
|
+
* Undefined only when no source names a trusted docs host.
|
|
76
|
+
*/
|
|
77
|
+
export declare function resolveProductDocsOrigin(productSlug: string, options?: ResolveDocsOriginOptions): string | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* Normalise a docs path: must be site-relative. Absolute URLs and
|
|
80
|
+
* protocol-relative `//host` paths are rejected (they would let a caller turn
|
|
81
|
+
* a "docs" link into an arbitrary external link). Query and hash are kept.
|
|
82
|
+
*/
|
|
83
|
+
export declare function normalizeDocsPath(path: string | undefined): string | null;
|
|
84
|
+
/**
|
|
85
|
+
* Full docs URL for a product page, e.g.
|
|
86
|
+
* `buildProductDocsUrl('fluidgrids', '/users/workflows')` →
|
|
87
|
+
* `https://docs.fluidgrids.ai/users/workflows` in prod and
|
|
88
|
+
* `https://alphadocs.fluidgrids.ai/users/workflows` in alpha.
|
|
89
|
+
* Undefined when there is no trusted docs origin or the path is not site-relative.
|
|
90
|
+
*/
|
|
91
|
+
export declare function buildProductDocsUrl(productSlug: string, path?: string, options?: ResolveDocsOriginOptions): string | undefined;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { isCapacitorNative as e } from "../native/capacitor.js";
|
|
2
|
+
import { getDesktopRuntimeConfig as t } from "../native/desktop.js";
|
|
3
|
+
import { ALL_PRODUCT_DOMAINS as n, ALPHA_HOSTS as r, getCurrentHostname as i, resolveNativeDeployTarget as a } from "./gatewayUrls.js";
|
|
4
|
+
import { legacyProductSlug as o, normalizeProductSlug as s } from "./productSlug.js";
|
|
5
|
+
import { PRODUCT_URLS as c } from "./products.js";
|
|
6
|
+
//#region src/shared/config/docsUrls.ts
|
|
7
|
+
var l = "docs.", u = "alphadocs.", d = {
|
|
8
|
+
"docs.fluidgrids.com": "docs.fluidgrids.ai",
|
|
9
|
+
"alphadocs.fluidgrids.com": "alphadocs.fluidgrids.ai"
|
|
10
|
+
}, f = new Set(n);
|
|
11
|
+
function p(e) {
|
|
12
|
+
let t = e.toLowerCase();
|
|
13
|
+
for (let e of f) if (t === e || t.endsWith(`.${e}`)) return !0;
|
|
14
|
+
return !1;
|
|
15
|
+
}
|
|
16
|
+
function m(e) {
|
|
17
|
+
if (typeof e != "string" || e.trim() === "") return null;
|
|
18
|
+
let t;
|
|
19
|
+
try {
|
|
20
|
+
t = new URL(e.trim());
|
|
21
|
+
} catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return t.protocol !== "https:" || t.username || t.password || t.port || !p(t.hostname) ? null : `https://${t.hostname.toLowerCase()}`;
|
|
25
|
+
}
|
|
26
|
+
function h(e) {
|
|
27
|
+
let t = d[e.replace(/^https:\/\//, "")];
|
|
28
|
+
return t ? `https://${t}` : e;
|
|
29
|
+
}
|
|
30
|
+
function g(e, t) {
|
|
31
|
+
let n = e.replace(/^https:\/\//, ""), r = null;
|
|
32
|
+
return n.startsWith(u) ? r = n.slice(10) : n.startsWith(l) && (r = n.slice(5)), r ? `https://${t === "alpha" ? u : l}${r}` : e;
|
|
33
|
+
}
|
|
34
|
+
function _(e) {
|
|
35
|
+
let t = c.production, n = s(e), r = t[n] ?? t[o(n)];
|
|
36
|
+
if (!r) return;
|
|
37
|
+
let i;
|
|
38
|
+
try {
|
|
39
|
+
i = new URL(r).hostname;
|
|
40
|
+
} catch {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
return h(`https://${l}${i.startsWith("app.") ? i.slice(4) : i}`);
|
|
44
|
+
}
|
|
45
|
+
function v(n = i()) {
|
|
46
|
+
let o = t()?.environment;
|
|
47
|
+
if (o) return o === "alpha" ? "alpha" : "prod";
|
|
48
|
+
if (e()) return a() === "alpha" ? "alpha" : "prod";
|
|
49
|
+
let s = n.toLowerCase(), c = () => a() === "alpha" ? "alpha" : "prod";
|
|
50
|
+
return r.has(s) ? "alpha" : s.endsWith(".local.burdenoff.com") ? c() : s.startsWith("alpha") && p(s) ? "alpha" : p(s) ? "prod" : c();
|
|
51
|
+
}
|
|
52
|
+
function y(e, t = {}) {
|
|
53
|
+
let n = t.domain ? m(`https://${l}${t.domain.replace(/^www\./, "")}`) : null, r = m(t.registryDocsUrl) ?? _(e) ?? n ?? void 0;
|
|
54
|
+
if (!r) return;
|
|
55
|
+
let i = t.environment ?? v();
|
|
56
|
+
return g(h(r), i);
|
|
57
|
+
}
|
|
58
|
+
function b(e) {
|
|
59
|
+
if (e === void 0 || e === "") return "";
|
|
60
|
+
let t = e.trim();
|
|
61
|
+
return /^[a-z][a-z0-9+.-]*:/i.test(t) || t.startsWith("//") || t.includes("\\") ? null : t.startsWith("/") || t.startsWith("#") || t.startsWith("?") ? t : `/${t}`;
|
|
62
|
+
}
|
|
63
|
+
function x(e, t, n = {}) {
|
|
64
|
+
let r = y(e, n);
|
|
65
|
+
if (!r) return;
|
|
66
|
+
let i = b(t);
|
|
67
|
+
if (i !== null) return `${r}${i}`;
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { d as CANONICAL_DOCS_HOSTS, x as buildProductDocsUrl, h as canonicalizeDocsOrigin, _ as getCatalogDocsOrigin, b as normalizeDocsPath, v as resolveDocsEnvironment, y as resolveProductDocsOrigin, g as toEnvironmentDocsOrigin, m as toTrustedDocsOrigin };
|
|
@@ -68,6 +68,8 @@ export { resolveGatewayUrls } from './gatewayUrls';
|
|
|
68
68
|
export type { RuntimeGatewayUrls } from './gatewayUrls';
|
|
69
69
|
export { resolveAuthBridgeConfig, resolveShellAuthBridgeConfig } from './authBridgeUrls';
|
|
70
70
|
export type { RuntimeAuthBridgeConfig } from './authBridgeUrls';
|
|
71
|
+
export { CANONICAL_DOCS_HOSTS, buildProductDocsUrl, canonicalizeDocsOrigin, getCatalogDocsOrigin, normalizeDocsPath, resolveDocsEnvironment, resolveProductDocsOrigin, toEnvironmentDocsOrigin, toTrustedDocsOrigin, } from './docsUrls';
|
|
72
|
+
export type { DocsEnvironment, ResolveDocsOriginOptions } from './docsUrls';
|
|
71
73
|
export { PRODUCTS, PRODUCT_URLS, BOTMANOR_PRODUCT_SLUG, getProductUrl, getProductsWithUrls, findProductConfig, } from './products';
|
|
72
74
|
export type { ProductConfig } from './products';
|
|
73
75
|
export { PRODUCT_SLUG_RENAMES, PRODUCT_SLUG_EMIT, normalizeProductSlug, legacyProductSlug, isSameProductSlug, emitProductSlug, } from './productSlug';
|
|
@@ -152,6 +152,13 @@ var e = {
|
|
|
152
152
|
showFooter: !1,
|
|
153
153
|
showBreadcrumb: !1
|
|
154
154
|
},
|
|
155
|
+
{
|
|
156
|
+
pattern: /^\/vault\/share\//,
|
|
157
|
+
showHeader: !1,
|
|
158
|
+
showSidebar: !1,
|
|
159
|
+
showFooter: !1,
|
|
160
|
+
showBreadcrumb: !1
|
|
161
|
+
},
|
|
155
162
|
{
|
|
156
163
|
pattern: /^\/share\/accept\//,
|
|
157
164
|
showHeader: !1,
|
|
@@ -44,3 +44,13 @@ debug, defaultEnabled, }: FeatureFlagProviderProps): import('react/jsx-runtime')
|
|
|
44
44
|
* ```
|
|
45
45
|
*/
|
|
46
46
|
export declare function useFeatureFlags(): FeatureFlagContextValue;
|
|
47
|
+
/**
|
|
48
|
+
* Like `useFeatureFlags`, but returns `null` instead of throwing when no
|
|
49
|
+
* `FeatureFlagProvider` is mounted above the caller.
|
|
50
|
+
*
|
|
51
|
+
* For code that runs in hosts it does not control — a microfrontend or SDK
|
|
52
|
+
* component mounted by many app shells, only some of which mount the provider.
|
|
53
|
+
* Shell code should keep using `useFeatureFlags`, whose throw surfaces a missing
|
|
54
|
+
* provider at once.
|
|
55
|
+
*/
|
|
56
|
+
export declare function useOptionalFeatureFlags(): FeatureFlagContextValue | null;
|
|
@@ -107,5 +107,8 @@ function f() {
|
|
|
107
107
|
if (!e) throw Error("useFeatureFlags must be used within a FeatureFlagProvider");
|
|
108
108
|
return e;
|
|
109
109
|
}
|
|
110
|
+
function p() {
|
|
111
|
+
return n(u);
|
|
112
|
+
}
|
|
110
113
|
//#endregion
|
|
111
|
-
export { d as FeatureFlagProvider, f as useFeatureFlags };
|
|
114
|
+
export { d as FeatureFlagProvider, f as useFeatureFlags, p as useOptionalFeatureFlags };
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
* </FeatureGate>
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
|
-
export { FeatureFlagProvider, useFeatureFlags } from './FeatureFlagProvider';
|
|
32
|
+
export { FeatureFlagProvider, useFeatureFlags, useOptionalFeatureFlags, } from './FeatureFlagProvider';
|
|
33
33
|
export type { FeatureFlagProviderProps } from './FeatureFlagProvider';
|
|
34
|
-
export { useFeatureFlag, useFeatureFlagValue, useFeatureFlagDetails } from './useFeatureFlag';
|
|
34
|
+
export { useFeatureFlag, useOptionalFeatureFlag, useFeatureFlagValue, useFeatureFlagDetails, } from './useFeatureFlag';
|
|
35
35
|
export { FeatureGate } from './FeatureGate';
|
|
36
36
|
export type { FeatureGateProps } from './FeatureGate';
|
|
37
37
|
export type { FlagValue, FlagType, FlagStatus, FlagEvaluation, BulkEvaluationResponse, FeatureFlagProviderConfig, FeatureFlagContextValue, } from './types';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FlagValue, FlagEvaluation } from './types';
|
|
1
|
+
import { FlagValue, FlagEvaluation, FeatureFlagContextValue } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* Check if a single feature flag is enabled.
|
|
4
4
|
*
|
|
@@ -7,6 +7,31 @@ import { FlagValue, FlagEvaluation } from './types';
|
|
|
7
7
|
* @returns Whether the flag is enabled
|
|
8
8
|
*/
|
|
9
9
|
export declare function useFeatureFlag(flagKey: string, defaultValue?: boolean): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Check a single feature flag without requiring a `FeatureFlagProvider`.
|
|
12
|
+
*
|
|
13
|
+
* Same default-allow semantics as `useFeatureFlag`, and it returns
|
|
14
|
+
* `defaultValue` while flags load, when the flag is absent, and when the host
|
|
15
|
+
* mounts no provider at all. Use it in microfrontends and SDK components that
|
|
16
|
+
* several app shells mount (not every shell mounts the provider); shell code
|
|
17
|
+
* keeps `useFeatureFlag`.
|
|
18
|
+
*
|
|
19
|
+
* @param flagKey - The feature flag key to check
|
|
20
|
+
* @param defaultValue - Value when the flag cannot be evaluated (default: true)
|
|
21
|
+
* @returns Whether the flag is enabled
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```tsx
|
|
25
|
+
* // A kill switch: on unless an admin turns it off for this workspace.
|
|
26
|
+
* const logStreams = useOptionalFeatureFlag('fluidgrids.log-streams');
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function useOptionalFeatureFlag(flagKey: string, defaultValue?: boolean): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Pure resolution behind `useOptionalFeatureFlag` (exported for tests): the
|
|
32
|
+
* default when there is no provider, while loading, or when the flag is absent.
|
|
33
|
+
*/
|
|
34
|
+
export declare function resolveFlagEnabled(context: Pick<FeatureFlagContextValue, 'getEvaluation' | 'isLoading'> | null, flagKey: string, defaultValue: boolean): boolean;
|
|
10
35
|
/**
|
|
11
36
|
* Get the resolved value of a single feature flag.
|
|
12
37
|
*
|
|
@@ -1,31 +1,44 @@
|
|
|
1
|
-
import { useFeatureFlags as e } from "./FeatureFlagProvider.js";
|
|
2
|
-
import { useMemo as
|
|
1
|
+
import { useFeatureFlags as e, useOptionalFeatureFlags as t } from "./FeatureFlagProvider.js";
|
|
2
|
+
import { useMemo as n } from "react";
|
|
3
3
|
//#region src/shared/feature-flags/useFeatureFlag.ts
|
|
4
|
-
function
|
|
4
|
+
function r(t, r = !0) {
|
|
5
5
|
let { getEvaluation: i, isLoading: a } = e();
|
|
6
|
-
return
|
|
6
|
+
return n(() => {
|
|
7
7
|
if (a) return r;
|
|
8
|
-
let e = i(
|
|
8
|
+
let e = i(t);
|
|
9
9
|
return e ? !!e.value : r;
|
|
10
10
|
}, [
|
|
11
11
|
i,
|
|
12
12
|
a,
|
|
13
|
-
|
|
13
|
+
t,
|
|
14
14
|
r
|
|
15
15
|
]);
|
|
16
16
|
}
|
|
17
|
-
function
|
|
17
|
+
function i(e, r = !0) {
|
|
18
|
+
let i = t();
|
|
19
|
+
return n(() => a(i, e, r), [
|
|
20
|
+
i,
|
|
21
|
+
e,
|
|
22
|
+
r
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
function a(e, t, n) {
|
|
26
|
+
if (!e || e.isLoading) return n;
|
|
27
|
+
let r = e.getEvaluation(t);
|
|
28
|
+
return r ? !!r.value : n;
|
|
29
|
+
}
|
|
30
|
+
function o(t, r) {
|
|
18
31
|
let { getValue: i, isLoading: a } = e();
|
|
19
|
-
return
|
|
32
|
+
return n(() => a ? r : i(t, r), [
|
|
20
33
|
i,
|
|
21
34
|
a,
|
|
22
|
-
|
|
35
|
+
t,
|
|
23
36
|
r
|
|
24
37
|
]);
|
|
25
38
|
}
|
|
26
|
-
function
|
|
39
|
+
function s(t) {
|
|
27
40
|
let { getEvaluation: r } = e();
|
|
28
|
-
return
|
|
41
|
+
return n(() => r(t), [r, t]);
|
|
29
42
|
}
|
|
30
43
|
//#endregion
|
|
31
|
-
export {
|
|
44
|
+
export { r as useFeatureFlag, s as useFeatureFlagDetails, o as useFeatureFlagValue, i as useOptionalFeatureFlag };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { useAppShell as e } from "../providers/shell/AppShellContext.js";
|
|
2
2
|
import { useAuth as t } from "../providers/shell/AuthProvider.js";
|
|
3
3
|
import { logManager as n } from "../logger/LogManager.js";
|
|
4
|
-
import "../../shared-logger.js";
|
|
5
4
|
import { installPushDeviceRegistration as r, unregisterPushDevice as i } from "../native/push-registration.js";
|
|
5
|
+
import "../../shared-logger.js";
|
|
6
6
|
import { useEffect as a, useRef as o } from "react";
|
|
7
7
|
//#region src/shared/hooks/usePushDeviceRegistration.ts
|
|
8
8
|
var s = n.getLogger("usePushDeviceRegistration");
|
|
@@ -10,15 +10,15 @@ import { ActiveContextProvider as m } from "./shell/ActiveContextProvider.js";
|
|
|
10
10
|
import { LogManager as h } from "../logger/LogManager.js";
|
|
11
11
|
import { ConsoleTransport as ne } from "../logger/ConsoleTransport.js";
|
|
12
12
|
import { ThemeProvider as g } from "./shell/ThemeProvider.js";
|
|
13
|
-
import {
|
|
13
|
+
import { AuthTokenProvider as re } from "./shell/AuthTokenProvider.js";
|
|
14
|
+
import { ErrorFallback as ie } from "../components/ErrorFallback.js";
|
|
14
15
|
import { m as _ } from "../../node_modules/react-error-boundary/dist/react-error-boundary.js";
|
|
15
16
|
import { PWAInstallBanner as v } from "../components/PWAInstallBanner.js";
|
|
16
17
|
import { FeatureFlagsProvider as y } from "./shell/FeatureFlagsProvider.js";
|
|
17
18
|
import { FeatureFlagProvider as b } from "../feature-flags/FeatureFlagProvider.js";
|
|
18
19
|
import { GlobalUiProvider as x } from "./shell/GlobalUiProvider.js";
|
|
19
20
|
import { ShellUiProvider as S } from "./shell/ShellUiProvider.js";
|
|
20
|
-
import { ContextManagerProvider as
|
|
21
|
-
import { AuthTokenProvider as ae } from "./shell/AuthTokenProvider.js";
|
|
21
|
+
import { ContextManagerProvider as ae } from "./shell/ContextManagerProvider.js";
|
|
22
22
|
import { MultiGatewayProvider as oe } from "./shell/MultiGatewayProvider.js";
|
|
23
23
|
import { G as C, Q as se, j as ce, w as le } from "../../node_modules/web-vitals/dist/web-vitals.js";
|
|
24
24
|
import { ProfileI18nBridge as ue } from "./shell/ProfileI18nBridge.js";
|
|
@@ -777,7 +777,7 @@ function Be({ config: e, children: r, clearAuthStore: i }) {
|
|
|
777
777
|
appEnv: B.appEnv,
|
|
778
778
|
sourceMfe: s,
|
|
779
779
|
children: /* @__PURE__ */ q(_, {
|
|
780
|
-
FallbackComponent:
|
|
780
|
+
FallbackComponent: ie,
|
|
781
781
|
children: /* @__PURE__ */ J(ge, { children: [/* @__PURE__ */ q(ze, {
|
|
782
782
|
config: B,
|
|
783
783
|
productSlug: s,
|
|
@@ -786,7 +786,7 @@ function Be({ config: e, children: r, clearAuthStore: i }) {
|
|
|
786
786
|
rybbitSkipRoutes: F
|
|
787
787
|
}), /* @__PURE__ */ q(be, {
|
|
788
788
|
client: Te,
|
|
789
|
-
children: /* @__PURE__ */ q(
|
|
789
|
+
children: /* @__PURE__ */ q(re, { children: /* @__PURE__ */ q(oe, {
|
|
790
790
|
workspaceBaseUrl: S.workspaceBaseUrl,
|
|
791
791
|
globalBaseUrl: S.globalBaseUrl,
|
|
792
792
|
organizationId: we,
|
|
@@ -812,7 +812,7 @@ function Be({ config: e, children: r, clearAuthStore: i }) {
|
|
|
812
812
|
},
|
|
813
813
|
children: /* @__PURE__ */ q(m, {
|
|
814
814
|
syncToUrl: !0,
|
|
815
|
-
children: /* @__PURE__ */ q(
|
|
815
|
+
children: /* @__PURE__ */ q(ae, { children: /* @__PURE__ */ q(Fe, {
|
|
816
816
|
i18nProductId: y,
|
|
817
817
|
platformI18nProductId: b,
|
|
818
818
|
directionMode: z,
|
|
@@ -16,9 +16,10 @@ import { QuotaMeter as A } from "./shared/components/QuotaMeter.js";
|
|
|
16
16
|
import { UPGRADE_PROMPT_EVENT as j, UpgradePromptModal as M, dispatchUpgradePrompt as N } from "./shared/components/UpgradePromptModal.js";
|
|
17
17
|
import { UpgradeInlineBanner as P } from "./shared/components/UpgradeInlineBanner.js";
|
|
18
18
|
import { DEFAULT_QUOTA_UPGRADE_COPY as F, QuotaUpgradeBridge as I, captureQuotaDialogOwners as L, claimQuotaDialog as R, dispatchProductQuotaExhausted as z, quotaEventKind as B, resolveQuotaUpgradeCopy as V, useQuotaDialogOwnership as H, useQuotaUpgradeBridge as U, withQuotaDialogOwnership as W } from "./shared/components/QuotaUpgradeBridge.js";
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
19
|
+
import { DocsLink as G, PUBLIC_PRODUCT_DOCS_URL_QUERY as K, fetchRegistryDocsUrl as q, readRegistryDocsUrl as J, useProductDocsOrigin as Y, useProductDocsUrl as X } from "./shared/components/DocsLink.js";
|
|
20
|
+
import { LandingGateView as Z, LandingOrDashboardRedirect as Q, hasStoredValidSession as $, resolveLandingGate as ee } from "./shared/components/LandingOrDashboardRedirect.js";
|
|
21
|
+
import { useVoiceInput as te } from "./shared/components/assistantWidget/useVoiceInput.js";
|
|
22
|
+
import { ASSISTANT_WIDGET_TOGGLE_EVENT as ne, AssistantWidget as re } from "./shared/components/assistantWidget/AssistantWidget.js";
|
|
23
|
+
import { Markdown as ie } from "./shared/components/Markdown.js";
|
|
24
|
+
import { DesktopUpdateToast as ae } from "./shared/components/DesktopUpdateToast.js";
|
|
25
|
+
export { ne as ASSISTANT_WIDGET_TOGGLE_EVENT, v as AccessDenied, D as AppErrorBoundary, re as AssistantWidget, T as ConditionalShell, O as ContextConversationWidget, F as DEFAULT_QUOTA_UPGRADE_COPY, ae as DesktopUpdateToast, G as DocsLink, f as ErrorBoundary, b as ErrorFallback, k as KeyboardHelpDialogWrapper, Z as LandingGateView, Q as LandingOrDashboardRedirect, x as LoadingFallback, o as MAIN_CONTENT_ID, s as MainLandmark, ie as Markdown, w as MicrofrontendErrorBoundary, K as PUBLIC_PRODUCT_DOCS_URL_QUERY, E as PWAInstallBanner, S as PageLoadingFallback, h as PermissionButton, y as PermissionDenied, g as PermissionGate, _ as PermissionLink, c as PublicLayout, A as QuotaMeter, I as QuotaUpgradeBridge, p as RequireAuth, m as RequireGuest, e as SSORedirectSpinner, C as SectionLoadingFallback, l as SkipToContentLink, j as UPGRADE_PROMPT_EVENT, P as UpgradeInlineBanner, M as UpgradePromptModal, L as captureQuotaDialogOwners, t as checkRemoteSLO, n as checkSLO, R as claimQuotaDialog, r as clearLocalAuthState, z as dispatchProductQuotaExhausted, N as dispatchUpgradePrompt, q as fetchRegistryDocsUrl, u as focusSkipTarget, i as getSSORedirectUrl, $ as hasStoredValidSession, B as quotaEventKind, J as readRegistryDocsUrl, a as redirectToSSO, ee as resolveLandingGate, V as resolveQuotaUpgradeCopy, d as useInsideMainLandmark, Y as useProductDocsOrigin, X as useProductDocsUrl, H as useQuotaDialogOwnership, U as useQuotaUpgradeBridge, te as useVoiceInput, W as withQuotaDialogOwnership };
|
package/dist/shared-config.js
CHANGED
|
@@ -2,9 +2,10 @@ import { resolveGatewayUrls as e } from "./shared/config/gatewayUrls.js";
|
|
|
2
2
|
import { resolveAuthBridgeConfig as t, resolveShellAuthBridgeConfig as n } from "./shared/config/authBridgeUrls.js";
|
|
3
3
|
import { PRODUCT_SLUG_EMIT as r, PRODUCT_SLUG_RENAMES as i, emitProductSlug as a, isSameProductSlug as o, legacyProductSlug as s, normalizeProductSlug as c } from "./shared/config/productSlug.js";
|
|
4
4
|
import { BOTMANOR_PRODUCT_SLUG as l, PRODUCTS as u, PRODUCT_URLS as d, findProductConfig as f, getProductUrl as p, getProductsWithUrls as m } from "./shared/config/products.js";
|
|
5
|
-
import {
|
|
5
|
+
import { CANONICAL_DOCS_HOSTS as h, buildProductDocsUrl as g, canonicalizeDocsOrigin as _, getCatalogDocsOrigin as v, normalizeDocsPath as y, resolveDocsEnvironment as b, resolveProductDocsOrigin as x, toEnvironmentDocsOrigin as S, toTrustedDocsOrigin as C } from "./shared/config/docsUrls.js";
|
|
6
|
+
import { COMMON_SHELL_LESS_ROUTES as w, DEFAULT_SHELL_CONFIG as T, getShellConfig as E, isShellLessRoute as D, shouldShowBreadcrumb as O, shouldShowSidebar as k } from "./shared/config/shellRoutes.js";
|
|
6
7
|
//#region src/shared/config/index.ts
|
|
7
|
-
var
|
|
8
|
+
var A = 20, j = {
|
|
8
9
|
workspace: {
|
|
9
10
|
defaultBaseUrl: "https://gw-wspace.local.burdenoff.com",
|
|
10
11
|
graphql: "/workspaces/graphql",
|
|
@@ -17,18 +18,18 @@ var x = 20, S = {
|
|
|
17
18
|
ws: "/global/graphql/ws"
|
|
18
19
|
}
|
|
19
20
|
};
|
|
20
|
-
function
|
|
21
|
+
function M(e, t) {
|
|
21
22
|
let n = e.endsWith("/") ? e.slice(0, -1) : e;
|
|
22
23
|
return t === "workspaces" ? `${n}/workspaces/graphql` : `${n}/global/graphql`;
|
|
23
24
|
}
|
|
24
|
-
function
|
|
25
|
-
return
|
|
25
|
+
function N(e) {
|
|
26
|
+
return j[e];
|
|
26
27
|
}
|
|
27
|
-
function
|
|
28
|
-
let n =
|
|
28
|
+
function P(e, t) {
|
|
29
|
+
let n = j[t], r = e || F(t) || n.defaultBaseUrl;
|
|
29
30
|
return `${r.endsWith("/") ? r.slice(0, -1) : r}${n.graphql}`;
|
|
30
31
|
}
|
|
31
|
-
function
|
|
32
|
+
function F(t) {
|
|
32
33
|
try {
|
|
33
34
|
let n = e();
|
|
34
35
|
return t === "workspace" ? n.workspaceBaseUrl : n.globalBaseUrl;
|
|
@@ -37,4 +38,4 @@ function E(t) {
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
//#endregion
|
|
40
|
-
export { l as BOTMANOR_PRODUCT_SLUG, h as COMMON_SHELL_LESS_ROUTES,
|
|
41
|
+
export { l as BOTMANOR_PRODUCT_SLUG, h as CANONICAL_DOCS_HOSTS, w as COMMON_SHELL_LESS_ROUTES, A as DEFAULT_PAGE_SIZE, T as DEFAULT_SHELL_CONFIG, j as GATEWAYS, u as PRODUCTS, r as PRODUCT_SLUG_EMIT, i as PRODUCT_SLUG_RENAMES, d as PRODUCT_URLS, g as buildProductDocsUrl, _ as canonicalizeDocsOrigin, a as emitProductSlug, f as findProductConfig, v as getCatalogDocsOrigin, N as getGatewayConfig, P as getGatewayUrl, M as getGraphQLEndpoint, p as getProductUrl, m as getProductsWithUrls, E as getShellConfig, o as isSameProductSlug, D as isShellLessRoute, s as legacyProductSlug, y as normalizeDocsPath, c as normalizeProductSlug, t as resolveAuthBridgeConfig, b as resolveDocsEnvironment, e as resolveGatewayUrls, x as resolveProductDocsOrigin, n as resolveShellAuthBridgeConfig, O as shouldShowBreadcrumb, k as shouldShowSidebar, S as toEnvironmentDocsOrigin, C as toTrustedDocsOrigin };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FeatureFlagProvider as e, useFeatureFlags as t } from "./shared/feature-flags/FeatureFlagProvider.js";
|
|
2
|
-
import { useFeatureFlag as
|
|
3
|
-
import { FeatureGate as
|
|
4
|
-
export { e as FeatureFlagProvider,
|
|
1
|
+
import { FeatureFlagProvider as e, useFeatureFlags as t, useOptionalFeatureFlags as n } from "./shared/feature-flags/FeatureFlagProvider.js";
|
|
2
|
+
import { useFeatureFlag as r, useFeatureFlagDetails as i, useFeatureFlagValue as a, useOptionalFeatureFlag as o } from "./shared/feature-flags/useFeatureFlag.js";
|
|
3
|
+
import { FeatureGate as s } from "./shared/feature-flags/FeatureGate.js";
|
|
4
|
+
export { e as FeatureFlagProvider, s as FeatureGate, r as useFeatureFlag, i as useFeatureFlagDetails, a as useFeatureFlagValue, t as useFeatureFlags, o as useOptionalFeatureFlag, n as useOptionalFeatureFlags };
|