@miragon/pulse-widget-shell 0.0.0-bootstrap.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +163 -3
- package/dist/adapt-data-widget.d.ts +7 -0
- package/dist/adapt-data-widget.d.ts.map +1 -0
- package/dist/adapt-data-widget.js +7 -0
- package/dist/adapt-data-widget.js.map +1 -0
- package/dist/bpmn-names.d.ts +42 -0
- package/dist/bpmn-names.d.ts.map +1 -0
- package/dist/bpmn-names.js +151 -0
- package/dist/bpmn-names.js.map +1 -0
- package/dist/bpmn-names.test.d.ts +2 -0
- package/dist/bpmn-names.test.d.ts.map +1 -0
- package/dist/bpmn-names.test.js +143 -0
- package/dist/bpmn-names.test.js.map +1 -0
- package/dist/build-data-feed-result.test.d.ts +2 -0
- package/dist/build-data-feed-result.test.d.ts.map +1 -0
- package/dist/build-data-feed-result.test.js +28 -0
- package/dist/build-data-feed-result.test.js.map +1 -0
- package/dist/build-single-widget-view.test.d.ts +2 -0
- package/dist/build-single-widget-view.test.d.ts.map +1 -0
- package/dist/build-single-widget-view.test.js +136 -0
- package/dist/build-single-widget-view.test.js.map +1 -0
- package/dist/builder-texts.d.ts +27 -0
- package/dist/builder-texts.d.ts.map +1 -0
- package/dist/builder-texts.js +32 -0
- package/dist/builder-texts.js.map +1 -0
- package/dist/builder-texts.test.d.ts +2 -0
- package/dist/builder-texts.test.d.ts.map +1 -0
- package/dist/builder-texts.test.js +54 -0
- package/dist/builder-texts.test.js.map +1 -0
- package/dist/catalogue-sync.d.ts +18 -0
- package/dist/catalogue-sync.d.ts.map +1 -0
- package/dist/catalogue-sync.js +31 -0
- package/dist/catalogue-sync.js.map +1 -0
- package/dist/catalogue-sync.test.d.ts +2 -0
- package/dist/catalogue-sync.test.d.ts.map +1 -0
- package/dist/catalogue-sync.test.js +22 -0
- package/dist/catalogue-sync.test.js.map +1 -0
- package/dist/composed-server.d.ts +110 -0
- package/dist/composed-server.d.ts.map +1 -0
- package/dist/composed-server.edge.test.d.ts +2 -0
- package/dist/composed-server.edge.test.d.ts.map +1 -0
- package/dist/composed-server.edge.test.js +184 -0
- package/dist/composed-server.edge.test.js.map +1 -0
- package/dist/composed-server.fonts.test.d.ts +2 -0
- package/dist/composed-server.fonts.test.d.ts.map +1 -0
- package/dist/composed-server.fonts.test.js +186 -0
- package/dist/composed-server.fonts.test.js.map +1 -0
- package/dist/composed-server.js +260 -0
- package/dist/composed-server.js.map +1 -0
- package/dist/composed-server.test.d.ts +2 -0
- package/dist/composed-server.test.d.ts.map +1 -0
- package/dist/composed-server.test.js +332 -0
- package/dist/composed-server.test.js.map +1 -0
- package/dist/composition.d.ts +155 -0
- package/dist/composition.d.ts.map +1 -0
- package/dist/composition.js +163 -0
- package/dist/composition.js.map +1 -0
- package/dist/composition.test.d.ts +2 -0
- package/dist/composition.test.d.ts.map +1 -0
- package/dist/composition.test.js +275 -0
- package/dist/composition.test.js.map +1 -0
- package/dist/dashboard-store-postgres.d.ts +43 -0
- package/dist/dashboard-store-postgres.d.ts.map +1 -0
- package/dist/dashboard-store-postgres.js +225 -0
- package/dist/dashboard-store-postgres.js.map +1 -0
- package/dist/dashboard-store-postgres.test.d.ts +2 -0
- package/dist/dashboard-store-postgres.test.d.ts.map +1 -0
- package/dist/dashboard-store-postgres.test.js +272 -0
- package/dist/dashboard-store-postgres.test.js.map +1 -0
- package/dist/font-assets.d.ts +47 -0
- package/dist/font-assets.d.ts.map +1 -0
- package/dist/font-assets.js +93 -0
- package/dist/font-assets.js.map +1 -0
- package/dist/font-assets.test.d.ts +2 -0
- package/dist/font-assets.test.d.ts.map +1 -0
- package/dist/font-assets.test.js +123 -0
- package/dist/font-assets.test.js.map +1 -0
- package/dist/health.d.ts +59 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +74 -0
- package/dist/health.js.map +1 -0
- package/dist/health.test.d.ts +2 -0
- package/dist/health.test.d.ts.map +1 -0
- package/dist/health.test.js +140 -0
- package/dist/health.test.js.map +1 -0
- package/dist/host-boot.d.ts +56 -0
- package/dist/host-boot.d.ts.map +1 -0
- package/dist/host-boot.js +64 -0
- package/dist/host-boot.js.map +1 -0
- package/dist/host-boot.test.d.ts +2 -0
- package/dist/host-boot.test.d.ts.map +1 -0
- package/dist/host-boot.test.js +59 -0
- package/dist/host-boot.test.js.map +1 -0
- package/dist/http-edge.d.ts +117 -0
- package/dist/http-edge.d.ts.map +1 -0
- package/dist/http-edge.js +219 -0
- package/dist/http-edge.js.map +1 -0
- package/dist/http-edge.test.d.ts +2 -0
- package/dist/http-edge.test.d.ts.map +1 -0
- package/dist/http-edge.test.js +255 -0
- package/dist/http-edge.test.js.map +1 -0
- package/dist/metrics.d.ts +48 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +124 -0
- package/dist/metrics.js.map +1 -0
- package/dist/metrics.test.d.ts +2 -0
- package/dist/metrics.test.d.ts.map +1 -0
- package/dist/metrics.test.js +154 -0
- package/dist/metrics.test.js.map +1 -0
- package/dist/node-listener.d.ts +61 -0
- package/dist/node-listener.d.ts.map +1 -0
- package/dist/node-listener.js +165 -0
- package/dist/node-listener.js.map +1 -0
- package/dist/node-listener.test.d.ts +2 -0
- package/dist/node-listener.test.d.ts.map +1 -0
- package/dist/node-listener.test.js +331 -0
- package/dist/node-listener.test.js.map +1 -0
- package/dist/oauth-env.d.ts +42 -0
- package/dist/oauth-env.d.ts.map +1 -0
- package/dist/oauth-env.js +78 -0
- package/dist/oauth-env.js.map +1 -0
- package/dist/oauth-env.test.d.ts +2 -0
- package/dist/oauth-env.test.d.ts.map +1 -0
- package/dist/oauth-env.test.js +76 -0
- package/dist/oauth-env.test.js.map +1 -0
- package/dist/postgres.d.ts +59 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +80 -0
- package/dist/postgres.js.map +1 -0
- package/dist/profile-advisory.d.ts +19 -0
- package/dist/profile-advisory.d.ts.map +1 -0
- package/dist/profile-advisory.js +48 -0
- package/dist/profile-advisory.js.map +1 -0
- package/dist/profile-advisory.test.d.ts +2 -0
- package/dist/profile-advisory.test.d.ts.map +1 -0
- package/dist/profile-advisory.test.js +53 -0
- package/dist/profile-advisory.test.js.map +1 -0
- package/dist/profile-constants.d.ts +37 -0
- package/dist/profile-constants.d.ts.map +1 -0
- package/dist/profile-constants.js +37 -0
- package/dist/profile-constants.js.map +1 -0
- package/dist/profile-migrations.d.ts +71 -0
- package/dist/profile-migrations.d.ts.map +1 -0
- package/dist/profile-migrations.js +88 -0
- package/dist/profile-migrations.js.map +1 -0
- package/dist/profile-migrations.test.d.ts +2 -0
- package/dist/profile-migrations.test.d.ts.map +1 -0
- package/dist/profile-migrations.test.js +200 -0
- package/dist/profile-migrations.test.js.map +1 -0
- package/dist/profile-record.d.ts +60 -0
- package/dist/profile-record.d.ts.map +1 -0
- package/dist/profile-record.js +78 -0
- package/dist/profile-record.js.map +1 -0
- package/dist/profile-slice.d.ts +53 -0
- package/dist/profile-slice.d.ts.map +1 -0
- package/dist/profile-slice.js +73 -0
- package/dist/profile-slice.js.map +1 -0
- package/dist/profile-slice.test.d.ts +2 -0
- package/dist/profile-slice.test.d.ts.map +1 -0
- package/dist/profile-slice.test.js +73 -0
- package/dist/profile-slice.test.js.map +1 -0
- package/dist/profile-store-env.d.ts +34 -0
- package/dist/profile-store-env.d.ts.map +1 -0
- package/dist/profile-store-env.js +44 -0
- package/dist/profile-store-env.js.map +1 -0
- package/dist/profile-store-env.test.d.ts +2 -0
- package/dist/profile-store-env.test.d.ts.map +1 -0
- package/dist/profile-store-env.test.js +69 -0
- package/dist/profile-store-env.test.js.map +1 -0
- package/dist/profile-store-postgres.d.ts +33 -0
- package/dist/profile-store-postgres.d.ts.map +1 -0
- package/dist/profile-store-postgres.js +87 -0
- package/dist/profile-store-postgres.js.map +1 -0
- package/dist/profile-store-raw.test.d.ts +2 -0
- package/dist/profile-store-raw.test.d.ts.map +1 -0
- package/dist/profile-store-raw.test.js +185 -0
- package/dist/profile-store-raw.test.js.map +1 -0
- package/dist/profile-store.d.ts +85 -0
- package/dist/profile-store.d.ts.map +1 -0
- package/dist/profile-store.js +182 -0
- package/dist/profile-store.js.map +1 -0
- package/dist/profile-store.test.d.ts +2 -0
- package/dist/profile-store.test.d.ts.map +1 -0
- package/dist/profile-store.test.js +353 -0
- package/dist/profile-store.test.js.map +1 -0
- package/dist/profile.d.ts +75 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +85 -0
- package/dist/profile.js.map +1 -0
- package/dist/profile.test.d.ts +2 -0
- package/dist/profile.test.d.ts.map +1 -0
- package/dist/profile.test.js +71 -0
- package/dist/profile.test.js.map +1 -0
- package/dist/request-context.d.ts +47 -0
- package/dist/request-context.d.ts.map +1 -0
- package/dist/request-context.js +85 -0
- package/dist/request-context.js.map +1 -0
- package/dist/request-context.test.d.ts +2 -0
- package/dist/request-context.test.d.ts.map +1 -0
- package/dist/request-context.test.js +107 -0
- package/dist/request-context.test.js.map +1 -0
- package/dist/served-fonts.d.ts +38 -0
- package/dist/served-fonts.d.ts.map +1 -0
- package/dist/served-fonts.js +51 -0
- package/dist/served-fonts.js.map +1 -0
- package/dist/served-fonts.test.d.ts +2 -0
- package/dist/served-fonts.test.d.ts.map +1 -0
- package/dist/served-fonts.test.js +30 -0
- package/dist/served-fonts.test.js.map +1 -0
- package/dist/server-locale.d.ts +58 -0
- package/dist/server-locale.d.ts.map +1 -0
- package/dist/server-locale.js +64 -0
- package/dist/server-locale.js.map +1 -0
- package/dist/server-locale.test.d.ts +2 -0
- package/dist/server-locale.test.d.ts.map +1 -0
- package/dist/server-locale.test.js +90 -0
- package/dist/server-locale.test.js.map +1 -0
- package/dist/server.d.ts +43 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +34 -0
- package/dist/server.js.map +1 -0
- package/dist/shell-catalogue.d.ts +12 -0
- package/dist/shell-catalogue.d.ts.map +1 -0
- package/dist/shell-catalogue.js +142 -0
- package/dist/shell-catalogue.js.map +1 -0
- package/dist/shell-settings-contract.d.ts +34 -0
- package/dist/shell-settings-contract.d.ts.map +1 -0
- package/dist/shell-settings-contract.js +21 -0
- package/dist/shell-settings-contract.js.map +1 -0
- package/dist/shell-settings.d.ts +24 -0
- package/dist/shell-settings.d.ts.map +1 -0
- package/dist/shell-settings.js +148 -0
- package/dist/shell-settings.js.map +1 -0
- package/dist/shell-settings.test.d.ts +2 -0
- package/dist/shell-settings.test.d.ts.map +1 -0
- package/dist/shell-settings.test.js +115 -0
- package/dist/shell-settings.test.js.map +1 -0
- package/dist/testing/catalog-text.d.ts +53 -0
- package/dist/testing/catalog-text.d.ts.map +1 -0
- package/dist/testing/catalog-text.js +146 -0
- package/dist/testing/catalog-text.js.map +1 -0
- package/dist/testing/catalog-text.test.d.ts +2 -0
- package/dist/testing/catalog-text.test.d.ts.map +1 -0
- package/dist/testing/catalog-text.test.js +137 -0
- package/dist/testing/catalog-text.test.js.map +1 -0
- package/dist/testing/colors.d.ts +34 -0
- package/dist/testing/colors.d.ts.map +1 -0
- package/dist/testing/colors.js +124 -0
- package/dist/testing/colors.js.map +1 -0
- package/dist/testing/colors.test.d.ts +2 -0
- package/dist/testing/colors.test.d.ts.map +1 -0
- package/dist/testing/colors.test.js +166 -0
- package/dist/testing/colors.test.js.map +1 -0
- package/dist/testing/contrast.d.ts +77 -0
- package/dist/testing/contrast.d.ts.map +1 -0
- package/dist/testing/contrast.js +382 -0
- package/dist/testing/contrast.js.map +1 -0
- package/dist/testing/contrast.test.d.ts +2 -0
- package/dist/testing/contrast.test.d.ts.map +1 -0
- package/dist/testing/contrast.test.js +230 -0
- package/dist/testing/contrast.test.js.map +1 -0
- package/dist/testing/display-texts.d.ts +23 -0
- package/dist/testing/display-texts.d.ts.map +1 -0
- package/dist/testing/display-texts.js +88 -0
- package/dist/testing/display-texts.js.map +1 -0
- package/dist/testing/display-texts.test.d.ts +2 -0
- package/dist/testing/display-texts.test.d.ts.map +1 -0
- package/dist/testing/display-texts.test.js +169 -0
- package/dist/testing/display-texts.test.js.map +1 -0
- package/dist/testing/glossary.d.ts +52 -0
- package/dist/testing/glossary.d.ts.map +1 -0
- package/dist/testing/glossary.js +135 -0
- package/dist/testing/glossary.js.map +1 -0
- package/dist/testing/glossary.test.d.ts +2 -0
- package/dist/testing/glossary.test.d.ts.map +1 -0
- package/dist/testing/glossary.test.js +78 -0
- package/dist/testing/glossary.test.js.map +1 -0
- package/dist/testing/glyphs.d.ts +27 -0
- package/dist/testing/glyphs.d.ts.map +1 -0
- package/dist/testing/glyphs.js +130 -0
- package/dist/testing/glyphs.js.map +1 -0
- package/dist/testing/glyphs.test.d.ts +2 -0
- package/dist/testing/glyphs.test.d.ts.map +1 -0
- package/dist/testing/glyphs.test.js +146 -0
- package/dist/testing/glyphs.test.js.map +1 -0
- package/dist/testing/icon-sizes.d.ts +22 -0
- package/dist/testing/icon-sizes.d.ts.map +1 -0
- package/dist/testing/icon-sizes.js +39 -0
- package/dist/testing/icon-sizes.js.map +1 -0
- package/dist/testing/icon-sizes.test.d.ts +2 -0
- package/dist/testing/icon-sizes.test.d.ts.map +1 -0
- package/dist/testing/icon-sizes.test.js +36 -0
- package/dist/testing/icon-sizes.test.js.map +1 -0
- package/dist/testing/index.d.ts +40 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +40 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/source-scan.d.ts +16 -0
- package/dist/testing/source-scan.d.ts.map +1 -0
- package/dist/testing/source-scan.js +57 -0
- package/dist/testing/source-scan.js.map +1 -0
- package/dist/testing/tone-pairs.d.ts +20 -0
- package/dist/testing/tone-pairs.d.ts.map +1 -0
- package/dist/testing/tone-pairs.js +154 -0
- package/dist/testing/tone-pairs.js.map +1 -0
- package/dist/testing/type-scale.d.ts +40 -0
- package/dist/testing/type-scale.d.ts.map +1 -0
- package/dist/testing/type-scale.js +55 -0
- package/dist/testing/type-scale.js.map +1 -0
- package/dist/testing/type-scale.test.d.ts +2 -0
- package/dist/testing/type-scale.test.d.ts.map +1 -0
- package/dist/testing/type-scale.test.js +61 -0
- package/dist/testing/type-scale.test.js.map +1 -0
- package/dist/tool-schema-trim.d.ts +24 -0
- package/dist/tool-schema-trim.d.ts.map +1 -0
- package/dist/tool-schema-trim.js +49 -0
- package/dist/tool-schema-trim.js.map +1 -0
- package/dist/tool-schema-trim.test.d.ts +2 -0
- package/dist/tool-schema-trim.test.d.ts.map +1 -0
- package/dist/tool-schema-trim.test.js +53 -0
- package/dist/tool-schema-trim.test.js.map +1 -0
- package/dist/toolsets.d.ts +76 -0
- package/dist/toolsets.d.ts.map +1 -0
- package/dist/toolsets.js +41 -0
- package/dist/toolsets.js.map +1 -0
- package/dist/toolsets.test.d.ts +2 -0
- package/dist/toolsets.test.d.ts.map +1 -0
- package/dist/toolsets.test.js +86 -0
- package/dist/toolsets.test.js.map +1 -0
- package/dist/ui/action-feedback.d.ts +33 -0
- package/dist/ui/action-feedback.d.ts.map +1 -0
- package/dist/ui/action-feedback.js +51 -0
- package/dist/ui/action-feedback.js.map +1 -0
- package/dist/ui/action-feedback.test.d.ts +2 -0
- package/dist/ui/action-feedback.test.d.ts.map +1 -0
- package/dist/ui/action-feedback.test.js +77 -0
- package/dist/ui/action-feedback.test.js.map +1 -0
- package/dist/ui/app-shell-providers.d.ts +18 -0
- package/dist/ui/app-shell-providers.d.ts.map +1 -0
- package/dist/ui/app-shell-providers.js +19 -0
- package/dist/ui/app-shell-providers.js.map +1 -0
- package/dist/ui/app-shell-providers.test.d.ts +2 -0
- package/dist/ui/app-shell-providers.test.d.ts.map +1 -0
- package/dist/ui/app-shell-providers.test.js +249 -0
- package/dist/ui/app-shell-providers.test.js.map +1 -0
- package/dist/ui/ask-ai-button.d.ts +56 -0
- package/dist/ui/ask-ai-button.d.ts.map +1 -0
- package/dist/ui/ask-ai-button.js +36 -0
- package/dist/ui/ask-ai-button.js.map +1 -0
- package/dist/ui/ask-ai-button.test.d.ts +2 -0
- package/dist/ui/ask-ai-button.test.d.ts.map +1 -0
- package/dist/ui/ask-ai-button.test.js +103 -0
- package/dist/ui/ask-ai-button.test.js.map +1 -0
- package/dist/ui/ask-ai-prompt.d.ts +115 -0
- package/dist/ui/ask-ai-prompt.d.ts.map +1 -0
- package/dist/ui/ask-ai-prompt.js +174 -0
- package/dist/ui/ask-ai-prompt.js.map +1 -0
- package/dist/ui/ask-ai-prompt.test.d.ts +2 -0
- package/dist/ui/ask-ai-prompt.test.d.ts.map +1 -0
- package/dist/ui/ask-ai-prompt.test.js +240 -0
- package/dist/ui/ask-ai-prompt.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.d.ts +2 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.js +174 -0
- package/dist/ui/bpmn-heatmap/heat-ramp.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.d.ts +119 -0
- package/dist/ui/bpmn-heatmap/heat-utils.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.js +231 -0
- package/dist/ui/bpmn-heatmap/heat-utils.js.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.d.ts +2 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.js +59 -0
- package/dist/ui/bpmn-heatmap/heat-utils.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap-labels.d.ts +46 -0
- package/dist/ui/bpmn-heatmap-labels.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap-labels.js +16 -0
- package/dist/ui/bpmn-heatmap-labels.js.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.d.ts +38 -0
- package/dist/ui/bpmn-heatmap-widget.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.js +65 -0
- package/dist/ui/bpmn-heatmap-widget.js.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.test.d.ts +2 -0
- package/dist/ui/bpmn-heatmap-widget.test.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap-widget.test.js +173 -0
- package/dist/ui/bpmn-heatmap-widget.test.js.map +1 -0
- package/dist/ui/bpmn-heatmap.d.ts +61 -0
- package/dist/ui/bpmn-heatmap.d.ts.map +1 -0
- package/dist/ui/bpmn-heatmap.js +119 -0
- package/dist/ui/bpmn-heatmap.js.map +1 -0
- package/dist/ui/bpmn-tokens.d.ts +81 -0
- package/dist/ui/bpmn-tokens.d.ts.map +1 -0
- package/dist/ui/bpmn-tokens.js +114 -0
- package/dist/ui/bpmn-tokens.js.map +1 -0
- package/dist/ui/bpmn-tokens.test.d.ts +2 -0
- package/dist/ui/bpmn-tokens.test.d.ts.map +1 -0
- package/dist/ui/bpmn-tokens.test.js +98 -0
- package/dist/ui/bpmn-tokens.test.js.map +1 -0
- package/dist/ui/bpmn-zoom-controls.d.ts +30 -0
- package/dist/ui/bpmn-zoom-controls.d.ts.map +1 -0
- package/dist/ui/bpmn-zoom-controls.js +29 -0
- package/dist/ui/bpmn-zoom-controls.js.map +1 -0
- package/dist/ui/brand-gates.test.d.ts +2 -0
- package/dist/ui/brand-gates.test.d.ts.map +1 -0
- package/dist/ui/brand-gates.test.js +131 -0
- package/dist/ui/brand-gates.test.js.map +1 -0
- package/dist/ui/brand-mark.d.ts +37 -0
- package/dist/ui/brand-mark.d.ts.map +1 -0
- package/dist/ui/brand-mark.js +33 -0
- package/dist/ui/brand-mark.js.map +1 -0
- package/dist/ui/brand-mark.test.d.ts +2 -0
- package/dist/ui/brand-mark.test.d.ts.map +1 -0
- package/dist/ui/brand-mark.test.js +111 -0
- package/dist/ui/brand-mark.test.js.map +1 -0
- package/dist/ui/confirm-dialog.d.ts +55 -0
- package/dist/ui/confirm-dialog.d.ts.map +1 -0
- package/dist/ui/confirm-dialog.js +59 -0
- package/dist/ui/confirm-dialog.js.map +1 -0
- package/dist/ui/confirm-dialog.test.d.ts +2 -0
- package/dist/ui/confirm-dialog.test.d.ts.map +1 -0
- package/dist/ui/confirm-dialog.test.js +115 -0
- package/dist/ui/confirm-dialog.test.js.map +1 -0
- package/dist/ui/count-tone.d.ts +20 -0
- package/dist/ui/count-tone.d.ts.map +1 -0
- package/dist/ui/count-tone.js +27 -0
- package/dist/ui/count-tone.js.map +1 -0
- package/dist/ui/count-tone.test.d.ts +2 -0
- package/dist/ui/count-tone.test.d.ts.map +1 -0
- package/dist/ui/count-tone.test.js +27 -0
- package/dist/ui/count-tone.test.js.map +1 -0
- package/dist/ui/create-use-t.d.ts +15 -0
- package/dist/ui/create-use-t.d.ts.map +1 -0
- package/dist/ui/create-use-t.js +17 -0
- package/dist/ui/create-use-t.js.map +1 -0
- package/dist/ui/declare-served-fonts.d.ts +14 -0
- package/dist/ui/declare-served-fonts.d.ts.map +1 -0
- package/dist/ui/declare-served-fonts.js +38 -0
- package/dist/ui/declare-served-fonts.js.map +1 -0
- package/dist/ui/declare-served-fonts.test.d.ts +2 -0
- package/dist/ui/declare-served-fonts.test.d.ts.map +1 -0
- package/dist/ui/declare-served-fonts.test.js +44 -0
- package/dist/ui/declare-served-fonts.test.js.map +1 -0
- package/dist/ui/describe-error.d.ts +71 -0
- package/dist/ui/describe-error.d.ts.map +1 -0
- package/dist/ui/describe-error.js +175 -0
- package/dist/ui/describe-error.js.map +1 -0
- package/dist/ui/describe-error.test.d.ts +2 -0
- package/dist/ui/describe-error.test.d.ts.map +1 -0
- package/dist/ui/describe-error.test.js +274 -0
- package/dist/ui/describe-error.test.js.map +1 -0
- package/dist/ui/display-mode-toggle.d.ts +32 -0
- package/dist/ui/display-mode-toggle.d.ts.map +1 -0
- package/dist/ui/display-mode-toggle.js +39 -0
- package/dist/ui/display-mode-toggle.js.map +1 -0
- package/dist/ui/error-labels.d.ts +65 -0
- package/dist/ui/error-labels.d.ts.map +1 -0
- package/dist/ui/error-labels.js +111 -0
- package/dist/ui/error-labels.js.map +1 -0
- package/dist/ui/format.d.ts +81 -0
- package/dist/ui/format.d.ts.map +1 -0
- package/dist/ui/format.js +189 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/format.test.d.ts +2 -0
- package/dist/ui/format.test.d.ts.map +1 -0
- package/dist/ui/format.test.js +181 -0
- package/dist/ui/format.test.js.map +1 -0
- package/dist/ui/generic-widgets.d.ts +15 -0
- package/dist/ui/generic-widgets.d.ts.map +1 -0
- package/dist/ui/generic-widgets.js +122 -0
- package/dist/ui/generic-widgets.js.map +1 -0
- package/dist/ui/generic-widgets.test.d.ts +2 -0
- package/dist/ui/generic-widgets.test.d.ts.map +1 -0
- package/dist/ui/generic-widgets.test.js +139 -0
- package/dist/ui/generic-widgets.test.js.map +1 -0
- package/dist/ui/hand-off-button.d.ts +44 -0
- package/dist/ui/hand-off-button.d.ts.map +1 -0
- package/dist/ui/hand-off-button.js +44 -0
- package/dist/ui/hand-off-button.js.map +1 -0
- package/dist/ui/hand-off-button.test.d.ts +2 -0
- package/dist/ui/hand-off-button.test.d.ts.map +1 -0
- package/dist/ui/hand-off-button.test.js +78 -0
- package/dist/ui/hand-off-button.test.js.map +1 -0
- package/dist/ui/host-context.d.ts +66 -0
- package/dist/ui/host-context.d.ts.map +1 -0
- package/dist/ui/host-context.js +122 -0
- package/dist/ui/host-context.js.map +1 -0
- package/dist/ui/host-context.test.d.ts +2 -0
- package/dist/ui/host-context.test.d.ts.map +1 -0
- package/dist/ui/host-context.test.js +160 -0
- package/dist/ui/host-context.test.js.map +1 -0
- package/dist/ui/host-document.d.ts +25 -0
- package/dist/ui/host-document.d.ts.map +1 -0
- package/dist/ui/host-document.js +93 -0
- package/dist/ui/host-document.js.map +1 -0
- package/dist/ui/host-document.test.d.ts +2 -0
- package/dist/ui/host-document.test.d.ts.map +1 -0
- package/dist/ui/host-document.test.js +112 -0
- package/dist/ui/host-document.test.js.map +1 -0
- package/dist/ui/host-widgets.d.ts +8 -0
- package/dist/ui/host-widgets.d.ts.map +1 -0
- package/dist/ui/host-widgets.js +18 -0
- package/dist/ui/host-widgets.js.map +1 -0
- package/dist/ui/humanize-key.d.ts +11 -0
- package/dist/ui/humanize-key.d.ts.map +1 -0
- package/dist/ui/humanize-key.js +26 -0
- package/dist/ui/humanize-key.js.map +1 -0
- package/dist/ui/humanize-key.test.d.ts +2 -0
- package/dist/ui/humanize-key.test.d.ts.map +1 -0
- package/dist/ui/humanize-key.test.js +42 -0
- package/dist/ui/humanize-key.test.js.map +1 -0
- package/dist/ui/icon.d.ts +37 -0
- package/dist/ui/icon.d.ts.map +1 -0
- package/dist/ui/icon.js +32 -0
- package/dist/ui/icon.js.map +1 -0
- package/dist/ui/id-breaks.d.ts +17 -0
- package/dist/ui/id-breaks.d.ts.map +1 -0
- package/dist/ui/id-breaks.js +36 -0
- package/dist/ui/id-breaks.js.map +1 -0
- package/dist/ui/id-breaks.test.d.ts +2 -0
- package/dist/ui/id-breaks.test.d.ts.map +1 -0
- package/dist/ui/id-breaks.test.js +37 -0
- package/dist/ui/id-breaks.test.js.map +1 -0
- package/dist/ui/id-text.d.ts +29 -0
- package/dist/ui/id-text.d.ts.map +1 -0
- package/dist/ui/id-text.js +103 -0
- package/dist/ui/id-text.js.map +1 -0
- package/dist/ui/id-text.test.d.ts +2 -0
- package/dist/ui/id-text.test.d.ts.map +1 -0
- package/dist/ui/id-text.test.js +122 -0
- package/dist/ui/id-text.test.js.map +1 -0
- package/dist/ui/index.d.ts +57 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +65 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/index.test.d.ts +2 -0
- package/dist/ui/index.test.d.ts.map +1 -0
- package/dist/ui/index.test.js +34 -0
- package/dist/ui/index.test.js.map +1 -0
- package/dist/ui/inline-budget.d.ts +35 -0
- package/dist/ui/inline-budget.d.ts.map +1 -0
- package/dist/ui/inline-budget.js +27 -0
- package/dist/ui/inline-budget.js.map +1 -0
- package/dist/ui/inline-fit-registry.d.ts +56 -0
- package/dist/ui/inline-fit-registry.d.ts.map +1 -0
- package/dist/ui/inline-fit-registry.js +114 -0
- package/dist/ui/inline-fit-registry.js.map +1 -0
- package/dist/ui/inline-fit-solve.d.ts +50 -0
- package/dist/ui/inline-fit-solve.d.ts.map +1 -0
- package/dist/ui/inline-fit-solve.js +83 -0
- package/dist/ui/inline-fit-solve.js.map +1 -0
- package/dist/ui/inline-fit-solve.test.d.ts +2 -0
- package/dist/ui/inline-fit-solve.test.d.ts.map +1 -0
- package/dist/ui/inline-fit-solve.test.js +108 -0
- package/dist/ui/inline-fit-solve.test.js.map +1 -0
- package/dist/ui/inline-fit-time.test.d.ts +2 -0
- package/dist/ui/inline-fit-time.test.d.ts.map +1 -0
- package/dist/ui/inline-fit-time.test.js +110 -0
- package/dist/ui/inline-fit-time.test.js.map +1 -0
- package/dist/ui/inline-fit.d.ts +77 -0
- package/dist/ui/inline-fit.d.ts.map +1 -0
- package/dist/ui/inline-fit.js +242 -0
- package/dist/ui/inline-fit.js.map +1 -0
- package/dist/ui/inline-fit.test-support.d.ts +26 -0
- package/dist/ui/inline-fit.test-support.d.ts.map +1 -0
- package/dist/ui/inline-fit.test-support.js +34 -0
- package/dist/ui/inline-fit.test-support.js.map +1 -0
- package/dist/ui/inline-fit.test.d.ts +2 -0
- package/dist/ui/inline-fit.test.d.ts.map +1 -0
- package/dist/ui/inline-fit.test.js +159 -0
- package/dist/ui/inline-fit.test.js.map +1 -0
- package/dist/ui/kit-labels.d.ts +80 -0
- package/dist/ui/kit-labels.d.ts.map +1 -0
- package/dist/ui/kit-labels.js +110 -0
- package/dist/ui/kit-labels.js.map +1 -0
- package/dist/ui/kit-labels.test.d.ts +2 -0
- package/dist/ui/kit-labels.test.d.ts.map +1 -0
- package/dist/ui/kit-labels.test.js +98 -0
- package/dist/ui/kit-labels.test.js.map +1 -0
- package/dist/ui/kit-type-roles.test.d.ts +2 -0
- package/dist/ui/kit-type-roles.test.d.ts.map +1 -0
- package/dist/ui/kit-type-roles.test.js +122 -0
- package/dist/ui/kit-type-roles.test.js.map +1 -0
- package/dist/ui/komet-svg.d.ts +15 -0
- package/dist/ui/komet-svg.d.ts.map +1 -0
- package/dist/ui/komet-svg.js +21 -0
- package/dist/ui/komet-svg.js.map +1 -0
- package/dist/ui/list-table.d.ts +108 -0
- package/dist/ui/list-table.d.ts.map +1 -0
- package/dist/ui/list-table.js +161 -0
- package/dist/ui/list-table.js.map +1 -0
- package/dist/ui/list-table.test.d.ts +2 -0
- package/dist/ui/list-table.test.d.ts.map +1 -0
- package/dist/ui/list-table.test.js +169 -0
- package/dist/ui/list-table.test.js.map +1 -0
- package/dist/ui/localized-app-view.d.ts +40 -0
- package/dist/ui/localized-app-view.d.ts.map +1 -0
- package/dist/ui/localized-app-view.js +71 -0
- package/dist/ui/localized-app-view.js.map +1 -0
- package/dist/ui/log-text.d.ts +24 -0
- package/dist/ui/log-text.d.ts.map +1 -0
- package/dist/ui/log-text.js +31 -0
- package/dist/ui/log-text.js.map +1 -0
- package/dist/ui/menu-item.d.ts +12 -0
- package/dist/ui/menu-item.d.ts.map +1 -0
- package/dist/ui/menu-item.js +13 -0
- package/dist/ui/menu-item.js.map +1 -0
- package/dist/ui/named-id.d.ts +23 -0
- package/dist/ui/named-id.d.ts.map +1 -0
- package/dist/ui/named-id.js +21 -0
- package/dist/ui/named-id.js.map +1 -0
- package/dist/ui/named-id.test.d.ts +2 -0
- package/dist/ui/named-id.test.d.ts.map +1 -0
- package/dist/ui/named-id.test.js +57 -0
- package/dist/ui/named-id.test.js.map +1 -0
- package/dist/ui/native-select.d.ts +17 -0
- package/dist/ui/native-select.d.ts.map +1 -0
- package/dist/ui/native-select.js +20 -0
- package/dist/ui/native-select.js.map +1 -0
- package/dist/ui/navigation-focus.d.ts +20 -0
- package/dist/ui/navigation-focus.d.ts.map +1 -0
- package/dist/ui/navigation-focus.js +25 -0
- package/dist/ui/navigation-focus.js.map +1 -0
- package/dist/ui/navigation-focus.test.d.ts +2 -0
- package/dist/ui/navigation-focus.test.d.ts.map +1 -0
- package/dist/ui/navigation-focus.test.js +28 -0
- package/dist/ui/navigation-focus.test.js.map +1 -0
- package/dist/ui/open-in-cockpit-link.d.ts +28 -0
- package/dist/ui/open-in-cockpit-link.d.ts.map +1 -0
- package/dist/ui/open-in-cockpit-link.js +41 -0
- package/dist/ui/open-in-cockpit-link.js.map +1 -0
- package/dist/ui/paged-list-footer.test.d.ts +2 -0
- package/dist/ui/paged-list-footer.test.d.ts.map +1 -0
- package/dist/ui/paged-list-footer.test.js +128 -0
- package/dist/ui/paged-list-footer.test.js.map +1 -0
- package/dist/ui/paged-rows.d.ts +24 -0
- package/dist/ui/paged-rows.d.ts.map +1 -0
- package/dist/ui/paged-rows.js +25 -0
- package/dist/ui/paged-rows.js.map +1 -0
- package/dist/ui/parse-tool-result.test.d.ts +2 -0
- package/dist/ui/parse-tool-result.test.d.ts.map +1 -0
- package/dist/ui/parse-tool-result.test.js +88 -0
- package/dist/ui/parse-tool-result.test.js.map +1 -0
- package/dist/ui/profile-gate.d.ts +37 -0
- package/dist/ui/profile-gate.d.ts.map +1 -0
- package/dist/ui/profile-gate.js +126 -0
- package/dist/ui/profile-gate.js.map +1 -0
- package/dist/ui/profile-gate.test.d.ts +2 -0
- package/dist/ui/profile-gate.test.d.ts.map +1 -0
- package/dist/ui/profile-gate.test.js +246 -0
- package/dist/ui/profile-gate.test.js.map +1 -0
- package/dist/ui/query-fallback.d.ts +27 -0
- package/dist/ui/query-fallback.d.ts.map +1 -0
- package/dist/ui/query-fallback.js +30 -0
- package/dist/ui/query-fallback.js.map +1 -0
- package/dist/ui/query-fallback.test.d.ts +2 -0
- package/dist/ui/query-fallback.test.d.ts.map +1 -0
- package/dist/ui/query-fallback.test.js +49 -0
- package/dist/ui/query-fallback.test.js.map +1 -0
- package/dist/ui/row-card.d.ts +13 -0
- package/dist/ui/row-card.d.ts.map +1 -0
- package/dist/ui/row-card.js +11 -0
- package/dist/ui/row-card.js.map +1 -0
- package/dist/ui/section.d.ts +18 -0
- package/dist/ui/section.d.ts.map +1 -0
- package/dist/ui/section.js +14 -0
- package/dist/ui/section.js.map +1 -0
- package/dist/ui/segmented-control.d.ts +25 -0
- package/dist/ui/segmented-control.d.ts.map +1 -0
- package/dist/ui/segmented-control.js +22 -0
- package/dist/ui/segmented-control.js.map +1 -0
- package/dist/ui/settings-labels.d.ts +33 -0
- package/dist/ui/settings-labels.d.ts.map +1 -0
- package/dist/ui/settings-labels.js +50 -0
- package/dist/ui/settings-labels.js.map +1 -0
- package/dist/ui/settings-layout.d.ts +29 -0
- package/dist/ui/settings-layout.d.ts.map +1 -0
- package/dist/ui/settings-layout.js +49 -0
- package/dist/ui/settings-layout.js.map +1 -0
- package/dist/ui/settings-layout.test.d.ts +2 -0
- package/dist/ui/settings-layout.test.d.ts.map +1 -0
- package/dist/ui/settings-layout.test.js +73 -0
- package/dist/ui/settings-layout.test.js.map +1 -0
- package/dist/ui/settings.d.ts +47 -0
- package/dist/ui/settings.d.ts.map +1 -0
- package/dist/ui/settings.js +48 -0
- package/dist/ui/settings.js.map +1 -0
- package/dist/ui/settings.test.d.ts +2 -0
- package/dist/ui/settings.test.d.ts.map +1 -0
- package/dist/ui/settings.test.js +38 -0
- package/dist/ui/settings.test.js.map +1 -0
- package/dist/ui/shell-host.d.ts +46 -0
- package/dist/ui/shell-host.d.ts.map +1 -0
- package/dist/ui/shell-host.js +56 -0
- package/dist/ui/shell-host.js.map +1 -0
- package/dist/ui/shell-settings.d.ts +31 -0
- package/dist/ui/shell-settings.d.ts.map +1 -0
- package/dist/ui/shell-settings.js +97 -0
- package/dist/ui/shell-settings.js.map +1 -0
- package/dist/ui/shell-settings.test.d.ts +2 -0
- package/dist/ui/shell-settings.test.d.ts.map +1 -0
- package/dist/ui/shell-settings.test.js +108 -0
- package/dist/ui/shell-settings.test.js.map +1 -0
- package/dist/ui/shell-widgets.d.ts +14 -0
- package/dist/ui/shell-widgets.d.ts.map +1 -0
- package/dist/ui/shell-widgets.js +18 -0
- package/dist/ui/shell-widgets.js.map +1 -0
- package/dist/ui/table.d.ts +61 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +43 -0
- package/dist/ui/table.js.map +1 -0
- package/dist/ui/tone-components.test.d.ts +2 -0
- package/dist/ui/tone-components.test.d.ts.map +1 -0
- package/dist/ui/tone-components.test.js +145 -0
- package/dist/ui/tone-components.test.js.map +1 -0
- package/dist/ui/tone-contrast.test.d.ts +2 -0
- package/dist/ui/tone-contrast.test.d.ts.map +1 -0
- package/dist/ui/tone-contrast.test.js +66 -0
- package/dist/ui/tone-contrast.test.js.map +1 -0
- package/dist/ui/toolkit-overlap.test.d.ts +2 -0
- package/dist/ui/toolkit-overlap.test.d.ts.map +1 -0
- package/dist/ui/toolkit-overlap.test.js +86 -0
- package/dist/ui/toolkit-overlap.test.js.map +1 -0
- package/dist/ui/use-apply-theme.d.ts +11 -0
- package/dist/ui/use-apply-theme.d.ts.map +1 -0
- package/dist/ui/use-apply-theme.js +37 -0
- package/dist/ui/use-apply-theme.js.map +1 -0
- package/dist/ui/use-apply-theme.test.d.ts +2 -0
- package/dist/ui/use-apply-theme.test.d.ts.map +1 -0
- package/dist/ui/use-apply-theme.test.js +102 -0
- package/dist/ui/use-apply-theme.test.js.map +1 -0
- package/dist/ui/use-bpmn-viewer.d.ts +135 -0
- package/dist/ui/use-bpmn-viewer.d.ts.map +1 -0
- package/dist/ui/use-bpmn-viewer.js +257 -0
- package/dist/ui/use-bpmn-viewer.js.map +1 -0
- package/dist/ui/use-bpmn-viewer.test.d.ts +2 -0
- package/dist/ui/use-bpmn-viewer.test.d.ts.map +1 -0
- package/dist/ui/use-bpmn-viewer.test.js +239 -0
- package/dist/ui/use-bpmn-viewer.test.js.map +1 -0
- package/dist/ui/use-detail-view.d.ts +49 -0
- package/dist/ui/use-detail-view.d.ts.map +1 -0
- package/dist/ui/use-detail-view.js +52 -0
- package/dist/ui/use-detail-view.js.map +1 -0
- package/dist/ui/use-detail-view.test.d.ts +2 -0
- package/dist/ui/use-detail-view.test.d.ts.map +1 -0
- package/dist/ui/use-detail-view.test.js +178 -0
- package/dist/ui/use-detail-view.test.js.map +1 -0
- package/dist/ui/use-paged-list-view.d.ts +48 -0
- package/dist/ui/use-paged-list-view.d.ts.map +1 -0
- package/dist/ui/use-paged-list-view.js +41 -0
- package/dist/ui/use-paged-list-view.js.map +1 -0
- package/dist/ui/use-paged-list-view.test.d.ts +2 -0
- package/dist/ui/use-paged-list-view.test.d.ts.map +1 -0
- package/dist/ui/use-paged-list-view.test.js +136 -0
- package/dist/ui/use-paged-list-view.test.js.map +1 -0
- package/dist/ui/use-paged-view-data.d.ts +103 -0
- package/dist/ui/use-paged-view-data.d.ts.map +1 -0
- package/dist/ui/use-paged-view-data.js +173 -0
- package/dist/ui/use-paged-view-data.js.map +1 -0
- package/dist/ui/use-paged-view-data.seeded.test.d.ts +2 -0
- package/dist/ui/use-paged-view-data.seeded.test.d.ts.map +1 -0
- package/dist/ui/use-paged-view-data.seeded.test.js +144 -0
- package/dist/ui/use-paged-view-data.seeded.test.js.map +1 -0
- package/dist/ui/use-paged-view-data.test.d.ts +2 -0
- package/dist/ui/use-paged-view-data.test.d.ts.map +1 -0
- package/dist/ui/use-paged-view-data.test.js +330 -0
- package/dist/ui/use-paged-view-data.test.js.map +1 -0
- package/dist/ui/use-reset-on-change.d.ts +22 -0
- package/dist/ui/use-reset-on-change.d.ts.map +1 -0
- package/dist/ui/use-reset-on-change.js +29 -0
- package/dist/ui/use-reset-on-change.js.map +1 -0
- package/dist/ui/use-reset-on-change.test.d.ts +2 -0
- package/dist/ui/use-reset-on-change.test.d.ts.map +1 -0
- package/dist/ui/use-reset-on-change.test.js +61 -0
- package/dist/ui/use-reset-on-change.test.js.map +1 -0
- package/dist/ui/use-view-data.seeded.test.d.ts +2 -0
- package/dist/ui/use-view-data.seeded.test.d.ts.map +1 -0
- package/dist/ui/use-view-data.seeded.test.js +168 -0
- package/dist/ui/use-view-data.seeded.test.js.map +1 -0
- package/dist/ui/view-data-state.d.ts +52 -0
- package/dist/ui/view-data-state.d.ts.map +1 -0
- package/dist/ui/view-data-state.js +54 -0
- package/dist/ui/view-data-state.js.map +1 -0
- package/dist/ui/view-data-state.test.d.ts +2 -0
- package/dist/ui/view-data-state.test.d.ts.map +1 -0
- package/dist/ui/view-data-state.test.js +62 -0
- package/dist/ui/view-data-state.test.js.map +1 -0
- package/dist/ui/view-meta.d.ts +70 -0
- package/dist/ui/view-meta.d.ts.map +1 -0
- package/dist/ui/view-meta.js +84 -0
- package/dist/ui/view-meta.js.map +1 -0
- package/dist/ui/view-meta.test.d.ts +2 -0
- package/dist/ui/view-meta.test.d.ts.map +1 -0
- package/dist/ui/view-meta.test.js +92 -0
- package/dist/ui/view-meta.test.js.map +1 -0
- package/dist/ui/view-refresh-state.d.ts +26 -0
- package/dist/ui/view-refresh-state.d.ts.map +1 -0
- package/dist/ui/view-refresh-state.js +15 -0
- package/dist/ui/view-refresh-state.js.map +1 -0
- package/dist/ui/widget-shell.d.ts +24 -0
- package/dist/ui/widget-shell.d.ts.map +1 -0
- package/dist/ui/widget-shell.js +50 -0
- package/dist/ui/widget-shell.js.map +1 -0
- package/dist/ui/widget-shell.test.d.ts +2 -0
- package/dist/ui/widget-shell.test.d.ts.map +1 -0
- package/dist/ui/widget-shell.test.js +41 -0
- package/dist/ui/widget-shell.test.js.map +1 -0
- package/dist/view-results.d.ts +42 -0
- package/dist/view-results.d.ts.map +1 -0
- package/dist/view-results.js +17 -0
- package/dist/view-results.js.map +1 -0
- package/dist/widget-meta-defaults.d.ts +48 -0
- package/dist/widget-meta-defaults.d.ts.map +1 -0
- package/dist/widget-meta-defaults.js +80 -0
- package/dist/widget-meta-defaults.js.map +1 -0
- package/dist/widget-meta-defaults.test.d.ts +2 -0
- package/dist/widget-meta-defaults.test.d.ts.map +1 -0
- package/dist/widget-meta-defaults.test.js +196 -0
- package/dist/widget-meta-defaults.test.js.map +1 -0
- package/dist/widget-tool-bindings.d.ts +71 -0
- package/dist/widget-tool-bindings.d.ts.map +1 -0
- package/dist/widget-tool-bindings.js +80 -0
- package/dist/widget-tool-bindings.js.map +1 -0
- package/dist/widget-tool-bindings.test.d.ts +2 -0
- package/dist/widget-tool-bindings.test.d.ts.map +1 -0
- package/dist/widget-tool-bindings.test.js +83 -0
- package/dist/widget-tool-bindings.test.js.map +1 -0
- package/dist/with-tool-errors.test.d.ts +2 -0
- package/dist/with-tool-errors.test.d.ts.map +1 -0
- package/dist/with-tool-errors.test.js +38 -0
- package/dist/with-tool-errors.test.js.map +1 -0
- package/package.json +113 -5
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { AppResourceCsp } from "@miragon/mcp-toolkit-core";
|
|
2
|
+
import type { HttpRouteHost } from "./health.js";
|
|
3
|
+
/** A served file: its name under the route and its bytes. */
|
|
4
|
+
export interface FontAsset {
|
|
5
|
+
file: string;
|
|
6
|
+
body: Uint8Array<ArrayBuffer>;
|
|
7
|
+
}
|
|
8
|
+
/** A year, and never revalidated: a new font release is a new URL. */
|
|
9
|
+
export declare const FONT_CACHE_CONTROL = "public, max-age=31536000, immutable";
|
|
10
|
+
/**
|
|
11
|
+
* Where the `@fontsource-variable` packages keep the files, by served name.
|
|
12
|
+
* `require.resolve` with literal specifiers, so the dependency stays visible
|
|
13
|
+
* to the dead-code check; `font-assets.test.ts` holds the names equal to
|
|
14
|
+
* {@link SERVED_FONT_FILES}.
|
|
15
|
+
*/
|
|
16
|
+
export declare function servedFontPaths(): Record<string, string>;
|
|
17
|
+
/** The woff2 files, read once (boot). */
|
|
18
|
+
export declare function loadServedFonts(paths?: () => Record<string, string>): FontAsset[];
|
|
19
|
+
/** The answer for one file — a fresh `Response` per request (a body is read once). */
|
|
20
|
+
export declare function fontResponse(body: Uint8Array<ArrayBuffer>): Response;
|
|
21
|
+
export interface FontAssetsOptions {
|
|
22
|
+
/** Route prefix (default {@link SERVED_FONT_PATH} — the views load from there). */
|
|
23
|
+
path?: string;
|
|
24
|
+
/** The files (default {@link loadServedFonts}). */
|
|
25
|
+
load?: () => FontAsset[];
|
|
26
|
+
/** Log prefix for the warning when the files cannot be read (default `fonts`). */
|
|
27
|
+
label?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Register `GET <path>/<file>` for each served font. Returns the registered
|
|
31
|
+
* routes — none when the files cannot be read: the boot goes on with a
|
|
32
|
+
* warning and the views render the host's font (Geist is cosmetic, never a
|
|
33
|
+
* reason to refuse service).
|
|
34
|
+
*/
|
|
35
|
+
export declare function installFontAssets(server: HttpRouteHost, options?: FontAssetsOptions): string[];
|
|
36
|
+
/**
|
|
37
|
+
* The view CSP that admits the font origin explicitly: `MCP_URL`'s origin in
|
|
38
|
+
* `resourceDomains` — the origin a view resolves its font URLs against
|
|
39
|
+
* (`servedFontBaseUrl`). Handed to `createFrameworkApp` as `app.csp`, it
|
|
40
|
+
* reaches `render-view` and every module widget tool (`honorWidgetMetaDefaults`),
|
|
41
|
+
* on `resources/list` too, and the Apps SDK `openai/widgetCSP`. `undefined`
|
|
42
|
+
* without `MCP_URL` (local dev): mcp-use still appends the request-resolved
|
|
43
|
+
* server origin on every `resources/read`, which is where the view loads from.
|
|
44
|
+
* Call it after `resolveHttpEdgePolicy` validated `MCP_URL`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function fontAssetsCsp(env: NodeJS.ProcessEnv): AppResourceCsp | undefined;
|
|
47
|
+
//# sourceMappingURL=font-assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-assets.d.ts","sourceRoot":"","sources":["../src/font-assets.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAA;CAC9B;AAED,sEAAsE;AACtE,eAAO,MAAM,kBAAkB,wCAAwC,CAAA;AAIvE;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxD;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAC7B,KAAK,GAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAmB,GACpD,SAAS,EAAE,CAEb;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,QAAQ,CAapE;AAED,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,SAAS,EAAE,CAAA;IACxB,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,OAAO,GAAE,iBAAsB,GAC9B,MAAM,EAAE,CAcV;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,cAAc,GAAG,SAAS,CAGhF"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The font route of a composed server (server path only): Geist and Geist
|
|
3
|
+
* Mono as woff2, served by THIS server so the views render the Miragon type
|
|
4
|
+
* without a CDN (design system §4: self-hosted, offline-capable, GDPR-safe)
|
|
5
|
+
* and without inlining ~50 KB of base64 into every view resource.
|
|
6
|
+
*
|
|
7
|
+
* A view runs in the host's sandboxed iframe on a foreign origin, so the
|
|
8
|
+
* files travel cross-origin: the response allows any origin (CORS, CORP —
|
|
9
|
+
* public static files, no credentials), and the view's CSP must admit the
|
|
10
|
+
* server's origin in `resourceDomains` (`fontAssetsCsp` + mcp-use's own
|
|
11
|
+
* request-resolved append). The URL is versioned (`SERVED_FONT_PATH`), so the
|
|
12
|
+
* files are cached `immutable` for a year. Where a host blocks the origin or
|
|
13
|
+
* cannot reach the server, `font-display: swap` keeps the text in the host's
|
|
14
|
+
* font, then the system's — nothing waits for the files.
|
|
15
|
+
*
|
|
16
|
+
* Registered after the HTTP edge guard (`installHttpEdgeGuard`): a font GET
|
|
17
|
+
* passes the `Origin` half (safe method) but not a foreign `Host`, like every
|
|
18
|
+
* other non-operational route.
|
|
19
|
+
*/
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { createRequire } from "node:module";
|
|
22
|
+
import { SERVED_FONT_FILES, SERVED_FONT_PATH } from "./served-fonts.js";
|
|
23
|
+
/** A year, and never revalidated: a new font release is a new URL. */
|
|
24
|
+
export const FONT_CACHE_CONTROL = "public, max-age=31536000, immutable";
|
|
25
|
+
const require = createRequire(import.meta.url);
|
|
26
|
+
/**
|
|
27
|
+
* Where the `@fontsource-variable` packages keep the files, by served name.
|
|
28
|
+
* `require.resolve` with literal specifiers, so the dependency stays visible
|
|
29
|
+
* to the dead-code check; `font-assets.test.ts` holds the names equal to
|
|
30
|
+
* {@link SERVED_FONT_FILES}.
|
|
31
|
+
*/
|
|
32
|
+
export function servedFontPaths() {
|
|
33
|
+
return {
|
|
34
|
+
[SERVED_FONT_FILES.sans]: require.resolve("@fontsource-variable/geist/files/geist-latin-wght-normal.woff2"),
|
|
35
|
+
[SERVED_FONT_FILES.mono]: require.resolve("@fontsource-variable/geist-mono/files/geist-mono-latin-wght-normal.woff2"),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** The woff2 files, read once (boot). */
|
|
39
|
+
export function loadServedFonts(paths = servedFontPaths) {
|
|
40
|
+
return Object.entries(paths()).map(([file, path]) => ({ file, body: readFileSync(path) }));
|
|
41
|
+
}
|
|
42
|
+
/** The answer for one file — a fresh `Response` per request (a body is read once). */
|
|
43
|
+
export function fontResponse(body) {
|
|
44
|
+
return new Response(body, {
|
|
45
|
+
headers: {
|
|
46
|
+
"content-type": "font/woff2",
|
|
47
|
+
"content-length": String(body.byteLength),
|
|
48
|
+
"cache-control": FONT_CACHE_CONTROL,
|
|
49
|
+
// Fonts are fetched in CORS mode from the view's sandboxed (often
|
|
50
|
+
// opaque, `null`) origin; public files, so any origin and no credentials.
|
|
51
|
+
"access-control-allow-origin": "*",
|
|
52
|
+
"cross-origin-resource-policy": "cross-origin",
|
|
53
|
+
"x-content-type-options": "nosniff",
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Register `GET <path>/<file>` for each served font. Returns the registered
|
|
59
|
+
* routes — none when the files cannot be read: the boot goes on with a
|
|
60
|
+
* warning and the views render the host's font (Geist is cosmetic, never a
|
|
61
|
+
* reason to refuse service).
|
|
62
|
+
*/
|
|
63
|
+
export function installFontAssets(server, options = {}) {
|
|
64
|
+
const { path = SERVED_FONT_PATH, load = loadServedFonts, label = "fonts" } = options;
|
|
65
|
+
let assets;
|
|
66
|
+
try {
|
|
67
|
+
assets = load();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.warn(`[${label}] Geist is not served (views use the host's font):`, error);
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return assets.map(({ file, body }) => {
|
|
74
|
+
const route = `${path}/${file}`;
|
|
75
|
+
server.get(route, () => fontResponse(body));
|
|
76
|
+
return route;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The view CSP that admits the font origin explicitly: `MCP_URL`'s origin in
|
|
81
|
+
* `resourceDomains` — the origin a view resolves its font URLs against
|
|
82
|
+
* (`servedFontBaseUrl`). Handed to `createFrameworkApp` as `app.csp`, it
|
|
83
|
+
* reaches `render-view` and every module widget tool (`honorWidgetMetaDefaults`),
|
|
84
|
+
* on `resources/list` too, and the Apps SDK `openai/widgetCSP`. `undefined`
|
|
85
|
+
* without `MCP_URL` (local dev): mcp-use still appends the request-resolved
|
|
86
|
+
* server origin on every `resources/read`, which is where the view loads from.
|
|
87
|
+
* Call it after `resolveHttpEdgePolicy` validated `MCP_URL`.
|
|
88
|
+
*/
|
|
89
|
+
export function fontAssetsCsp(env) {
|
|
90
|
+
const url = env.MCP_URL?.trim();
|
|
91
|
+
return url ? { resourceDomains: [new URL(url).origin] } : undefined;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=font-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-assets.js","sourceRoot":"","sources":["../src/font-assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAQvE,sEAAsE;AACtE,MAAM,CAAC,MAAM,kBAAkB,GAAG,qCAAqC,CAAA;AAEvE,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,CAAC,iBAAiB,CAAC,IAAI,CAAC,EACtB,OAAO,CAAC,OAAO,CAAC,gEAAgE,CAAC;QACnF,CAAC,iBAAiB,CAAC,IAAI,CAAC,EACtB,OAAO,CAAC,OAAO,CAAC,0EAA0E,CAAC;KAC9F,CAAA;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe,CAC7B,QAAsC,eAAe;IAErD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5F,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,IAA6B;IACxD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,OAAO,EAAE;YACP,cAAc,EAAE,YAAY;YAC5B,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;YACzC,eAAe,EAAE,kBAAkB;YACnC,kEAAkE;YAClE,0EAA0E;YAC1E,6BAA6B,EAAE,GAAG;YAClC,8BAA8B,EAAE,cAAc;YAC9C,wBAAwB,EAAE,SAAS;SACpC;KACF,CAAC,CAAA;AACJ,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,UAA6B,EAAE;IAE/B,MAAM,EAAE,IAAI,GAAG,gBAAgB,EAAE,IAAI,GAAG,eAAe,EAAE,KAAK,GAAG,OAAO,EAAE,GAAG,OAAO,CAAA;IACpF,IAAI,MAAmB,CAAA;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,EAAE,CAAA;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,oDAAoD,EAAE,KAAK,CAAC,CAAA;QAClF,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;QAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3C,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAsB;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;IAC/B,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-assets.test.d.ts","sourceRoot":"","sources":["../src/font-assets.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { FONT_CACHE_CONTROL, fontAssetsCsp, fontResponse, installFontAssets, loadServedFonts, servedFontPaths, } from "./font-assets.js";
|
|
3
|
+
import { SERVED_FONT_FILES } from "./served-fonts.js";
|
|
4
|
+
/** A woff2 file starts with the signature `wOF2`. */
|
|
5
|
+
const WOFF2_SIGNATURE = [0x77, 0x4f, 0x46, 0x32];
|
|
6
|
+
/** Records `server.get(path, handler)` like the health suite's fake host. */
|
|
7
|
+
function fakeHost() {
|
|
8
|
+
const routes = new Map();
|
|
9
|
+
const host = {
|
|
10
|
+
get: (path, handler) => {
|
|
11
|
+
routes.set(path, handler);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
return { host, routes };
|
|
15
|
+
}
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
vi.restoreAllMocks();
|
|
18
|
+
});
|
|
19
|
+
describe("loadServedFonts", () => {
|
|
20
|
+
it("reads Geist and Geist Mono (latin, variable) from the fontsource packages", () => {
|
|
21
|
+
const fonts = loadServedFonts();
|
|
22
|
+
expect(fonts.map((font) => font.file)).toEqual([
|
|
23
|
+
"geist-latin-wght-normal.woff2",
|
|
24
|
+
"geist-mono-latin-wght-normal.woff2",
|
|
25
|
+
]);
|
|
26
|
+
for (const { file, body } of fonts) {
|
|
27
|
+
expect([...body.subarray(0, 4)], file).toEqual(WOFF2_SIGNATURE);
|
|
28
|
+
// Latin subsets, not the full families: tens of KB, not hundreds.
|
|
29
|
+
expect(body.byteLength, file).toBeGreaterThan(10_000);
|
|
30
|
+
expect(body.byteLength, file).toBeLessThan(60_000);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
it("finds each served file in its fontsource package under the name the views load", () => {
|
|
34
|
+
const paths = servedFontPaths();
|
|
35
|
+
expect(Object.keys(paths)).toEqual(Object.values(SERVED_FONT_FILES));
|
|
36
|
+
expect(paths[SERVED_FONT_FILES.sans]).toMatch(/@fontsource-variable\/geist\/files\/geist-latin-wght-normal\.woff2$/);
|
|
37
|
+
expect(paths[SERVED_FONT_FILES.mono]).toMatch(/@fontsource-variable\/geist-mono\/files\/geist-mono-latin-wght-normal\.woff2$/);
|
|
38
|
+
});
|
|
39
|
+
it("reads the files it is pointed at and fails loudly on a missing one", () => {
|
|
40
|
+
expect(() => loadServedFonts(() => ({ "x.woff2": "/nonexistent/x.woff2" }))).toThrow(/ENOENT/);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("fontResponse", () => {
|
|
44
|
+
it("answers woff2, cached immutable for a year, readable from any origin", async () => {
|
|
45
|
+
const body = new Uint8Array([0x77, 0x4f, 0x46, 0x32, 1, 2]);
|
|
46
|
+
const res = fontResponse(body);
|
|
47
|
+
expect(res.status).toBe(200);
|
|
48
|
+
expect(Object.fromEntries(res.headers)).toEqual({
|
|
49
|
+
"content-type": "font/woff2",
|
|
50
|
+
"content-length": "6",
|
|
51
|
+
"cache-control": "public, max-age=31536000, immutable",
|
|
52
|
+
"access-control-allow-origin": "*",
|
|
53
|
+
"cross-origin-resource-policy": "cross-origin",
|
|
54
|
+
"x-content-type-options": "nosniff",
|
|
55
|
+
});
|
|
56
|
+
expect(FONT_CACHE_CONTROL).toBe("public, max-age=31536000, immutable");
|
|
57
|
+
expect(new Uint8Array(await res.arrayBuffer())).toEqual(body);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("installFontAssets", () => {
|
|
61
|
+
it("registers one GET route per file under the versioned font path", async () => {
|
|
62
|
+
const { host, routes } = fakeHost();
|
|
63
|
+
const installed = installFontAssets(host);
|
|
64
|
+
expect(installed).toEqual([
|
|
65
|
+
"/fonts/geist-5.3.0/geist-latin-wght-normal.woff2",
|
|
66
|
+
"/fonts/geist-5.3.0/geist-mono-latin-wght-normal.woff2",
|
|
67
|
+
]);
|
|
68
|
+
expect([...routes.keys()]).toEqual(installed);
|
|
69
|
+
// A fresh Response per request: a body can be read only once.
|
|
70
|
+
const handler = routes.get(installed[0]);
|
|
71
|
+
const first = await handler({});
|
|
72
|
+
const second = await handler({});
|
|
73
|
+
expect(first).not.toBe(second);
|
|
74
|
+
expect((await first.arrayBuffer()).byteLength).toBe((await second.arrayBuffer()).byteLength);
|
|
75
|
+
});
|
|
76
|
+
it("serves what the loader returns under the path it is given", async () => {
|
|
77
|
+
const { host, routes } = fakeHost();
|
|
78
|
+
const fonts = [{ file: "x.woff2", body: new Uint8Array([1, 2, 3]) }];
|
|
79
|
+
expect(installFontAssets(host, { path: "/assets", load: () => fonts })).toEqual([
|
|
80
|
+
"/assets/x.woff2",
|
|
81
|
+
]);
|
|
82
|
+
const res = await routes.get("/assets/x.woff2")({});
|
|
83
|
+
expect(new Uint8Array(await res.arrayBuffer())).toEqual(new Uint8Array([1, 2, 3]));
|
|
84
|
+
});
|
|
85
|
+
it("boots on without the route when the files cannot be read — the views use the host's font", () => {
|
|
86
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
87
|
+
const { host, routes } = fakeHost();
|
|
88
|
+
const failure = new Error("ENOENT");
|
|
89
|
+
const installed = installFontAssets(host, {
|
|
90
|
+
label: "edge",
|
|
91
|
+
load: () => {
|
|
92
|
+
throw failure;
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
expect(installed).toEqual([]);
|
|
96
|
+
expect(routes.size).toBe(0);
|
|
97
|
+
expect(warn).toHaveBeenCalledWith("[edge] Geist is not served (views use the host's font):", failure);
|
|
98
|
+
});
|
|
99
|
+
it("labels its warning `fonts` by default", () => {
|
|
100
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
101
|
+
installFontAssets(fakeHost().host, {
|
|
102
|
+
load: () => {
|
|
103
|
+
throw new Error("x");
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
expect(warn).toHaveBeenCalledWith(expect.stringMatching(/^\[fonts\] /), expect.any(Error));
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe("fontAssetsCsp", () => {
|
|
110
|
+
it("admits MCP_URL's origin in resourceDomains — the origin the views load fonts from", () => {
|
|
111
|
+
expect(fontAssetsCsp({ MCP_URL: "https://mcp.example.com/mcp" })).toEqual({
|
|
112
|
+
resourceDomains: ["https://mcp.example.com"],
|
|
113
|
+
});
|
|
114
|
+
expect(fontAssetsCsp({ MCP_URL: " http://10.0.0.7:8400/ " })).toEqual({
|
|
115
|
+
resourceDomains: ["http://10.0.0.7:8400"],
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
it("declares nothing without MCP_URL: mcp-use appends the request-resolved origin itself", () => {
|
|
119
|
+
expect(fontAssetsCsp({})).toBeUndefined();
|
|
120
|
+
expect(fontAssetsCsp({ MCP_URL: " " })).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
//# sourceMappingURL=font-assets.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font-assets.test.js","sourceRoot":"","sources":["../src/font-assets.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,eAAe,GAEhB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,qDAAqD;AACrD,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;AAEhD,6EAA6E;AAC7E,SAAS,QAAQ;IACf,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0D,CAAA;IAChF,MAAM,IAAI,GAAkB;QAC1B,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACrB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3B,CAAC;KACF,CAAA;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC;AAED,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,eAAe,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,+BAA+B;YAC/B,oCAAoC;SACrC,CAAC,CAAA;QACF,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;YACnC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;YAC/D,kEAAkE;YAClE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAA;YACrD,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,KAAK,GAAG,eAAe,EAAE,CAAA;QAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAA;QACpE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAC3C,qEAAqE,CACtE,CAAA;QACD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAC3C,+EAA+E,CAChF,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChG,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3D,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9C,cAAc,EAAE,YAAY;YAC5B,gBAAgB,EAAE,GAAG;YACrB,eAAe,EAAE,qCAAqC;YACtD,6BAA6B,EAAE,GAAG;YAClC,8BAA8B,EAAE,cAAc;YAC9C,wBAAwB,EAAE,SAAS;SACpC,CAAC,CAAA;QACF,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAA;QACtE,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;QACnC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YACxB,kDAAkD;YAClD,uDAAuD;SACxD,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAC7C,8DAA8D;QAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAA;QACzC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAA;QAChC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC9B,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;IAC9F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;QACnC,MAAM,KAAK,GAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACjF,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,iBAAiB;SAClB,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAE,CAAC,EAAE,CAAC,CAAA;QACpD,MAAM,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;QACnC,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA;QACnC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,EAAE;YACxC,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,GAAG,EAAE;gBACT,MAAM,OAAO,CAAA;YACf,CAAC;SACF,CAAC,CAAA;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAC/B,yDAAyD,EACzD,OAAO,CACR,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE;YACjC,IAAI,EAAE,GAAG,EAAE;gBACT,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC;SACF,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxE,eAAe,EAAE,CAAC,yBAAyB,CAAC;SAC7C,CAAC,CAAA;QACF,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACtE,eAAe,EAAE,CAAC,sBAAsB,CAAC;SAC1C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QACzC,MAAM,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IAC1D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/health.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP health endpoints for composed-server hosts (server path only).
|
|
3
|
+
*
|
|
4
|
+
* Kubernetes-style split: `<path>/live` answers as soon as the process serves
|
|
5
|
+
* HTTP (only a wedged event loop fails it); `<path>/ready` additionally runs
|
|
6
|
+
* the host's readiness checks — the server's OWN dependencies (the profile/
|
|
7
|
+
* dashboard database), deliberately never the engines or Prometheus: those
|
|
8
|
+
* are upstreams whose outages the tools report as error results, and taking
|
|
9
|
+
* the server out of rotation for them would turn a visible error into a
|
|
10
|
+
* silent absence. The bare `<path>` aliases readiness for probes that know
|
|
11
|
+
* only one URL (Docker HEALTHCHECK, Fly, Compose `service_healthy`).
|
|
12
|
+
*
|
|
13
|
+
* Outside mcp-use's OAuth gate by construction: the bearer check is scoped
|
|
14
|
+
* to the MCP base path, so probes need no token.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* The narrow structural route surface (`server.get(path, handler)`) — hosts
|
|
18
|
+
* pass an `MCPServer` without this module importing mcp-use or hono. Handlers
|
|
19
|
+
* return Web-standard `Response`s, which hono passes through untouched.
|
|
20
|
+
*/
|
|
21
|
+
export interface HttpRouteHost {
|
|
22
|
+
get(path: string, handler: (ctx: unknown) => Response | Promise<Response>): unknown;
|
|
23
|
+
}
|
|
24
|
+
/** Resolves when the dependency is usable; throws or rejects when it is not. */
|
|
25
|
+
export type ReadinessCheck = () => void | Promise<void>;
|
|
26
|
+
export interface HealthOptions {
|
|
27
|
+
/** Route prefix (default `/health` → `/health`, `/health/live`, `/health/ready`). */
|
|
28
|
+
path?: string;
|
|
29
|
+
/** Named readiness checks; every one must pass for `ready` to answer 200. */
|
|
30
|
+
readiness?: Record<string, ReadinessCheck>;
|
|
31
|
+
/** Per-check budget in ms (default 2000) — a hung dependency must fail the probe, not hang it. */
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
/** Log prefix for failed checks (default `health`). */
|
|
34
|
+
label?: string;
|
|
35
|
+
/**
|
|
36
|
+
* True once the host is shutting down: readiness then answers 503
|
|
37
|
+
* `draining` (liveness stays 200), so a load balancer stops routing new
|
|
38
|
+
* traffic while in-flight requests finish.
|
|
39
|
+
*/
|
|
40
|
+
draining?: () => boolean;
|
|
41
|
+
}
|
|
42
|
+
export type HealthStatus = "up" | "down";
|
|
43
|
+
/** The readiness body: the overall verdict plus one entry per check. */
|
|
44
|
+
export interface HealthReport {
|
|
45
|
+
/** `draining` while the host shuts down, whatever the checks say. */
|
|
46
|
+
status: HealthStatus | "draining";
|
|
47
|
+
checks: Record<string, HealthStatus>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Register `<path>/live`, `<path>/ready` and `<path>` (= ready). Readiness
|
|
51
|
+
* answers 200 with `{ status: "up", checks }` or 503 with `status: "down"`
|
|
52
|
+
* and the failing checks marked (`status: "draining"` once `draining()`
|
|
53
|
+
* holds); the checks run in parallel, each under
|
|
54
|
+
* `timeoutMs`. Register `installMetrics` first if probe traffic should show
|
|
55
|
+
* up in the HTTP metrics (hono only wraps routes registered after the
|
|
56
|
+
* middleware).
|
|
57
|
+
*/
|
|
58
|
+
export declare function installHealthEndpoints(server: HttpRouteHost, options?: HealthOptions): void;
|
|
59
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAA;CACpF;AAED,gFAAgF;AAChF,MAAM,MAAM,cAAc,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAEvD,MAAM,WAAW,aAAa;IAC5B,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC1C,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAA;CACzB;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,MAAM,CAAA;AAExC,wEAAwE;AACxE,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,MAAM,EAAE,YAAY,GAAG,UAAU,CAAA;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CACrC;AA2CD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,GAAE,aAAkB,GAAG,IAAI,CAmB/F"}
|
package/dist/health.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP health endpoints for composed-server hosts (server path only).
|
|
3
|
+
*
|
|
4
|
+
* Kubernetes-style split: `<path>/live` answers as soon as the process serves
|
|
5
|
+
* HTTP (only a wedged event loop fails it); `<path>/ready` additionally runs
|
|
6
|
+
* the host's readiness checks — the server's OWN dependencies (the profile/
|
|
7
|
+
* dashboard database), deliberately never the engines or Prometheus: those
|
|
8
|
+
* are upstreams whose outages the tools report as error results, and taking
|
|
9
|
+
* the server out of rotation for them would turn a visible error into a
|
|
10
|
+
* silent absence. The bare `<path>` aliases readiness for probes that know
|
|
11
|
+
* only one URL (Docker HEALTHCHECK, Fly, Compose `service_healthy`).
|
|
12
|
+
*
|
|
13
|
+
* Outside mcp-use's OAuth gate by construction: the bearer check is scoped
|
|
14
|
+
* to the MCP base path, so probes need no token.
|
|
15
|
+
*/
|
|
16
|
+
const jsonResponse = (status, body) => new Response(JSON.stringify(body), {
|
|
17
|
+
status,
|
|
18
|
+
headers: { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" },
|
|
19
|
+
});
|
|
20
|
+
async function withTimeout(check, ms) {
|
|
21
|
+
let timer;
|
|
22
|
+
const timeout = new Promise((_, reject) => {
|
|
23
|
+
timer = setTimeout(() => reject(new Error(`timed out after ${ms}ms`)), ms);
|
|
24
|
+
timer.unref();
|
|
25
|
+
});
|
|
26
|
+
try {
|
|
27
|
+
// `.then(check)` turns a synchronous throw into a rejection like any other.
|
|
28
|
+
await Promise.race([Promise.resolve().then(check), timeout]);
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function runReadinessChecks(checks, timeoutMs, label) {
|
|
35
|
+
const entries = await Promise.all(Object.entries(checks).map(async ([name, check]) => {
|
|
36
|
+
try {
|
|
37
|
+
await withTimeout(check, timeoutMs);
|
|
38
|
+
return [name, "up"];
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
// The reason goes to the log, not the (unauthenticated) response body.
|
|
42
|
+
console.warn(`[${label}] readiness check "${name}" failed:`, error);
|
|
43
|
+
return [name, "down"];
|
|
44
|
+
}
|
|
45
|
+
}));
|
|
46
|
+
const status = entries.every(([, s]) => s === "up") ? "up" : "down";
|
|
47
|
+
return { status, checks: Object.fromEntries(entries) };
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Register `<path>/live`, `<path>/ready` and `<path>` (= ready). Readiness
|
|
51
|
+
* answers 200 with `{ status: "up", checks }` or 503 with `status: "down"`
|
|
52
|
+
* and the failing checks marked (`status: "draining"` once `draining()`
|
|
53
|
+
* holds); the checks run in parallel, each under
|
|
54
|
+
* `timeoutMs`. Register `installMetrics` first if probe traffic should show
|
|
55
|
+
* up in the HTTP metrics (hono only wraps routes registered after the
|
|
56
|
+
* middleware).
|
|
57
|
+
*/
|
|
58
|
+
export function installHealthEndpoints(server, options = {}) {
|
|
59
|
+
const { path = "/health", readiness = {}, timeoutMs = 2000, label = "health", draining = () => false, } = options;
|
|
60
|
+
const live = () => jsonResponse(200, { status: "up" });
|
|
61
|
+
const ready = async () => {
|
|
62
|
+
if (draining())
|
|
63
|
+
return jsonResponse(503, { status: "draining", checks: {} });
|
|
64
|
+
const report = await runReadinessChecks(readiness, timeoutMs, label);
|
|
65
|
+
// Re-checked: a probe in flight when the drain began must not report up.
|
|
66
|
+
if (draining())
|
|
67
|
+
return jsonResponse(503, { ...report, status: "draining" });
|
|
68
|
+
return jsonResponse(report.status === "up" ? 200 : 503, report);
|
|
69
|
+
};
|
|
70
|
+
server.get(`${path}/live`, live);
|
|
71
|
+
server.get(`${path}/ready`, ready);
|
|
72
|
+
server.get(path, ready);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../src/health.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { installHealthEndpoints } from "./health.js";
|
|
3
|
+
function install(options) {
|
|
4
|
+
const routes = new Map();
|
|
5
|
+
const server = {
|
|
6
|
+
get: (path, handler) => routes.set(path, handler),
|
|
7
|
+
};
|
|
8
|
+
installHealthEndpoints(server, options);
|
|
9
|
+
const call = async (path) => {
|
|
10
|
+
const handler = routes.get(path);
|
|
11
|
+
if (!handler)
|
|
12
|
+
throw new Error(`no route registered for ${path}`);
|
|
13
|
+
const res = await handler({});
|
|
14
|
+
return { status: res.status, body: (await res.json()), headers: res.headers };
|
|
15
|
+
};
|
|
16
|
+
return { routes, call };
|
|
17
|
+
}
|
|
18
|
+
describe("installHealthEndpoints", () => {
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
vi.restoreAllMocks();
|
|
21
|
+
});
|
|
22
|
+
it("registers live, ready and the bare prefix", () => {
|
|
23
|
+
const { routes } = install();
|
|
24
|
+
expect([...routes.keys()].sort()).toEqual(["/health", "/health/live", "/health/ready"]);
|
|
25
|
+
});
|
|
26
|
+
it("honors a custom prefix", () => {
|
|
27
|
+
const { routes } = install({ path: "/healthz" });
|
|
28
|
+
expect([...routes.keys()].sort()).toEqual(["/healthz", "/healthz/live", "/healthz/ready"]);
|
|
29
|
+
});
|
|
30
|
+
it("live answers up without running any readiness check", async () => {
|
|
31
|
+
const check = vi.fn();
|
|
32
|
+
const { call } = install({ readiness: { db: check } });
|
|
33
|
+
const res = await call("/health/live");
|
|
34
|
+
expect(res.status).toBe(200);
|
|
35
|
+
expect(res.body).toEqual({ status: "up" });
|
|
36
|
+
expect(check).not.toHaveBeenCalled();
|
|
37
|
+
});
|
|
38
|
+
it("marks probe responses uncacheable JSON", async () => {
|
|
39
|
+
const { call } = install();
|
|
40
|
+
const res = await call("/health/live");
|
|
41
|
+
expect(res.headers.get("cache-control")).toBe("no-store");
|
|
42
|
+
expect(res.headers.get("content-type")).toBe("application/json; charset=utf-8");
|
|
43
|
+
});
|
|
44
|
+
it("ready is up with no checks configured", async () => {
|
|
45
|
+
const { call } = install();
|
|
46
|
+
const res = await call("/health/ready");
|
|
47
|
+
expect(res.status).toBe(200);
|
|
48
|
+
expect(res.body).toEqual({ status: "up", checks: {} });
|
|
49
|
+
});
|
|
50
|
+
it("ready is up when every check passes (sync and async)", async () => {
|
|
51
|
+
const { call } = install({ readiness: { db: async () => { }, disk: () => { } } });
|
|
52
|
+
const res = await call("/health/ready");
|
|
53
|
+
expect(res.status).toBe(200);
|
|
54
|
+
expect(res.body).toEqual({ status: "up", checks: { db: "up", disk: "up" } });
|
|
55
|
+
});
|
|
56
|
+
it("ready is 503 naming the failing check, and logs the reason instead of exposing it", async () => {
|
|
57
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
58
|
+
const { call } = install({
|
|
59
|
+
label: "test-app",
|
|
60
|
+
readiness: {
|
|
61
|
+
db: async () => {
|
|
62
|
+
throw new Error("connect ECONNREFUSED");
|
|
63
|
+
},
|
|
64
|
+
disk: () => { },
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
const res = await call("/health/ready");
|
|
68
|
+
expect(res.status).toBe(503);
|
|
69
|
+
expect(res.body).toEqual({ status: "down", checks: { db: "down", disk: "up" } });
|
|
70
|
+
expect(JSON.stringify(res.body)).not.toContain("ECONNREFUSED");
|
|
71
|
+
expect(warn).toHaveBeenCalledOnce();
|
|
72
|
+
expect(warn.mock.calls[0][0]).toBe('[test-app] readiness check "db" failed:');
|
|
73
|
+
expect(String(warn.mock.calls[0][1])).toContain("ECONNREFUSED");
|
|
74
|
+
});
|
|
75
|
+
it("treats a synchronous throw like a rejection", async () => {
|
|
76
|
+
vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
77
|
+
const { call } = install({
|
|
78
|
+
readiness: {
|
|
79
|
+
boom: () => {
|
|
80
|
+
throw new Error("sync");
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
const res = await call("/health/ready");
|
|
85
|
+
expect(res.status).toBe(503);
|
|
86
|
+
expect(res.body).toEqual({ status: "down", checks: { boom: "down" } });
|
|
87
|
+
});
|
|
88
|
+
it("fails a check that exceeds the timeout instead of hanging the probe", async () => {
|
|
89
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
90
|
+
const { call } = install({
|
|
91
|
+
timeoutMs: 10,
|
|
92
|
+
readiness: { hung: () => new Promise(() => { }) },
|
|
93
|
+
});
|
|
94
|
+
const res = await call("/health/ready");
|
|
95
|
+
expect(res.status).toBe(503);
|
|
96
|
+
expect(res.body).toEqual({ status: "down", checks: { hung: "down" } });
|
|
97
|
+
expect(String(warn.mock.calls[0][1])).toContain("timed out after 10ms");
|
|
98
|
+
});
|
|
99
|
+
it("answers 503 draining once the host drains — without running the checks — while live stays up", async () => {
|
|
100
|
+
const check = vi.fn();
|
|
101
|
+
let draining = false;
|
|
102
|
+
const { call } = install({ readiness: { db: check }, draining: () => draining });
|
|
103
|
+
expect((await call("/health/ready")).status).toBe(200);
|
|
104
|
+
draining = true;
|
|
105
|
+
const ready = await call("/health/ready");
|
|
106
|
+
expect(ready.status).toBe(503);
|
|
107
|
+
expect(ready.body).toEqual({ status: "draining", checks: {} });
|
|
108
|
+
expect((await call("/health")).status).toBe(503);
|
|
109
|
+
expect(check).toHaveBeenCalledTimes(1);
|
|
110
|
+
expect((await call("/health/live")).status).toBe(200);
|
|
111
|
+
});
|
|
112
|
+
it("reports draining for a probe that was in flight when the drain began", async () => {
|
|
113
|
+
let draining = false;
|
|
114
|
+
const { call } = install({
|
|
115
|
+
readiness: {
|
|
116
|
+
db: () => {
|
|
117
|
+
draining = true;
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
draining: () => draining,
|
|
121
|
+
});
|
|
122
|
+
const res = await call("/health/ready");
|
|
123
|
+
expect(res.status).toBe(503);
|
|
124
|
+
expect(res.body).toEqual({ status: "draining", checks: { db: "up" } });
|
|
125
|
+
});
|
|
126
|
+
it("the bare prefix aliases readiness", async () => {
|
|
127
|
+
vi.spyOn(console, "warn").mockImplementation(() => undefined);
|
|
128
|
+
const { call } = install({
|
|
129
|
+
readiness: {
|
|
130
|
+
db: async () => {
|
|
131
|
+
throw new Error("down");
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
const res = await call("/health");
|
|
136
|
+
expect(res.status).toBe(503);
|
|
137
|
+
expect(res.body).toEqual({ status: "down", checks: { db: "down" } });
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=health.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.test.js","sourceRoot":"","sources":["../src/health.test.ts"],"names":[],"mappings":"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"}
|