@cobaltcore-dev/aurora 2.1.1 → 2.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.
Files changed (173) hide show
  1. package/README.md +31 -25
  2. package/dist/client/AuroraApp.d.ts +9 -2
  3. package/dist/client/context/AppConfigContext.d.ts +44 -0
  4. package/dist/client/index.d.ts +2 -0
  5. package/dist/client/index.js +41221 -845
  6. package/dist/client/index.js.map +1 -1
  7. package/dist/client/trpcClient.d.ts +314 -0
  8. package/dist/client/utils/appConfigGating.d.ts +21 -0
  9. package/dist/server/index.d.ts +694 -3
  10. package/dist/server/index.js +1748 -722
  11. package/package.json +3 -3
  12. package/dist/client/AuthProvider-CVSAwW9f.mjs +0 -83
  13. package/dist/client/AuthProvider-CVSAwW9f.mjs.map +0 -1
  14. package/dist/client/ContentHeader-fKKZVu-o.mjs +0 -116
  15. package/dist/client/ContentHeader-fKKZVu-o.mjs.map +0 -1
  16. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +0 -724
  17. package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +0 -1
  18. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs +0 -26
  19. package/dist/client/DynamicBreadcrumbContext-CVcUQFou.mjs.map +0 -1
  20. package/dist/client/FiltersInput-Becwxo_J.mjs +0 -85
  21. package/dist/client/FiltersInput-Becwxo_J.mjs.map +0 -1
  22. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs +0 -466
  23. package/dist/client/FloatingIpActionModals-Cq10WljB.mjs.map +0 -1
  24. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs +0 -26
  25. package/dist/client/RouteIdLevelDefaultError-DPF_x2tG.mjs.map +0 -1
  26. package/dist/client/Slot-CWb612-_.mjs +0 -28
  27. package/dist/client/Slot-CWb612-_.mjs.map +0 -1
  28. package/dist/client/SortInput-4g7nSTHW.mjs +0 -34
  29. package/dist/client/SortInput-4g7nSTHW.mjs.map +0 -1
  30. package/dist/client/StorageNotFound-B-zVinVD.mjs +0 -30
  31. package/dist/client/StorageNotFound-B-zVinVD.mjs.map +0 -1
  32. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs +0 -28
  33. package/dist/client/TwoColumnDescriptionList-DKS42RKa.mjs.map +0 -1
  34. package/dist/client/_-CAsCx-Ay.mjs +0 -6
  35. package/dist/client/_-CAsCx-Ay.mjs.map +0 -1
  36. package/dist/client/_auth-SrDjHL6j.mjs +0 -12
  37. package/dist/client/_auth-SrDjHL6j.mjs.map +0 -1
  38. package/dist/client/_flavorId-BPvssEzn.mjs +0 -277
  39. package/dist/client/_flavorId-BPvssEzn.mjs.map +0 -1
  40. package/dist/client/_flavorId-CFUBcU-l.mjs +0 -27
  41. package/dist/client/_flavorId-CFUBcU-l.mjs.map +0 -1
  42. package/dist/client/_flavorId-CZcIp0Ih.mjs +0 -22
  43. package/dist/client/_flavorId-CZcIp0Ih.mjs.map +0 -1
  44. package/dist/client/_floatingIpId-B8r64AL9.mjs +0 -196
  45. package/dist/client/_floatingIpId-B8r64AL9.mjs.map +0 -1
  46. package/dist/client/_floatingIpId-lEobpOER.mjs +0 -26
  47. package/dist/client/_floatingIpId-lEobpOER.mjs.map +0 -1
  48. package/dist/client/_imageId-BAezmV0Y.mjs +0 -526
  49. package/dist/client/_imageId-BAezmV0Y.mjs.map +0 -1
  50. package/dist/client/_imageId-D-jqz3e3.mjs +0 -40
  51. package/dist/client/_imageId-D-jqz3e3.mjs.map +0 -1
  52. package/dist/client/_imageId-gMdrdnVt.mjs +0 -22
  53. package/dist/client/_imageId-gMdrdnVt.mjs.map +0 -1
  54. package/dist/client/_projectId-BYccdAtX.mjs +0 -77
  55. package/dist/client/_projectId-BYccdAtX.mjs.map +0 -1
  56. package/dist/client/_projectId-CBjZC1tv.mjs +0 -283
  57. package/dist/client/_projectId-CBjZC1tv.mjs.map +0 -1
  58. package/dist/client/_projectId-CLEa1zgw.mjs +0 -30
  59. package/dist/client/_projectId-CLEa1zgw.mjs.map +0 -1
  60. package/dist/client/_projectId-D3VOH5lN.mjs +0 -94
  61. package/dist/client/_projectId-D3VOH5lN.mjs.map +0 -1
  62. package/dist/client/_securityGroupId-BwgZnoiR.mjs +0 -29
  63. package/dist/client/_securityGroupId-BwgZnoiR.mjs.map +0 -1
  64. package/dist/client/_securityGroupId-Cz2NUHdB.mjs +0 -1819
  65. package/dist/client/_securityGroupId-Cz2NUHdB.mjs.map +0 -1
  66. package/dist/client/_serviceType-DS8DxsrP.mjs +0 -20
  67. package/dist/client/_serviceType-DS8DxsrP.mjs.map +0 -1
  68. package/dist/client/_serviceType-M8d9rOT6.mjs +0 -6
  69. package/dist/client/_serviceType-M8d9rOT6.mjs.map +0 -1
  70. package/dist/client/_storageType-BNpP1A2N.mjs +0 -13
  71. package/dist/client/_storageType-BNpP1A2N.mjs.map +0 -1
  72. package/dist/client/_storageType-BxSGKhAI.mjs +0 -15
  73. package/dist/client/_storageType-BxSGKhAI.mjs.map +0 -1
  74. package/dist/client/_storageType-DZYCmiLt.mjs +0 -30
  75. package/dist/client/_storageType-DZYCmiLt.mjs.map +0 -1
  76. package/dist/client/_storageType-UqAMP-8d.mjs +0 -859
  77. package/dist/client/_storageType-UqAMP-8d.mjs.map +0 -1
  78. package/dist/client/_storageType-u51_7OwJ.mjs +0 -7
  79. package/dist/client/_storageType-u51_7OwJ.mjs.map +0 -1
  80. package/dist/client/about-BmQTyLWc.mjs +0 -92
  81. package/dist/client/about-BmQTyLWc.mjs.map +0 -1
  82. package/dist/client/assets/__mocks__/svgMock.d.ts +0 -3
  83. package/dist/client/aurora-CIml-f2f.mjs +0 -19
  84. package/dist/client/aurora-CIml-f2f.mjs.map +0 -1
  85. package/dist/client/build-WuxXRAqf.mjs +0 -14530
  86. package/dist/client/build-WuxXRAqf.mjs.map +0 -1
  87. package/dist/client/cn-DM4Cy3jv.mjs +0 -10
  88. package/dist/client/cn-DM4Cy3jv.mjs.map +0 -1
  89. package/dist/client/flavors-CJVSNz6R.mjs +0 -15
  90. package/dist/client/flavors-CJVSNz6R.mjs.map +0 -1
  91. package/dist/client/flavors-CflJDIEH.mjs +0 -667
  92. package/dist/client/flavors-CflJDIEH.mjs.map +0 -1
  93. package/dist/client/flavors-DWMZ6TuJ.mjs +0 -8
  94. package/dist/client/flavors-DWMZ6TuJ.mjs.map +0 -1
  95. package/dist/client/floatingips-Cz9k80cc.mjs +0 -8
  96. package/dist/client/floatingips-Cz9k80cc.mjs.map +0 -1
  97. package/dist/client/floatingips-DXnRlLvV.mjs +0 -551
  98. package/dist/client/floatingips-DXnRlLvV.mjs.map +0 -1
  99. package/dist/client/floatingips-HRbuLxiN.mjs +0 -22
  100. package/dist/client/floatingips-HRbuLxiN.mjs.map +0 -1
  101. package/dist/client/floatingips-nN1kQmsu.mjs +0 -14
  102. package/dist/client/floatingips-nN1kQmsu.mjs.map +0 -1
  103. package/dist/client/formatBytes-CZv_XyCY.mjs +0 -38
  104. package/dist/client/formatBytes-CZv_XyCY.mjs.map +0 -1
  105. package/dist/client/helpers-1PpYf-fC.mjs +0 -6
  106. package/dist/client/helpers-1PpYf-fC.mjs.map +0 -1
  107. package/dist/client/hooks-D0yKIumu.mjs +0 -22
  108. package/dist/client/hooks-D0yKIumu.mjs.map +0 -1
  109. package/dist/client/imageHelpers-DBhL2ebL.mjs +0 -1272
  110. package/dist/client/imageHelpers-DBhL2ebL.mjs.map +0 -1
  111. package/dist/client/images-BsylWUiH.mjs +0 -2011
  112. package/dist/client/images-BsylWUiH.mjs.map +0 -1
  113. package/dist/client/images-NBf2bV43.mjs +0 -8
  114. package/dist/client/images-NBf2bV43.mjs.map +0 -1
  115. package/dist/client/images-zQq1nSVv.mjs +0 -15
  116. package/dist/client/images-zQq1nSVv.mjs.map +0 -1
  117. package/dist/client/md-kvaGCNAK.mjs +0 -336
  118. package/dist/client/md-kvaGCNAK.mjs.map +0 -1
  119. package/dist/client/network-DuZm76BZ.mjs +0 -8
  120. package/dist/client/network-DuZm76BZ.mjs.map +0 -1
  121. package/dist/client/objects-BudUAfWY.mjs +0 -12909
  122. package/dist/client/objects-BudUAfWY.mjs.map +0 -1
  123. package/dist/client/objects-Dc7sKUr8.mjs +0 -67
  124. package/dist/client/objects-Dc7sKUr8.mjs.map +0 -1
  125. package/dist/client/objects-Dw7oeTq2.mjs +0 -80
  126. package/dist/client/objects-Dw7oeTq2.mjs.map +0 -1
  127. package/dist/client/objects-_g7nGIn5.mjs +0 -25
  128. package/dist/client/objects-_g7nGIn5.mjs.map +0 -1
  129. package/dist/client/objects-eBxvY6_n.mjs +0 -78
  130. package/dist/client/objects-eBxvY6_n.mjs.map +0 -1
  131. package/dist/client/projects-yiK0HGSA.mjs +0 -7
  132. package/dist/client/projects-yiK0HGSA.mjs.map +0 -1
  133. package/dist/client/routeInfo-DP3v74Wg.mjs +0 -19
  134. package/dist/client/routeInfo-DP3v74Wg.mjs.map +0 -1
  135. package/dist/client/routes-CJj7SR_K.mjs +0 -10
  136. package/dist/client/routes-CJj7SR_K.mjs.map +0 -1
  137. package/dist/client/routes-xofA3ksU.mjs +0 -110
  138. package/dist/client/routes-xofA3ksU.mjs.map +0 -1
  139. package/dist/client/securitygroups-CSmsBzUb.mjs +0 -581
  140. package/dist/client/securitygroups-CSmsBzUb.mjs.map +0 -1
  141. package/dist/client/securitygroups-CtKne8UQ.mjs +0 -8
  142. package/dist/client/securitygroups-CtKne8UQ.mjs.map +0 -1
  143. package/dist/client/securitygroups-T7kaNFEp.mjs +0 -15
  144. package/dist/client/securitygroups-T7kaNFEp.mjs.map +0 -1
  145. package/dist/client/securitygroups-WLB1_IM6.mjs +0 -22
  146. package/dist/client/securitygroups-WLB1_IM6.mjs.map +0 -1
  147. package/dist/client/securitygroups-o0IXZM6S.mjs +0 -14
  148. package/dist/client/securitygroups-o0IXZM6S.mjs.map +0 -1
  149. package/dist/client/serviceCatalog-B3lKWC9V.mjs +0 -6
  150. package/dist/client/serviceCatalog-B3lKWC9V.mjs.map +0 -1
  151. package/dist/client/services-D1PbooD1.mjs +0 -6
  152. package/dist/client/services-D1PbooD1.mjs.map +0 -1
  153. package/dist/client/services-DEMVtFyn.mjs +0 -9
  154. package/dist/client/services-DEMVtFyn.mjs.map +0 -1
  155. package/dist/client/storageProviders-CJ5rOh13.mjs +0 -15
  156. package/dist/client/storageProviders-CJ5rOh13.mjs.map +0 -1
  157. package/dist/client/trpcClient-D7gpR7YG.mjs +0 -71
  158. package/dist/client/trpcClient-D7gpR7YG.mjs.map +0 -1
  159. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs +0 -54
  160. package/dist/client/useBreadcrumbs-ha3IlaxX.mjs.map +0 -1
  161. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +0 -83
  162. package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +0 -1
  163. package/dist/client/useModal-DCs1OJh7.mjs +0 -12
  164. package/dist/client/useModal-DCs1OJh7.mjs.map +0 -1
  165. package/dist/client/useModalTracking-BYd37pXm.mjs +0 -37
  166. package/dist/client/useModalTracking-BYd37pXm.mjs.map +0 -1
  167. package/dist/client/useProjectId-DBc5lpoU.mjs +0 -11
  168. package/dist/client/useProjectId-DBc5lpoU.mjs.map +0 -1
  169. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs +0 -294
  170. package/dist/client/useSecurityGroupPermissions--hK4aR8Y.mjs.map +0 -1
  171. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs +0 -19
  172. package/dist/client/useSetBreadcrumb-tn7lBaQV.mjs.map +0 -1
  173. package/dist/client/utils/trpcErrors.d.ts +0 -13
