@miragon/pulse-widget-shell 0.0.0-stage → 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 +164 -2
- 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 -3
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `MCP_OAUTH` → the OAuth provider a composition root installs. Every root —
|
|
3
|
+
* the stock server, the composed-server template, a customer fork — wires it
|
|
4
|
+
* the SAME way:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* const oauth = oauthFromEnv({ env, label }) // boot-time parse + warning
|
|
8
|
+
* createComposedServer({ …, oauth }) // installs it, decides toolsets
|
|
9
|
+
* const APP_ENV_VARS = [...OAUTH_ENV_VARS, …] // known to the typo warner
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* With a provider the server is an OAuth resource server: mcp-use validates
|
|
13
|
+
* the bearer token on every `/mcp` request (401 + `WWW-Authenticate`
|
|
14
|
+
* otherwise) against the IdP's JWKS, checks the RFC 8707 resource audience
|
|
15
|
+
* (the server's canonical MCP URL, `MCP_URL`) and serves the `.well-known`
|
|
16
|
+
* discovery metadata; the server never mints tokens. It is also the ONLY
|
|
17
|
+
* caller-identity source: per-user settings and dashboards exist only with it
|
|
18
|
+
* (`resolveProfileKey`), and an installed provider raises every module's
|
|
19
|
+
* no-suffix toolset from the read-only floor to its standard set. A gateway
|
|
20
|
+
* that terminates auth in front of the server is invisible here — identity
|
|
21
|
+
* reaches the server only through this OAuth.
|
|
22
|
+
*
|
|
23
|
+
* Server path only (`@miragon/pulse-widget-shell/server`).
|
|
24
|
+
*/
|
|
25
|
+
import type { OAuthProvider } from "mcp-use/oauth";
|
|
26
|
+
/** The env vars {@link oauthFromEnv} reads — spread them into the root's known-var list. */
|
|
27
|
+
export declare const OAUTH_ENV_VARS: readonly ["MCP_OAUTH"];
|
|
28
|
+
export interface OAuthFromEnvOptions {
|
|
29
|
+
/** Defaults to `process.env`. */
|
|
30
|
+
env?: NodeJS.ProcessEnv;
|
|
31
|
+
/** Log prefix, e.g. `pulse`. */
|
|
32
|
+
label?: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Builds the mcp-use OAuth provider from `MCP_OAUTH` (`keycloak` or `auth0`).
|
|
36
|
+
* Unset or blank → `undefined` plus ONE boot warning naming what that means:
|
|
37
|
+
* an unauthenticated endpoint, read-only defaults, and no saved settings.
|
|
38
|
+
* Invalid JSON, schema violations and stray `MCP_USE_OAUTH_*` fallbacks throw:
|
|
39
|
+
* a deployment that asked for auth must never silently come up without it.
|
|
40
|
+
*/
|
|
41
|
+
export declare function oauthFromEnv(options?: OAuthFromEnvOptions): OAuthProvider<unknown> | undefined;
|
|
42
|
+
//# sourceMappingURL=oauth-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-env.d.ts","sourceRoot":"","sources":["../src/oauth-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAKlD,4FAA4F;AAC5F,eAAO,MAAM,cAAc,wBAAyB,CAAA;AA2BpD,MAAM,WAAW,mBAAmB;IAClC,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,gCAAgC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAaD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE,mBAAwB,GAChC,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CA2CpC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { oauthAuth0Provider } from "mcp-use/oauth/auth0";
|
|
2
|
+
import { oauthKeycloakProvider } from "mcp-use/oauth/keycloak";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
/** The env vars {@link oauthFromEnv} reads — spread them into the root's known-var list. */
|
|
5
|
+
export const OAUTH_ENV_VARS = ["MCP_OAUTH"];
|
|
6
|
+
const keycloakSchema = z.strictObject({
|
|
7
|
+
provider: z.literal("keycloak"),
|
|
8
|
+
serverUrl: z.url(),
|
|
9
|
+
realm: z.string().min(1),
|
|
10
|
+
});
|
|
11
|
+
const auth0Schema = z.strictObject({
|
|
12
|
+
provider: z.literal("auth0"),
|
|
13
|
+
// Bare hostname, no scheme/path — the form mcp-use's provider builds the
|
|
14
|
+
// issuer from; a scheme-prefixed value would only 401 at the first call.
|
|
15
|
+
domain: z
|
|
16
|
+
.string()
|
|
17
|
+
.min(1)
|
|
18
|
+
.refine((d) => !d.includes("://") && !d.includes("/"), {
|
|
19
|
+
message: 'domain must be a bare hostname, e.g. "tenant.eu.auth0.com" (no scheme, no path)',
|
|
20
|
+
}),
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* Strict on purpose: a key the server does not honor (an `audience`, a
|
|
24
|
+
* client secret) fails the boot instead of being dropped silently — a
|
|
25
|
+
* deployment that asked for a check must never come up without it.
|
|
26
|
+
*/
|
|
27
|
+
const oauthConfigSchema = z.discriminatedUnion("provider", [keycloakSchema, auth0Schema]);
|
|
28
|
+
/**
|
|
29
|
+
* The provider in the `unknown` user slot `createComposedServer` takes. Since
|
|
30
|
+
* mcp-use 2.7 the provider's optional `setup(host)` hook takes the user type
|
|
31
|
+
* in parameter position, which makes `OAuthProvider<TUser>` invariant — a
|
|
32
|
+
* Keycloak- or Auth0-typed provider no longer widens on its own. Sound: every
|
|
33
|
+
* user the host hands out went through the provider's own `mapAuthInfo`, and
|
|
34
|
+
* every consumer reads it structurally (`resolveCaller`).
|
|
35
|
+
*/
|
|
36
|
+
const withUnknownUser = (provider) => provider;
|
|
37
|
+
/**
|
|
38
|
+
* Builds the mcp-use OAuth provider from `MCP_OAUTH` (`keycloak` or `auth0`).
|
|
39
|
+
* Unset or blank → `undefined` plus ONE boot warning naming what that means:
|
|
40
|
+
* an unauthenticated endpoint, read-only defaults, and no saved settings.
|
|
41
|
+
* Invalid JSON, schema violations and stray `MCP_USE_OAUTH_*` fallbacks throw:
|
|
42
|
+
* a deployment that asked for auth must never silently come up without it.
|
|
43
|
+
*/
|
|
44
|
+
export function oauthFromEnv(options = {}) {
|
|
45
|
+
const { env = process.env, label = "oauth" } = options;
|
|
46
|
+
const raw = env.MCP_OAUTH?.trim();
|
|
47
|
+
if (!raw) {
|
|
48
|
+
console.warn(`[${label}] MCP_OAUTH is unset — there is no caller identity: modules without an explicit toolset run read-only, and user settings cannot be saved. Set MCP_OAUTH, or widen with MCP_ACTIVE_MODULES=<module>:<toolset> (anyone who reaches this port gets that surface).`);
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
let json;
|
|
52
|
+
try {
|
|
53
|
+
json = JSON.parse(raw);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error(`MCP_OAUTH is not valid JSON. Expected e.g. {"provider":"keycloak","serverUrl":"https://kc.example.com","realm":"my-realm"}`);
|
|
57
|
+
}
|
|
58
|
+
const parsed = oauthConfigSchema.safeParse(json);
|
|
59
|
+
if (!parsed.success) {
|
|
60
|
+
throw new Error(`MCP_OAUTH is invalid:\n${z.prettifyError(parsed.error)}`);
|
|
61
|
+
}
|
|
62
|
+
// mcp-use's provider factories silently fall back to their own
|
|
63
|
+
// MCP_USE_OAUTH_* variables for omitted fields — read from `process.env`,
|
|
64
|
+
// whatever `env` this call was handed. MCP_OAUTH is the single config
|
|
65
|
+
// surface: fail fast on strays.
|
|
66
|
+
const strays = Object.keys(process.env).filter((k) => k.startsWith("MCP_USE_OAUTH_"));
|
|
67
|
+
if (strays.length > 0) {
|
|
68
|
+
throw new Error(`MCP_OAUTH is the single OAuth config surface — unset ${strays.join(", ")} (mcp-use would silently use them as fallbacks for omitted fields).`);
|
|
69
|
+
}
|
|
70
|
+
const config = parsed.data;
|
|
71
|
+
switch (config.provider) {
|
|
72
|
+
case "keycloak":
|
|
73
|
+
return withUnknownUser(oauthKeycloakProvider({ serverUrl: config.serverUrl, realm: config.realm }));
|
|
74
|
+
case "auth0":
|
|
75
|
+
return withUnknownUser(oauthAuth0Provider({ domain: config.domain }));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=oauth-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-env.js","sourceRoot":"","sources":["../src/oauth-env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-env.test.d.ts","sourceRoot":"","sources":["../src/oauth-env.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { OAUTH_ENV_VARS, oauthFromEnv } from "./oauth-env.js";
|
|
3
|
+
const KEYCLOAK = { provider: "keycloak", serverUrl: "https://kc.example.com", realm: "platform" };
|
|
4
|
+
/** `oauthFromEnv` over a given `MCP_OAUTH` value (an object is JSON-encoded). */
|
|
5
|
+
const fromEnv = (raw) => oauthFromEnv({
|
|
6
|
+
env: { MCP_OAUTH: typeof raw === "object" ? JSON.stringify(raw) : raw },
|
|
7
|
+
label: "test-root",
|
|
8
|
+
});
|
|
9
|
+
afterEach(() => {
|
|
10
|
+
vi.unstubAllEnvs();
|
|
11
|
+
vi.restoreAllMocks();
|
|
12
|
+
});
|
|
13
|
+
describe("oauthFromEnv", () => {
|
|
14
|
+
it("names the one env var it reads", () => {
|
|
15
|
+
expect(OAUTH_ENV_VARS).toEqual(["MCP_OAUTH"]);
|
|
16
|
+
});
|
|
17
|
+
it("installs nothing when MCP_OAUTH is unset or blank — and says what that means, once", () => {
|
|
18
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
19
|
+
for (const raw of [undefined, "", " "])
|
|
20
|
+
expect(fromEnv(raw)).toBeUndefined();
|
|
21
|
+
expect(warn).toHaveBeenCalledTimes(3);
|
|
22
|
+
expect(warn.mock.calls[0][0]).toMatch(/^\[test-root\] MCP_OAUTH is unset — there is no caller identity/);
|
|
23
|
+
expect(warn.mock.calls[0][0]).toContain("user settings cannot be saved");
|
|
24
|
+
});
|
|
25
|
+
it("reads process.env by default", () => {
|
|
26
|
+
vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
27
|
+
vi.stubEnv("MCP_OAUTH", JSON.stringify(KEYCLOAK));
|
|
28
|
+
expect(oauthFromEnv()?.oauthMetadata.issuer).toBe("https://kc.example.com/realms/platform");
|
|
29
|
+
});
|
|
30
|
+
// Exact assertions on purpose: the Keycloak factory interpolates
|
|
31
|
+
// serverUrl/realm, so swapped arguments would still construct — only exact
|
|
32
|
+
// endpoint values catch that.
|
|
33
|
+
it("builds a Keycloak provider with the exact realm endpoints", () => {
|
|
34
|
+
const provider = fromEnv(KEYCLOAK);
|
|
35
|
+
expect(provider?.oauthMetadata.issuer).toBe("https://kc.example.com/realms/platform");
|
|
36
|
+
expect(provider?.oauthMetadata.authorization_endpoint).toBe("https://kc.example.com/realms/platform/protocol/openid-connect/auth");
|
|
37
|
+
expect(provider?.oauthMetadata.token_endpoint).toBe("https://kc.example.com/realms/platform/protocol/openid-connect/token");
|
|
38
|
+
});
|
|
39
|
+
it("maps the token subject as the caller id (`user.id`, the spelling resolveCaller reads)", () => {
|
|
40
|
+
const extra = fromEnv(KEYCLOAK).mapAuthInfo({
|
|
41
|
+
token: "t",
|
|
42
|
+
clientId: "c",
|
|
43
|
+
scopes: [],
|
|
44
|
+
extra: { payload: { sub: "user-123", realm_access: { roles: [] } } },
|
|
45
|
+
});
|
|
46
|
+
expect(extra.user).toMatchObject({ id: "user-123" });
|
|
47
|
+
expect(extra.user).not.toHaveProperty("userId");
|
|
48
|
+
});
|
|
49
|
+
it("builds an Auth0 provider from the bare tenant domain", () => {
|
|
50
|
+
const provider = fromEnv({ provider: "auth0", domain: "tenant.auth0.com" });
|
|
51
|
+
expect(provider?.oauthMetadata.issuer).toBe("https://tenant.auth0.com/");
|
|
52
|
+
expect(provider?.oauthMetadata.authorization_endpoint).toBe("https://tenant.auth0.com/authorize");
|
|
53
|
+
expect(provider?.oauthMetadata.token_endpoint).toBe("https://tenant.auth0.com/oauth/token");
|
|
54
|
+
});
|
|
55
|
+
it("rejects a scheme-prefixed auth0 domain at boot instead of 401ing later", () => {
|
|
56
|
+
expect(() => fromEnv({ provider: "auth0", domain: "https://tenant.auth0.com" })).toThrow(/bare hostname/);
|
|
57
|
+
expect(() => fromEnv({ provider: "auth0", domain: "tenant.auth0.com/x" })).toThrow(/bare hostname/);
|
|
58
|
+
});
|
|
59
|
+
it("rejects invalid JSON with an actionable message", () => {
|
|
60
|
+
expect(() => fromEnv("keycloak")).toThrow(/MCP_OAUTH is not valid JSON/);
|
|
61
|
+
});
|
|
62
|
+
it("rejects unknown providers, missing fields and keys it would not honor", () => {
|
|
63
|
+
expect(() => fromEnv({ provider: "okta" })).toThrow(/MCP_OAUTH is invalid/);
|
|
64
|
+
expect(() => fromEnv({ provider: "oidc", issuer: "https://idp.example.com" })).toThrow(/MCP_OAUTH is invalid/);
|
|
65
|
+
expect(() => fromEnv({ provider: "keycloak", serverUrl: "https://kc.example.com" })).toThrow(/realm/);
|
|
66
|
+
expect(() => fromEnv({ ...KEYCLOAK, serverUrl: "not a url" })).toThrow(/serverUrl/);
|
|
67
|
+
expect(() => fromEnv({ ...KEYCLOAK, realm: "" })).toThrow(/realm/);
|
|
68
|
+
// An audience mcp-use 2 cannot check must fail loudly, not be dropped.
|
|
69
|
+
expect(() => fromEnv({ ...KEYCLOAK, audience: "https://mcp.example.com/mcp" })).toThrow(/audience/);
|
|
70
|
+
});
|
|
71
|
+
it("fails fast when stray MCP_USE_OAUTH_* env vars could silently alter the config", () => {
|
|
72
|
+
vi.stubEnv("MCP_USE_OAUTH_KEYCLOAK_AUDIENCE", "https://other-api.example.com");
|
|
73
|
+
expect(() => fromEnv(KEYCLOAK)).toThrow(/unset MCP_USE_OAUTH_KEYCLOAK_AUDIENCE/);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=oauth-env.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-env.test.js","sourceRoot":"","sources":["../src/oauth-env.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7D,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,wBAAwB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AAEjG,iFAAiF;AACjF,MAAM,OAAO,GAAG,CAAC,GAAgC,EAAE,EAAE,CACnD,YAAY,CAAC;IACX,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;IACvE,KAAK,EAAE,WAAW;CACnB,CAAC,CAAA;AAEJ,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,aAAa,EAAE,CAAA;IAClB,EAAE,CAAC,eAAe,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACnE,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC;YAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QAC9E,MAAM,CAAC,IAAI,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CACnC,iEAAiE,CAClE,CAAA;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACtD,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAA;QACjD,MAAM,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,iEAAiE;IACjE,2EAA2E;IAC3E,8BAA8B;IAC9B,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;QAClC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;QACrF,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC,IAAI,CACzD,qEAAqE,CACtE,CAAA;QACD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CACjD,sEAAsE,CACvE,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAE,CAAC,WAAW,CAAC;YAC3C,KAAK,EAAE,GAAG;YACV,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE;SACrE,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAA;QACpD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAC3E,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QACxE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC,IAAI,CACzD,oCAAoC,CACrC,CAAA;QACD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC,OAAO,CACtF,eAAe,CAChB,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,OAAO,CAChF,eAAe,CAChB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;QAC3E,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC,OAAO,CACpF,sBAAsB,CACvB,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC,OAAO,CAC1F,OAAO,CACR,CAAA;QACD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QACnF,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAClE,uEAAuE;QACvE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,QAAQ,EAAE,QAAQ,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC,OAAO,CACrF,UAAU,CACX,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,EAAE,CAAC,OAAO,CAAC,iCAAiC,EAAE,+BAA+B,CAAC,CAAA;QAC9E,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,uCAAuC,CAAC,CAAA;IAClF,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type postgres from "postgres";
|
|
2
|
+
import type { ReadinessCheck } from "./health.js";
|
|
3
|
+
/**
|
|
4
|
+
* The Postgres infrastructure shared by every store in this package: the one
|
|
5
|
+
* place a postgres.js client is constructed, plus the migration runner that
|
|
6
|
+
* executes the DDL each store exports (`PROFILE_STORE_MIGRATIONS`,
|
|
7
|
+
* `DASHBOARD_STORE_MIGRATIONS`). A composed server that persists to Postgres
|
|
8
|
+
* needs both — exporting the migration arrays without the runner would force
|
|
9
|
+
* every consumer to copy it.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Connections are lazy (opened on first query), but a root that persists to
|
|
13
|
+
* Postgres runs `runMigrations` before it listens (the app's `initRuntime`),
|
|
14
|
+
* so an unreachable database fails the
|
|
15
|
+
* boot once the 10 s `connect_timeout` runs out (under a restart policy: a
|
|
16
|
+
* restart loop until the database answers). After boot, reconnects after a
|
|
17
|
+
* scale-to-zero wake need no extra handling.
|
|
18
|
+
*
|
|
19
|
+
* The driver is loaded through a DYNAMIC import and every other reference in
|
|
20
|
+
* this package is `import type` — deliberately, and the reason this function
|
|
21
|
+
* is async: `postgres` is an OPTIONAL peer dependency, but `/server`
|
|
22
|
+
* re-exports this module, so a static import would execute on every consumer's
|
|
23
|
+
* boot and crash the ones that persist to disk or memory (the composed-server
|
|
24
|
+
* template installs no `postgres`) with ERR_MODULE_NOT_FOUND. Never "simplify"
|
|
25
|
+
* it back to a top-level import.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSql(databaseUrl: string): Promise<postgres.Sql>;
|
|
28
|
+
/**
|
|
29
|
+
* The `/health/ready` check for a postgres.js client: one `SELECT 1` round
|
|
30
|
+
* trip through the pool, so a database that goes away after boot turns the
|
|
31
|
+
* server not ready instead of failing the next save. Lives next to `createSql` so
|
|
32
|
+
* every composition root that persists to Postgres wires the same probe.
|
|
33
|
+
*/
|
|
34
|
+
export declare function postgresReadinessCheck(sql: postgres.Sql): ReadinessCheck;
|
|
35
|
+
/**
|
|
36
|
+
* One named, append-only migration. Statements are plain SQL strings compiled
|
|
37
|
+
* into the bundle — .sql files would not survive a `pnpm deploy` + dist-copy
|
|
38
|
+
* packaging. Store owners export their own migrations; the composition root
|
|
39
|
+
* concatenates them in a fixed order.
|
|
40
|
+
*
|
|
41
|
+
* `name` is the identity recorded in `schema_migrations`, so it is a permanent
|
|
42
|
+
* key, not a label: renaming one re-runs it against every existing database
|
|
43
|
+
* (harmless only because the shipped DDL is `IF NOT EXISTS`), and reusing a
|
|
44
|
+
* name for different DDL silently skips it. Numeric prefixes are ordering
|
|
45
|
+
* hints for readers only — the array order decides.
|
|
46
|
+
*/
|
|
47
|
+
export interface Migration {
|
|
48
|
+
name: string;
|
|
49
|
+
statements: readonly string[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Apply all not-yet-applied migrations in order, tracked by name in
|
|
53
|
+
* `schema_migrations`. Runs as a single transaction under
|
|
54
|
+
* `pg_advisory_xact_lock`, so two instances booting against the same database
|
|
55
|
+
* cannot interleave DDL; the lock releases with the commit. Returns the names
|
|
56
|
+
* that were newly applied (for boot logging).
|
|
57
|
+
*/
|
|
58
|
+
export declare function runMigrations(sql: postgres.Sql, migrations: readonly Migration[]): Promise<string[]>;
|
|
59
|
+
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAW1E;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,GAAG,cAAc,CAIxE;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,SAAS,MAAM,EAAE,CAAA;CAC9B;AAMD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,UAAU,EAAE,SAAS,SAAS,EAAE,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBnB"}
|
package/dist/postgres.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Postgres infrastructure shared by every store in this package: the one
|
|
3
|
+
* place a postgres.js client is constructed, plus the migration runner that
|
|
4
|
+
* executes the DDL each store exports (`PROFILE_STORE_MIGRATIONS`,
|
|
5
|
+
* `DASHBOARD_STORE_MIGRATIONS`). A composed server that persists to Postgres
|
|
6
|
+
* needs both — exporting the migration arrays without the runner would force
|
|
7
|
+
* every consumer to copy it.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Connections are lazy (opened on first query), but a root that persists to
|
|
11
|
+
* Postgres runs `runMigrations` before it listens (the app's `initRuntime`),
|
|
12
|
+
* so an unreachable database fails the
|
|
13
|
+
* boot once the 10 s `connect_timeout` runs out (under a restart policy: a
|
|
14
|
+
* restart loop until the database answers). After boot, reconnects after a
|
|
15
|
+
* scale-to-zero wake need no extra handling.
|
|
16
|
+
*
|
|
17
|
+
* The driver is loaded through a DYNAMIC import and every other reference in
|
|
18
|
+
* this package is `import type` — deliberately, and the reason this function
|
|
19
|
+
* is async: `postgres` is an OPTIONAL peer dependency, but `/server`
|
|
20
|
+
* re-exports this module, so a static import would execute on every consumer's
|
|
21
|
+
* boot and crash the ones that persist to disk or memory (the composed-server
|
|
22
|
+
* template installs no `postgres`) with ERR_MODULE_NOT_FOUND. Never "simplify"
|
|
23
|
+
* it back to a top-level import.
|
|
24
|
+
*/
|
|
25
|
+
export async function createSql(databaseUrl) {
|
|
26
|
+
const { default: postgres } = await import("postgres");
|
|
27
|
+
return postgres(databaseUrl, {
|
|
28
|
+
// A handful of connections is plenty: every store call is a single short
|
|
29
|
+
// statement or one SELECT…FOR UPDATE transaction.
|
|
30
|
+
max: 5,
|
|
31
|
+
idle_timeout: 30,
|
|
32
|
+
connect_timeout: 10,
|
|
33
|
+
// NOTICEs (e.g. from CREATE TABLE IF NOT EXISTS) are noise on the server log.
|
|
34
|
+
onnotice: () => { },
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The `/health/ready` check for a postgres.js client: one `SELECT 1` round
|
|
39
|
+
* trip through the pool, so a database that goes away after boot turns the
|
|
40
|
+
* server not ready instead of failing the next save. Lives next to `createSql` so
|
|
41
|
+
* every composition root that persists to Postgres wires the same probe.
|
|
42
|
+
*/
|
|
43
|
+
export function postgresReadinessCheck(sql) {
|
|
44
|
+
return async () => {
|
|
45
|
+
await sql `SELECT 1`;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Arbitrary but stable app-wide key ("mira" in hex) for the boot-time advisory
|
|
49
|
+
// lock — it serializes concurrently booting instances, not tables.
|
|
50
|
+
const MIGRATION_LOCK_KEY = 0x6d697261;
|
|
51
|
+
/**
|
|
52
|
+
* Apply all not-yet-applied migrations in order, tracked by name in
|
|
53
|
+
* `schema_migrations`. Runs as a single transaction under
|
|
54
|
+
* `pg_advisory_xact_lock`, so two instances booting against the same database
|
|
55
|
+
* cannot interleave DDL; the lock releases with the commit. Returns the names
|
|
56
|
+
* that were newly applied (for boot logging).
|
|
57
|
+
*/
|
|
58
|
+
export async function runMigrations(sql, migrations) {
|
|
59
|
+
return await sql.begin(async (tx) => {
|
|
60
|
+
await tx `SELECT pg_advisory_xact_lock(${MIGRATION_LOCK_KEY})`;
|
|
61
|
+
await tx.unsafe(`CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
62
|
+
name TEXT PRIMARY KEY,
|
|
63
|
+
applied_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
64
|
+
)`);
|
|
65
|
+
const appliedRows = await tx `SELECT name FROM schema_migrations`;
|
|
66
|
+
const applied = new Set(appliedRows.map((row) => row.name));
|
|
67
|
+
const newlyApplied = [];
|
|
68
|
+
for (const migration of migrations) {
|
|
69
|
+
if (applied.has(migration.name))
|
|
70
|
+
continue;
|
|
71
|
+
for (const statement of migration.statements) {
|
|
72
|
+
await tx.unsafe(statement);
|
|
73
|
+
}
|
|
74
|
+
await tx `INSERT INTO schema_migrations (name) VALUES (${migration.name})`;
|
|
75
|
+
newlyApplied.push(migration.name);
|
|
76
|
+
}
|
|
77
|
+
return newlyApplied;
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../src/postgres.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB;IACjD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAA;IACtD,OAAO,QAAQ,CAAC,WAAW,EAAE;QAC3B,yEAAyE;QACzE,kDAAkD;QAClD,GAAG,EAAE,CAAC;QACN,YAAY,EAAE,EAAE;QAChB,eAAe,EAAE,EAAE;QACnB,8EAA8E;QAC9E,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;KACnB,CAAC,CAAA;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAiB;IACtD,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,GAAG,CAAA,UAAU,CAAA;IACrB,CAAC,CAAA;AACH,CAAC;AAmBD,+EAA+E;AAC/E,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,UAAU,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAiB,EACjB,UAAgC;IAEhC,OAAO,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAClC,MAAM,EAAE,CAAA,gCAAgC,kBAAkB,GAAG,CAAA;QAC7D,MAAM,EAAE,CAAC,MAAM,CACb;;;QAGE,CACH,CAAA;QACD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAoB,oCAAoC,CAAA;QACpF,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAC3D,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,SAAQ;YACzC,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC7C,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YAC5B,CAAC;YACD,MAAM,EAAE,CAAA,gDAAgD,SAAS,CAAC,IAAI,GAAG,CAAA;YACzE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACnC,CAAC;QACD,OAAO,YAAY,CAAA;IACrB,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisory profile reads — for paths that only PREFER the profile (the
|
|
3
|
+
* summary locale, a saved default engine) and must keep working without it.
|
|
4
|
+
*
|
|
5
|
+
* With `DATABASE_URL` the profile store is a network call, and a preferences
|
|
6
|
+
* outage must never fail a tool whose data comes from the engine or
|
|
7
|
+
* Prometheus — nor put the driver's error text (internal host:port) into a
|
|
8
|
+
* tool result. Save paths and the settings views stay strict: a write must
|
|
9
|
+
* fail visibly.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Read `key`'s record, degrading every failure to "no record": no key, or a
|
|
13
|
+
* store that throws (logged once per outage with a sanitized line, and once
|
|
14
|
+
* when it recovers). Never throws.
|
|
15
|
+
*/
|
|
16
|
+
export declare function readProfileAdvisory<T>(store: {
|
|
17
|
+
get(key: string): Promise<T | undefined>;
|
|
18
|
+
}, key: string | undefined): Promise<T | undefined>;
|
|
19
|
+
//# sourceMappingURL=profile-advisory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-advisory.d.ts","sourceRoot":"","sources":["../src/profile-advisory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiBH;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,KAAK,EAAE;IAAE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;CAAE,EACnD,GAAG,EAAE,MAAM,GAAG,SAAS,GACtB,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAiBxB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisory profile reads — for paths that only PREFER the profile (the
|
|
3
|
+
* summary locale, a saved default engine) and must keep working without it.
|
|
4
|
+
*
|
|
5
|
+
* With `DATABASE_URL` the profile store is a network call, and a preferences
|
|
6
|
+
* outage must never fail a tool whose data comes from the engine or
|
|
7
|
+
* Prometheus — nor put the driver's error text (internal host:port) into a
|
|
8
|
+
* tool result. Save paths and the settings views stay strict: a write must
|
|
9
|
+
* fail visibly.
|
|
10
|
+
*/
|
|
11
|
+
/** Stores currently failing, so an outage logs once instead of once per call. */
|
|
12
|
+
const failingStores = new WeakSet();
|
|
13
|
+
/**
|
|
14
|
+
* The error's class and code only — never its message: driver messages carry
|
|
15
|
+
* the database host:port (and can carry user names), and this line must be
|
|
16
|
+
* safe for any log sink. The readiness probe logs the full error for
|
|
17
|
+
* operators.
|
|
18
|
+
*/
|
|
19
|
+
function describeStoreError(err) {
|
|
20
|
+
if (!(err instanceof Error))
|
|
21
|
+
return typeof err;
|
|
22
|
+
const code = err.code;
|
|
23
|
+
return typeof code === "string" || typeof code === "number" ? `${err.name} ${code}` : err.name;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Read `key`'s record, degrading every failure to "no record": no key, or a
|
|
27
|
+
* store that throws (logged once per outage with a sanitized line, and once
|
|
28
|
+
* when it recovers). Never throws.
|
|
29
|
+
*/
|
|
30
|
+
export async function readProfileAdvisory(store, key) {
|
|
31
|
+
if (key === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
try {
|
|
34
|
+
const record = await store.get(key);
|
|
35
|
+
if (failingStores.delete(store)) {
|
|
36
|
+
console.warn("[profile-store] reachable again — saved preferences apply again");
|
|
37
|
+
}
|
|
38
|
+
return record;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (!failingStores.has(store)) {
|
|
42
|
+
failingStores.add(store);
|
|
43
|
+
console.warn(`[profile-store] read failed (${describeStoreError(err)}) — preference lookups fall back to defaults until the store recovers`);
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=profile-advisory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-advisory.js","sourceRoot":"","sources":["../src/profile-advisory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,iFAAiF;AACjF,MAAM,aAAa,GAAG,IAAI,OAAO,EAAU,CAAA;AAE3C;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,GAAY;IACtC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,OAAO,GAAG,CAAA;IAC9C,MAAM,IAAI,GAAI,GAA0B,CAAC,IAAI,CAAA;IAC7C,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAA;AAChG,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAmD,EACnD,GAAuB;IAEvB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnC,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAA;QACjF,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACxB,OAAO,CAAC,IAAI,CACV,gCAAgC,kBAAkB,CAAC,GAAG,CAAC,uEAAuE,CAC/H,CAAA;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-advisory.test.d.ts","sourceRoot":"","sources":["../src/profile-advisory.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { readProfileAdvisory } from "./profile-advisory.js";
|
|
3
|
+
/** A driver-shaped outage: the message carries the database host:port. */
|
|
4
|
+
function driverError() {
|
|
5
|
+
return Object.assign(new Error("connect ECONNREFUSED 10.1.2.3:5432"), { code: "ECONNREFUSED" });
|
|
6
|
+
}
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
vi.restoreAllMocks();
|
|
9
|
+
});
|
|
10
|
+
describe("readProfileAdvisory", () => {
|
|
11
|
+
it("returns the stored record", async () => {
|
|
12
|
+
const store = { get: (key) => Promise.resolve({ key }) };
|
|
13
|
+
expect(await readProfileAdvisory(store, "user-1")).toEqual({ key: "user-1" });
|
|
14
|
+
});
|
|
15
|
+
it("skips the store entirely without a key", async () => {
|
|
16
|
+
const get = vi.fn(() => Promise.resolve({}));
|
|
17
|
+
expect(await readProfileAdvisory({ get }, undefined)).toBeUndefined();
|
|
18
|
+
expect(get).not.toHaveBeenCalled();
|
|
19
|
+
});
|
|
20
|
+
it("degrades an outage to 'no record' and logs ONE sanitized line per outage", async () => {
|
|
21
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
22
|
+
let down = true;
|
|
23
|
+
const store = {
|
|
24
|
+
get: () => (down ? Promise.reject(driverError()) : Promise.resolve({ language: "de" })),
|
|
25
|
+
};
|
|
26
|
+
expect(await readProfileAdvisory(store, "user-1")).toBeUndefined();
|
|
27
|
+
expect(await readProfileAdvisory(store, "user-1")).toBeUndefined();
|
|
28
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
29
|
+
const line = String(warn.mock.calls[0][0]);
|
|
30
|
+
expect(line).toContain("Error ECONNREFUSED");
|
|
31
|
+
expect(line).not.toMatch(/10\.1\.2\.3|5432/);
|
|
32
|
+
// Recovery is announced once, and the next outage logs again.
|
|
33
|
+
down = false;
|
|
34
|
+
expect(await readProfileAdvisory(store, "user-1")).toEqual({ language: "de" });
|
|
35
|
+
expect(await readProfileAdvisory(store, "user-1")).toEqual({ language: "de" });
|
|
36
|
+
expect(warn).toHaveBeenCalledTimes(2);
|
|
37
|
+
expect(String(warn.mock.calls[1][0])).toContain("reachable again");
|
|
38
|
+
down = true;
|
|
39
|
+
await readProfileAdvisory(store, "user-1");
|
|
40
|
+
expect(warn).toHaveBeenCalledTimes(3);
|
|
41
|
+
});
|
|
42
|
+
it("names only the error class (or type) when there is no code", async () => {
|
|
43
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
44
|
+
await readProfileAdvisory({ get: () => Promise.reject(new TypeError("at 10.1.2.3")) }, "k");
|
|
45
|
+
// A driver rejecting with a bare string (typed as Error only to satisfy the lint).
|
|
46
|
+
const bare = "10.1.2.3:5432";
|
|
47
|
+
await readProfileAdvisory({ get: () => Promise.reject(bare) }, "k");
|
|
48
|
+
expect(String(warn.mock.calls[0][0])).toContain("(TypeError)");
|
|
49
|
+
expect(String(warn.mock.calls[1][0])).toContain("(string)");
|
|
50
|
+
expect(warn.mock.calls.flat().join(" ")).not.toContain("10.1.2.3");
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=profile-advisory.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-advisory.test.js","sourceRoot":"","sources":["../src/profile-advisory.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enumerated profile option sets, kept in a zod-free module so widget code can
|
|
3
|
+
* import the runtime arrays (for select/checkbox option lists) without pulling
|
|
4
|
+
* zod into the UI bundle. `profile-record.ts` builds its `z.enum(...)`s from
|
|
5
|
+
* these, so the two never drift. Exported from BOTH `/server` and `/widgets`.
|
|
6
|
+
*/
|
|
7
|
+
/** UI + summary languages. Extend deliberately — every locale needs a catalog. */
|
|
8
|
+
export declare const LOCALES: readonly ["en", "de"];
|
|
9
|
+
export type Locale = (typeof LOCALES)[number];
|
|
10
|
+
/**
|
|
11
|
+
* Language preference: an explicit locale, or `system` — follow the host's
|
|
12
|
+
* locale (`hostContext.locale`, normalized to a supported language), then
|
|
13
|
+
* English. Server-side summaries have no host locale, so `system` reads as
|
|
14
|
+
* English there (`explicitLocale(...) ?? "en"`).
|
|
15
|
+
*/
|
|
16
|
+
export declare const LANGUAGES: readonly ["system", "en", "de"];
|
|
17
|
+
export type LanguagePref = (typeof LANGUAGES)[number];
|
|
18
|
+
/**
|
|
19
|
+
* The supported locale a language preference names explicitly — `undefined`
|
|
20
|
+
* for `system`, a missing value, or anything this build ships no catalog for.
|
|
21
|
+
* Loose input on purpose: profile feeds arrive untyped.
|
|
22
|
+
*/
|
|
23
|
+
export declare function explicitLocale(language: string | undefined): Locale | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Bumped when the persisted profile shape changes in a migration-relevant way.
|
|
26
|
+
* Every bump needs a matching entry in `PROFILE_MIGRATIONS`
|
|
27
|
+
* (`profile-migrations.ts`) so stored records upgrade on read instead of
|
|
28
|
+
* losing their preferences.
|
|
29
|
+
*
|
|
30
|
+
* v3 is the migration baseline (`PROFILE_MIGRATION_BASELINE`): a
|
|
31
|
+
* connector-free record — language, `modules.<module>` slices + metadata —
|
|
32
|
+
* owned by this core package. The theme preference it once carried is gone
|
|
33
|
+
* (widgets follow the host's theme); a stored `theme` key stays inert in the
|
|
34
|
+
* raw document, so it needed no migration.
|
|
35
|
+
*/
|
|
36
|
+
export declare const PROFILE_SCHEMA_VERSION = 3;
|
|
37
|
+
//# sourceMappingURL=profile-constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-constants.d.ts","sourceRoot":"","sources":["../src/profile-constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,eAAO,MAAM,OAAO,uBAAwB,CAAA;AAC5C,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,SAAS,iCAAkC,CAAA;AACxD,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enumerated profile option sets, kept in a zod-free module so widget code can
|
|
3
|
+
* import the runtime arrays (for select/checkbox option lists) without pulling
|
|
4
|
+
* zod into the UI bundle. `profile-record.ts` builds its `z.enum(...)`s from
|
|
5
|
+
* these, so the two never drift. Exported from BOTH `/server` and `/widgets`.
|
|
6
|
+
*/
|
|
7
|
+
/** UI + summary languages. Extend deliberately — every locale needs a catalog. */
|
|
8
|
+
export const LOCALES = ["en", "de"];
|
|
9
|
+
/**
|
|
10
|
+
* Language preference: an explicit locale, or `system` — follow the host's
|
|
11
|
+
* locale (`hostContext.locale`, normalized to a supported language), then
|
|
12
|
+
* English. Server-side summaries have no host locale, so `system` reads as
|
|
13
|
+
* English there (`explicitLocale(...) ?? "en"`).
|
|
14
|
+
*/
|
|
15
|
+
export const LANGUAGES = ["system", ...LOCALES];
|
|
16
|
+
/**
|
|
17
|
+
* The supported locale a language preference names explicitly — `undefined`
|
|
18
|
+
* for `system`, a missing value, or anything this build ships no catalog for.
|
|
19
|
+
* Loose input on purpose: profile feeds arrive untyped.
|
|
20
|
+
*/
|
|
21
|
+
export function explicitLocale(language) {
|
|
22
|
+
return LOCALES.find((locale) => locale === language);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Bumped when the persisted profile shape changes in a migration-relevant way.
|
|
26
|
+
* Every bump needs a matching entry in `PROFILE_MIGRATIONS`
|
|
27
|
+
* (`profile-migrations.ts`) so stored records upgrade on read instead of
|
|
28
|
+
* losing their preferences.
|
|
29
|
+
*
|
|
30
|
+
* v3 is the migration baseline (`PROFILE_MIGRATION_BASELINE`): a
|
|
31
|
+
* connector-free record — language, `modules.<module>` slices + metadata —
|
|
32
|
+
* owned by this core package. The theme preference it once carried is gone
|
|
33
|
+
* (widgets follow the host's theme); a stored `theme` key stays inert in the
|
|
34
|
+
* raw document, so it needed no migration.
|
|
35
|
+
*/
|
|
36
|
+
export const PROFILE_SCHEMA_VERSION = 3;
|
|
37
|
+
//# sourceMappingURL=profile-constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-constants.js","sourceRoot":"","sources":["../src/profile-constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kFAAkF;AAClF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAU,CAAA;AAG5C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAU,CAAA;AAGxD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAA4B;IACzD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAA;AACtD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAA"}
|