package/README.md CHANGED
@@ -52,20 +52,21 @@ export function App() {
52
52
 
53
53
  ### `createServer(config)`
54
54
 
55
- | Option | Type | Required | Default | Description |
56
- | --------------------------------- | ------------- | -------- | -------------------------- | ---------------------------------------------------------------- |
57
- | `identityEndpoint` | `string` | yes | — | OpenStack Keystone v3 URL |
58
- | `policyDir` | `string` | yes | — | Absolute path to a directory of OpenStack policy YAML files |
59
- | `bffEndpoint` | `string` | no | `"/polaris-bff"` | URL prefix for all tRPC routes |
60
- | `viteRoot` | `string` | no | — | Directory that contains `dist/client/` in production |
61
- | `defaultEndpointInterface` | `string` | no | `"public"` | OpenStack service catalog interface |
62
- | `proxyUrl` | `string` | no | — | HTTP proxy for OpenStack calls (dev only, ignored in production) |
63
- | `cephRegion` | `string` | no | — | Ceph RGW region for S3 operations |
64
- | `imageMetadataExcludedProperties` | `string` | no | — | Comma-separated image metadata keys to hide in the UI |
65
- | `cookieName` | `string` | no | `"dashboard-session-auth"` | Override the session cookie name |
66
- | `crossDomainCookie` | `boolean` | no | `true` | Share cookie across subdomains |
67
- | `insecureCookies` | `boolean` | no | `false` | Disable `Secure` flag — only for HTTP-only local dev |
68
- | `routers` | `AnyRouter[]` | no | `[]` | Additional tRPC routers — see [Custom routers](#custom-routers) |
55
+ | Option | Type | Required | Default | Description |
56
+ | --------------------------------- | ----------------- | -------- | -------------------------- | ------------------------------------------------------------------------------------------------- |
57
+ | `identityEndpoint` | `string` | yes | — | OpenStack Keystone v3 URL |
58
+ | `policyDir` | `string` | yes | — | Absolute path to a directory of OpenStack policy YAML files |
59
+ | `bffEndpoint` | `string` | no | `"/polaris-bff"` | URL prefix for all tRPC routes |
60
+ | `viteRoot` | `string` | no | — | Directory that contains `dist/client/` in production |
61
+ | `defaultEndpointInterface` | `string` | no | `"public"` | OpenStack service catalog interface |
62
+ | `proxyUrl` | `string` | no | — | HTTP proxy for OpenStack calls (dev only, ignored in production) |
63
+ | `cephRegion` | `string` | no | — | Ceph RGW region for S3 operations |
64
+ | `imageMetadataExcludedProperties` | `string` | no | — | Comma-separated image metadata keys to hide in the UI |
65
+ | `cookieName` | `string` | no | `"dashboard-session-auth"` | Override the session cookie name |
66
+ | `crossDomainCookie` | `boolean` | no | `true` | Share cookie across subdomains |
67
+ | `insecureCookies` | `boolean` | no | `false` | Disable `Secure` flag — only for HTTP-only local dev |
68
+ | `routers` | `AnyRouter[]` | no | `[]` | Additional tRPC routers — see [Custom routers](#custom-routers) |
69
+ | `appConfig` | `AuroraAppConfig` | no | - | Per-domain service/slot visibility and feature flags; see [App configuration](#app-configuration) |
69
70
 
70
71
  ## Custom routers
71
72
 
@@ -112,6 +113,12 @@ server.get("/healthz", async () => ({ ok: true }))
112
113
  await server.listen({ host: "0.0.0.0", port: 4000 })
113
114
  ```
114
115
 
116
+ ## App configuration
117
+
118
+ `appConfig` controls which services and UI slots are visible and sets feature flags, globally and per domain. When omitted, Aurora is default-open: all catalog services and all registered slots render.
119
+
120
+ See [docs/0015_app_config.md](./docs/0015_app_config.md) for the full reference including visibility fields, domain overrides, allow-beats-deny semantics, and how to load configuration from a YAML file.
121
+
115
122
  ### `<AuroraApp />`
116
123
 
117
124
  | Prop | Type | Default | Description |
@@ -160,17 +167,16 @@ function MyFooter(_props: SlotProps) {
160
167
 
161
168
  ### Available slots
162
169
 
163
- | Slot | Location | `auroraContext` extras | Renders in shadow DOM |
164
- | ----------------------- | ---------------------------------------------------------------------------- | ------------------------------ | --------------------- |
165
- | `logo` | Page header, replacing the default Aurora logo | — | No |
166
- | `sideNavBanner` | Bottom of the project side navigation | — | Yes |
167
- | `pageFooter` | Page footer, replacing the default empty footer | — | No |
168
- | `login` | Replaces the default login form — use in OIDC environments | — | No |
169
- | `serviceBadge` | Inline next to each service label in the side nav and project home cards | `currentService` (service key) | No |
170
- | `servicePageActions` | Beside the page title in the service page header | `currentService` (service key) | No |
171
- | `serviceBanner` | Below the page title divider on every service page | `currentService` (service key) | No |
172
- | `projectsBanner` | Below the "Projects" heading on the projects list page | — | No |
173
- | `projectOverviewBanner` | Below the project description on the project overview page (`/projects/:id`) | — | No |
170
+ | Slot | Location | `auroraContext` extras | Renders in shadow DOM |
171
+ | -------------------- | ------------------------------------------------------------------------ | ------------------------------ | --------------------- |
172
+ | `logo` | Page header, replacing the default Aurora logo | — | No |
173
+ | `sideNavBanner` | Bottom of the project side navigation | — | Yes |
174
+ | `pageFooter` | Page footer, replacing the default empty footer | — | No |
175
+ | `login` | Replaces the default login form — use in OIDC environments | — | No |
176
+ | `serviceBadge` | Inline next to each service label in the side nav and project home cards | `currentService` (service key) | No |
177
+ | `servicePageActions` | Beside the page title in the service page header | `currentService` (service key) | No |
178
+ | `serviceBanner` | Below the page title divider on every service page | `currentService` (service key) | No |
179
+ | `projectsBanner` | Below the "Projects" heading on the projects list page | — | No |
174
180
 
175
181
  The `serviceBadge`, `servicePageActions`, and `serviceBanner` slots receive `auroraContext.currentService` — a string identifying which service is being rendered (e.g. `"images"`, `"ceph-containers"`). Return `null` from these slots to suppress rendering for specific services.
176
182
 
@@ -1,5 +1,6 @@
1
1
  import { FC } from 'react';
2
2
  import { TrpcClient } from './trpcClient';
3
+ import { SlotName } from '../types/appConfig';
3
4
  /** Context object passed to every slot component. */
4
5
  export type SlotProps = {
5
6
  auroraContext: {
@@ -25,11 +26,16 @@ export type Slots = {
25
26
  servicePageActions?: FC<SlotProps>;
26
27
  /** Rendered below the "Projects" heading on the projects list page. Renders outside shadow DOM. */
27
28
  projectsBanner?: FC<SlotProps>;
28
- /** Rendered below the project description on the project overview page (/projects/$projectId). Renders outside shadow DOM. */
29
- projectOverviewBanner?: FC<SlotProps>;
30
29
  /** Rendered below the page title divider on every service page. Receives `auroraContext.currentService`. Renders outside shadow DOM. */
31
30
  serviceBanner?: FC<SlotProps>;
32
31
  };
32
+ /**
33
+ * Compile-time guard: `SlotName` is declared in the JSX-free types module (so the server
34
+ * build can consume it) and must stay identical to the keys of `Slots`. If the two drift,
35
+ * the conditional below resolves to `false` and `Assert<false>` fails to compile.
36
+ */
37
+ type Assert<T extends true> = T;
38
+ export type _SlotNamesInSync = Assert<SlotName extends keyof Slots ? (keyof Slots extends SlotName ? true : false) : false>;
33
39
  /**
34
40
  * Payload for analytics tracking events.
35
41
  * Generic structure that supports multiple event sources (router, links, modals, etc.)
@@ -129,3 +135,4 @@ export type AuroraAppProps = {
129
135
  serviceExtensions?: ServiceExtension[];
130
136
  };
131
137
  export declare const AuroraApp: FC<AuroraAppProps>;
138
+ export {};
@@ -0,0 +1,44 @@
1
+ import { default as React } from 'react';
2
+ import { FeatureBag, ResolvedAppConfig, ServiceFeatureMap } from '../../types/appConfig';
3
+ /**
4
+ * Fetches the resolved domain configuration from the BFF and provides it to the tree.
5
+ *
6
+ * The `appConfig.get` procedure is public: before login it returns the base layer,
7
+ * and once authenticated it returns the base merged with any overrides matching the
8
+ * user's home domain. Because login happens in place (no page reload), we invalidate the
9
+ * query whenever the authenticated identity changes so the domain overrides are picked up.
10
+ *
11
+ * Must be rendered inside `AuthProvider` and the tRPC/React Query providers.
12
+ */
13
+ export declare function AppConfigProvider({ children }: {
14
+ children: React.ReactNode;
15
+ }): React.JSX.Element;
16
+ /** Returns true while the initial appConfig fetch is in-flight. */
17
+ export declare function useIsAppConfigLoading(): boolean;
18
+ /**
19
+ * Returns the appConfig fetch state for rendering a status screen: the error (or null) and
20
+ * a `retry` to refetch. Use alongside {@link useIsAppConfigLoading} for the loading state.
21
+ */
22
+ export declare function useAppConfigStatus(): {
23
+ error: unknown;
24
+ retry: () => void;
25
+ };
26
+ /**
27
+ * Returns the domain configuration resolved for the current user's domain.
28
+ *
29
+ * Return values after the initial fetch completes:
30
+ * - Populated `ResolvedAppConfig` — domain config was supplied and resolved successfully.
31
+ * - Empty object (`{}`) cast to `ResolvedAppConfig` — fetch succeeded but no domain config
32
+ * was configured; all fields will be absent. Test with `Object.keys(config).length === 0`
33
+ * if you need to distinguish this from a populated config.
34
+ * - `undefined` — fetch is still in-flight or has not yet started.
35
+ *
36
+ * Supply the generic parameters to get typed access to your own service and feature shapes:
37
+ * `useAppConfig<MyServices, MyFeatures>()`.
38
+ */
39
+ export declare function useAppConfig<TServices extends ServiceFeatureMap = ServiceFeatureMap, TFeatures extends FeatureBag = FeatureBag>(): ResolvedAppConfig<TServices, TFeatures> | undefined;
40
+ /**
41
+ * Reads a single app-wide feature flag from the resolved domain config.
42
+ * Returns undefined when the flag is unset or the config has not loaded yet.
43
+ */
44
+ export declare function useFeature<T = boolean>(key: string): T | undefined;
@@ -2,6 +2,8 @@ export { AuroraApp, type AuroraAppProps, type Slots, type SlotProps, type TrackE
2
2
  export { type TrpcClient, type TrpcReact, type CreateTypedTrpcReact, type CreateTypedTrpcClient, trpcClient, trpcReactClient, trpcReact, } from './trpcClient';
3
3
  export { useAuth } from './store/AuthProvider';
4
4
  export { useDomainId, useScope } from './hooks';
5
+ export { AppConfigProvider, useAppConfig, useFeature, useIsAppConfigLoading } from './context/AppConfigContext';
6
+ export type { AuroraAppConfig, AppConfigBase, DomainOverride, ResolvedAppConfig, Visibility, VisibilityDelta, SlotConfigEntry, ServiceFeatureMap, FeatureBag, SlotName, } from '../types/appConfig';
5
7
  export type { RouteInfo, Crumb } from './routes/routeInfo';
6
8
  export { isRouteInfo } from './routes/routeInfo';
7
9
  export { usePushBreadcrumbs } from './hooks/usePushBreadcrumbs';