@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,71 @@
|
|
|
1
|
+
import { type ProfileRecord } from "./profile-record.js";
|
|
2
|
+
/** One record-level migration: reshapes the raw JSON of its FROM version in place. */
|
|
3
|
+
type ProfileMigration = (raw: Record<string, unknown>) => void;
|
|
4
|
+
/**
|
|
5
|
+
* The oldest record version this build reads as stored — the start of the
|
|
6
|
+
* migration history. No history predates it (#322): records an earlier
|
|
7
|
+
* pre-production build wrote at an older version are ADOPTED at the
|
|
8
|
+
* baseline, never upgraded. Their fields this build does not know (the flat
|
|
9
|
+
* module preferences of v1/v2) stay inert in the raw document — saves keep
|
|
10
|
+
* them, the per-field projection ignores them — so those preferences read as
|
|
11
|
+
* their defaults, while the fields every record has carried (`language`,
|
|
12
|
+
* `modules`) survive. A missing or out-of-range `schemaVersion`
|
|
13
|
+
* reads as the baseline too.
|
|
14
|
+
*/
|
|
15
|
+
export declare const PROFILE_MIGRATION_BASELINE = 3;
|
|
16
|
+
/**
|
|
17
|
+
* Record-level migrations, keyed by the version they upgrade FROM: one entry
|
|
18
|
+
* for every version from {@link PROFILE_MIGRATION_BASELINE} up to
|
|
19
|
+
* `PROFILE_SCHEMA_VERSION`, so every `PROFILE_SCHEMA_VERSION` bump adds
|
|
20
|
+
* exactly one entry here and a stored record upgrades on read instead of
|
|
21
|
+
* losing its preferences. Migrations transform the raw JSON — the migrated
|
|
22
|
+
* result still goes through the per-field `projectProfileRecord`, which is
|
|
23
|
+
* the actual gate.
|
|
24
|
+
*
|
|
25
|
+
* Exported ONLY for the completeness test in `profile-migrations.test.ts`,
|
|
26
|
+
* which fails the moment a `PROFILE_SCHEMA_VERSION` bump forgets its entry —
|
|
27
|
+
* without it that mistake would surface as preferences read un-migrated.
|
|
28
|
+
*/
|
|
29
|
+
export declare const PROFILE_MIGRATIONS: Readonly<Record<number, ProfileMigration>>;
|
|
30
|
+
/** The history {@link migrateStoredProfile} walks — the shipped one unless a test injects its own. */
|
|
31
|
+
interface ProfileMigrationHistory {
|
|
32
|
+
baseline: number;
|
|
33
|
+
current: number;
|
|
34
|
+
migrations: Readonly<Record<number, ProfileMigration>>;
|
|
35
|
+
}
|
|
36
|
+
/** A stored document after {@link migrateStoredProfile}, plus the version it is now at. */
|
|
37
|
+
export interface MigratedProfileDocument {
|
|
38
|
+
/** A shallow copy of the stored JSON, upgraded as far as the migrations reach. */
|
|
39
|
+
doc: Record<string, unknown>;
|
|
40
|
+
version: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Upgrade a persisted profile document of ANY schema version as far as this
|
|
44
|
+
* build can — the RAW half of the read gate, shared by the read path
|
|
45
|
+
* ({@link parseStoredProfile}) and the save path (`mergeStoredProfile`):
|
|
46
|
+
*
|
|
47
|
+
* - a version below the baseline is adopted AT the baseline (see
|
|
48
|
+
* {@link PROFILE_MIGRATION_BASELINE});
|
|
49
|
+
* - from there it upgrades through {@link PROFILE_MIGRATIONS} step by step;
|
|
50
|
+
* - a NEWER version (written by a newer build — rolling deploy, rollback)
|
|
51
|
+
* passes through untouched: an older build never reshapes it;
|
|
52
|
+
* - a missing migration (a build bug the completeness test catches) stops at
|
|
53
|
+
* the stuck version, so a fixed build can still upgrade the document.
|
|
54
|
+
*
|
|
55
|
+
* Unknown keys always survive. `undefined` only for JSON that is no object.
|
|
56
|
+
*/
|
|
57
|
+
export declare function migrateStoredProfile(json: unknown, history?: ProfileMigrationHistory): MigratedProfileDocument | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Parse a persisted profile document into the current typed record — the
|
|
60
|
+
* read gate shared by every store (mirroring the toolkit's tolerant
|
|
61
|
+
* `parseDashboardRecord`): {@link migrateStoredProfile}, then the per-FIELD
|
|
62
|
+
* projection `projectProfileRecord`, so one value this build cannot validate
|
|
63
|
+
* degrades only that field and a newer build's document reads best-effort
|
|
64
|
+
* instead of as "no record" (which the next save would have written defaults
|
|
65
|
+
* over). Pass the store `key` as the record id; without one the stored `id`
|
|
66
|
+
* is used, and a document carrying none reads as `undefined`, like JSON that
|
|
67
|
+
* is no object.
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseStoredProfile(json: unknown, key?: string): ProfileRecord | undefined;
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=profile-migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-migrations.d.ts","sourceRoot":"","sources":["../src/profile-migrations.ts"],"names":[],"mappings":"AACA,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAE9E,sFAAsF;AACtF,KAAK,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;AAE9D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAE3C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAM,CAAA;AAEhF,sGAAsG;AACtG,UAAU,uBAAuB;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAA;CACvD;AAQD,2FAA2F;AAC3F,MAAM,WAAW,uBAAuB;IACtC,kFAAkF;IAClF,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,uBAAyC,GACjD,uBAAuB,GAAG,SAAS,CAuBrC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAKzF"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { PROFILE_SCHEMA_VERSION } from "./profile-constants.js";
|
|
2
|
+
import { projectProfileRecord } from "./profile-record.js";
|
|
3
|
+
/**
|
|
4
|
+
* The oldest record version this build reads as stored — the start of the
|
|
5
|
+
* migration history. No history predates it (#322): records an earlier
|
|
6
|
+
* pre-production build wrote at an older version are ADOPTED at the
|
|
7
|
+
* baseline, never upgraded. Their fields this build does not know (the flat
|
|
8
|
+
* module preferences of v1/v2) stay inert in the raw document — saves keep
|
|
9
|
+
* them, the per-field projection ignores them — so those preferences read as
|
|
10
|
+
* their defaults, while the fields every record has carried (`language`,
|
|
11
|
+
* `modules`) survive. A missing or out-of-range `schemaVersion`
|
|
12
|
+
* reads as the baseline too.
|
|
13
|
+
*/
|
|
14
|
+
export const PROFILE_MIGRATION_BASELINE = 3;
|
|
15
|
+
/**
|
|
16
|
+
* Record-level migrations, keyed by the version they upgrade FROM: one entry
|
|
17
|
+
* for every version from {@link PROFILE_MIGRATION_BASELINE} up to
|
|
18
|
+
* `PROFILE_SCHEMA_VERSION`, so every `PROFILE_SCHEMA_VERSION` bump adds
|
|
19
|
+
* exactly one entry here and a stored record upgrades on read instead of
|
|
20
|
+
* losing its preferences. Migrations transform the raw JSON — the migrated
|
|
21
|
+
* result still goes through the per-field `projectProfileRecord`, which is
|
|
22
|
+
* the actual gate.
|
|
23
|
+
*
|
|
24
|
+
* Exported ONLY for the completeness test in `profile-migrations.test.ts`,
|
|
25
|
+
* which fails the moment a `PROFILE_SCHEMA_VERSION` bump forgets its entry —
|
|
26
|
+
* without it that mistake would surface as preferences read un-migrated.
|
|
27
|
+
*/
|
|
28
|
+
export const PROFILE_MIGRATIONS = {};
|
|
29
|
+
const SHIPPED_HISTORY = {
|
|
30
|
+
baseline: PROFILE_MIGRATION_BASELINE,
|
|
31
|
+
current: PROFILE_SCHEMA_VERSION,
|
|
32
|
+
migrations: PROFILE_MIGRATIONS,
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Upgrade a persisted profile document of ANY schema version as far as this
|
|
36
|
+
* build can — the RAW half of the read gate, shared by the read path
|
|
37
|
+
* ({@link parseStoredProfile}) and the save path (`mergeStoredProfile`):
|
|
38
|
+
*
|
|
39
|
+
* - a version below the baseline is adopted AT the baseline (see
|
|
40
|
+
* {@link PROFILE_MIGRATION_BASELINE});
|
|
41
|
+
* - from there it upgrades through {@link PROFILE_MIGRATIONS} step by step;
|
|
42
|
+
* - a NEWER version (written by a newer build — rolling deploy, rollback)
|
|
43
|
+
* passes through untouched: an older build never reshapes it;
|
|
44
|
+
* - a missing migration (a build bug the completeness test catches) stops at
|
|
45
|
+
* the stuck version, so a fixed build can still upgrade the document.
|
|
46
|
+
*
|
|
47
|
+
* Unknown keys always survive. `undefined` only for JSON that is no object.
|
|
48
|
+
*/
|
|
49
|
+
export function migrateStoredProfile(json, history = SHIPPED_HISTORY) {
|
|
50
|
+
if (typeof json !== "object" || json === null || Array.isArray(json))
|
|
51
|
+
return undefined;
|
|
52
|
+
const doc = { ...json };
|
|
53
|
+
const { baseline, current, migrations } = history;
|
|
54
|
+
const rawVersion = doc.schemaVersion;
|
|
55
|
+
// `Number.isInteger` is false for anything but an integer NUMBER.
|
|
56
|
+
let version = Number.isInteger(rawVersion) ? Math.max(rawVersion, baseline) : baseline;
|
|
57
|
+
doc.schemaVersion = version;
|
|
58
|
+
while (version < current) {
|
|
59
|
+
const migrate = migrations[version];
|
|
60
|
+
if (!migrate) {
|
|
61
|
+
console.error(`[widget-shell] No profile migration from schema v${version} — reading the stored record best-effort and keeping it un-migrated`);
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
migrate(doc);
|
|
65
|
+
version += 1;
|
|
66
|
+
doc.schemaVersion = version;
|
|
67
|
+
}
|
|
68
|
+
return { doc, version };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse a persisted profile document into the current typed record — the
|
|
72
|
+
* read gate shared by every store (mirroring the toolkit's tolerant
|
|
73
|
+
* `parseDashboardRecord`): {@link migrateStoredProfile}, then the per-FIELD
|
|
74
|
+
* projection `projectProfileRecord`, so one value this build cannot validate
|
|
75
|
+
* degrades only that field and a newer build's document reads best-effort
|
|
76
|
+
* instead of as "no record" (which the next save would have written defaults
|
|
77
|
+
* over). Pass the store `key` as the record id; without one the stored `id`
|
|
78
|
+
* is used, and a document carrying none reads as `undefined`, like JSON that
|
|
79
|
+
* is no object.
|
|
80
|
+
*/
|
|
81
|
+
export function parseStoredProfile(json, key) {
|
|
82
|
+
const migrated = migrateStoredProfile(json);
|
|
83
|
+
if (!migrated)
|
|
84
|
+
return undefined;
|
|
85
|
+
const id = key ?? (typeof migrated.doc.id === "string" ? migrated.doc.id : undefined);
|
|
86
|
+
return id === undefined ? undefined : projectProfileRecord(migrated.doc, id);
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=profile-migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-migrations.js","sourceRoot":"","sources":["../src/profile-migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,oBAAoB,EAAsB,MAAM,qBAAqB,CAAA;AAK9E;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAE3C;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA+C,EAAE,CAAA;AAShF,MAAM,eAAe,GAA4B;IAC/C,QAAQ,EAAE,0BAA0B;IACpC,OAAO,EAAE,sBAAsB;IAC/B,UAAU,EAAE,kBAAkB;CAC/B,CAAA;AASD;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAa,EACb,UAAmC,eAAe;IAElD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACtF,MAAM,GAAG,GAA4B,EAAE,GAAI,IAAgC,EAAE,CAAA;IAE7E,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IACjD,MAAM,UAAU,GAAG,GAAG,CAAC,aAAa,CAAA;IACpC,kEAAkE;IAClE,IAAI,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAoB,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IAChG,GAAG,CAAC,aAAa,GAAG,OAAO,CAAA;IAE3B,OAAO,OAAO,GAAG,OAAO,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;QACnC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CACX,oDAAoD,OAAO,qEAAqE,CACjI,CAAA;YACD,MAAK;QACP,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,CAAA;QACZ,OAAO,IAAI,CAAC,CAAA;QACZ,GAAG,CAAC,aAAa,GAAG,OAAO,CAAA;IAC7B,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAA;AACzB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa,EAAE,GAAY;IAC5D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC/B,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IACrF,OAAO,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;AAC9E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-migrations.test.d.ts","sourceRoot":"","sources":["../src/profile-migrations.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
+
import { PROFILE_MIGRATION_BASELINE, PROFILE_MIGRATIONS, migrateStoredProfile, parseStoredProfile, } from "./profile-migrations.js";
|
|
3
|
+
import { PROFILE_SCHEMA_VERSION } from "./profile-constants.js";
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
vi.restoreAllMocks();
|
|
6
|
+
});
|
|
7
|
+
const CURRENT = {
|
|
8
|
+
id: "user-1",
|
|
9
|
+
language: "de",
|
|
10
|
+
modules: { analytics: { defaultPeriod: "14d" }, camunda7: { defaultEngineId: "prod-a" } },
|
|
11
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
12
|
+
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
13
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
14
|
+
};
|
|
15
|
+
/** Shapes the pre-production builds persisted before the baseline: flat module fields. */
|
|
16
|
+
const V1_RECORD = {
|
|
17
|
+
id: "user-1",
|
|
18
|
+
language: "de",
|
|
19
|
+
theme: "dark",
|
|
20
|
+
pinnedDashboardIds: ["d1"],
|
|
21
|
+
analyticsDefaultPeriod: "30d",
|
|
22
|
+
analyticsMinBucketSize: 25,
|
|
23
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
24
|
+
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
25
|
+
schemaVersion: 1,
|
|
26
|
+
};
|
|
27
|
+
const V2_RECORD = {
|
|
28
|
+
id: "user-1",
|
|
29
|
+
language: "de",
|
|
30
|
+
theme: "dark",
|
|
31
|
+
defaultEngineId: "prod-a",
|
|
32
|
+
allowedEngineIds: ["prod-a"],
|
|
33
|
+
modules: { analytics: { defaultPeriod: "14d" } },
|
|
34
|
+
createdAt: "2026-01-01T00:00:00.000Z",
|
|
35
|
+
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
36
|
+
schemaVersion: 2,
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The baseline as shipped, pinned HERE rather than read from the export: the
|
|
40
|
+
* completeness range below starts at it, so a baseline raised in step with a
|
|
41
|
+
* `PROFILE_SCHEMA_VERSION` bump would empty that range and let the bump pass
|
|
42
|
+
* without its migration — every stored record of the old version would then
|
|
43
|
+
* be adopted at the new one without its reshape. Moving the baseline drops
|
|
44
|
+
* migration history, which is an owner decision of its own, never part of a
|
|
45
|
+
* schema bump.
|
|
46
|
+
*/
|
|
47
|
+
const SHIPPED_BASELINE = 3;
|
|
48
|
+
describe("PROFILE_MIGRATIONS completeness", () => {
|
|
49
|
+
it("keeps the migration baseline where it shipped", () => {
|
|
50
|
+
expect(PROFILE_MIGRATION_BASELINE).toBe(SHIPPED_BASELINE);
|
|
51
|
+
});
|
|
52
|
+
it("carries an entry for every version from the baseline up to PROFILE_SCHEMA_VERSION", () => {
|
|
53
|
+
// The failure mode this guards: a PROFILE_SCHEMA_VERSION bump without its
|
|
54
|
+
// migration entry ships, and every stored record reads un-migrated.
|
|
55
|
+
const expected = Array.from({ length: PROFILE_SCHEMA_VERSION - SHIPPED_BASELINE }, (_, i) => SHIPPED_BASELINE + i);
|
|
56
|
+
const actual = Object.keys(PROFILE_MIGRATIONS)
|
|
57
|
+
.map(Number)
|
|
58
|
+
.sort((a, b) => a - b);
|
|
59
|
+
expect(actual).toEqual(expected);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
describe("parseStoredProfile", () => {
|
|
63
|
+
it("passes a current-version record through unchanged", () => {
|
|
64
|
+
expect(parseStoredProfile(CURRENT)).toEqual(CURRENT);
|
|
65
|
+
});
|
|
66
|
+
// No migration history predates the baseline (#322): an older record is
|
|
67
|
+
// adopted, never upgraded — and must still read without an error.
|
|
68
|
+
it.each([
|
|
69
|
+
["v1", V1_RECORD, {}],
|
|
70
|
+
["v2", V2_RECORD, V2_RECORD.modules],
|
|
71
|
+
])("reads a %s record from before the baseline fail-soft: its flat fields drop to the defaults", (_, stored, modules) => {
|
|
72
|
+
const error = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
73
|
+
expect(parseStoredProfile(stored)).toEqual({
|
|
74
|
+
id: "user-1",
|
|
75
|
+
language: "de",
|
|
76
|
+
modules,
|
|
77
|
+
createdAt: stored.createdAt,
|
|
78
|
+
updatedAt: stored.updatedAt,
|
|
79
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
80
|
+
});
|
|
81
|
+
expect(error).not.toHaveBeenCalled();
|
|
82
|
+
});
|
|
83
|
+
it("reads a missing or out-of-range schemaVersion as the baseline", () => {
|
|
84
|
+
const versionless = { ...CURRENT };
|
|
85
|
+
delete versionless.schemaVersion;
|
|
86
|
+
expect(parseStoredProfile(versionless)).toEqual(CURRENT);
|
|
87
|
+
expect(parseStoredProfile({ ...CURRENT, schemaVersion: 0 })).toEqual(CURRENT);
|
|
88
|
+
expect(parseStoredProfile({ ...CURRENT, schemaVersion: 2.5 })).toEqual(CURRENT);
|
|
89
|
+
});
|
|
90
|
+
it("reads a record from a NEWER build best-effort, without running any migration", () => {
|
|
91
|
+
const parsed = parseStoredProfile({
|
|
92
|
+
...CURRENT,
|
|
93
|
+
newCoreField: true,
|
|
94
|
+
schemaVersion: PROFILE_SCHEMA_VERSION + 1,
|
|
95
|
+
});
|
|
96
|
+
// Untouched: a newer build's document is never reshaped by an older one.
|
|
97
|
+
expect(parsed).toEqual(CURRENT);
|
|
98
|
+
});
|
|
99
|
+
it("reads a record with the retired theme preference: the key never reaches the view", () => {
|
|
100
|
+
// Widgets follow the host's theme; a `theme` an earlier build saved is
|
|
101
|
+
// an unknown key now — no migration, no error, no reset of the rest.
|
|
102
|
+
expect(parseStoredProfile({ ...CURRENT, theme: "dark" })).toEqual(CURRENT);
|
|
103
|
+
expect(parseStoredProfile({ ...CURRENT, theme: 42 })).toEqual(CURRENT);
|
|
104
|
+
});
|
|
105
|
+
it("keeps the system language preference — following the host is a stored choice", () => {
|
|
106
|
+
expect(parseStoredProfile({ ...CURRENT, language: "system" })?.language).toBe("system");
|
|
107
|
+
});
|
|
108
|
+
it("degrades an invalid field to ITS default and keeps every other field", () => {
|
|
109
|
+
// The language default is `system` (follow the host), never a forced locale.
|
|
110
|
+
expect(parseStoredProfile({ ...CURRENT, language: "fr" })).toMatchObject({
|
|
111
|
+
language: "system",
|
|
112
|
+
modules: CURRENT.modules,
|
|
113
|
+
});
|
|
114
|
+
expect(parseStoredProfile({ ...CURRENT, userId: 7 })).toMatchObject({
|
|
115
|
+
language: "de",
|
|
116
|
+
modules: CURRENT.modules,
|
|
117
|
+
userId: undefined,
|
|
118
|
+
});
|
|
119
|
+
expect(parseStoredProfile({ ...CURRENT, modules: "garbage" })?.modules).toEqual({});
|
|
120
|
+
});
|
|
121
|
+
it("prefers the store key over the stored id and repairs missing timestamps", () => {
|
|
122
|
+
expect(parseStoredProfile(CURRENT, "other-key")?.id).toBe("other-key");
|
|
123
|
+
const sparse = parseStoredProfile({ schemaVersion: 3 }, "k");
|
|
124
|
+
expect(sparse).toMatchObject({ id: "k", language: "system", modules: {} });
|
|
125
|
+
expect(sparse?.createdAt).toBe(sparse?.updatedAt);
|
|
126
|
+
expect(parseStoredProfile({ schemaVersion: 3, updatedAt: "2026-02-02T00:00:00.000Z" }, "k")).toMatchObject({
|
|
127
|
+
createdAt: "2026-02-02T00:00:00.000Z",
|
|
128
|
+
updatedAt: "2026-02-02T00:00:00.000Z",
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
it("reads garbage as absent", () => {
|
|
132
|
+
expect(parseStoredProfile(null)).toBeUndefined();
|
|
133
|
+
expect(parseStoredProfile("nope")).toBeUndefined();
|
|
134
|
+
expect(parseStoredProfile(["an", "array"])).toBeUndefined();
|
|
135
|
+
// No id stored (or none that is a string) and no store key to fall back to.
|
|
136
|
+
expect(parseStoredProfile({ schemaVersion: 0 })).toBeUndefined();
|
|
137
|
+
expect(parseStoredProfile({ ...CURRENT, id: 42 })).toBeUndefined();
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe("migrateStoredProfile", () => {
|
|
141
|
+
it("adopts a pre-baseline document at the baseline, keeping its unknown keys raw", () => {
|
|
142
|
+
expect(migrateStoredProfile(V1_RECORD)).toEqual({
|
|
143
|
+
doc: { ...V1_RECORD, schemaVersion: PROFILE_MIGRATION_BASELINE },
|
|
144
|
+
version: PROFILE_MIGRATION_BASELINE,
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
it("reports the version the document ends at", () => {
|
|
148
|
+
expect(migrateStoredProfile(CURRENT)?.version).toBe(PROFILE_SCHEMA_VERSION);
|
|
149
|
+
expect(migrateStoredProfile({ ...CURRENT, schemaVersion: 42 })?.version).toBe(42);
|
|
150
|
+
// Anything but an integer number reads as the baseline — never NaN.
|
|
151
|
+
for (const schemaVersion of [undefined, "4", 4.5, null]) {
|
|
152
|
+
expect(migrateStoredProfile({ ...CURRENT, schemaVersion })?.version).toBe(PROFILE_MIGRATION_BASELINE);
|
|
153
|
+
}
|
|
154
|
+
expect(migrateStoredProfile(undefined)).toBeUndefined();
|
|
155
|
+
expect(migrateStoredProfile(null)).toBeUndefined();
|
|
156
|
+
expect(migrateStoredProfile([CURRENT])).toBeUndefined();
|
|
157
|
+
});
|
|
158
|
+
it("never mutates the stored JSON it was handed", () => {
|
|
159
|
+
const stored = { ...V1_RECORD };
|
|
160
|
+
const snapshot = structuredClone(stored);
|
|
161
|
+
migrateStoredProfile(stored);
|
|
162
|
+
expect(stored).toEqual(snapshot);
|
|
163
|
+
});
|
|
164
|
+
// The walk itself, against a synthetic history: the shipped one has no
|
|
165
|
+
// step yet (the baseline IS the current version), but the next
|
|
166
|
+
// PROFILE_SCHEMA_VERSION bump runs exactly this loop.
|
|
167
|
+
const history = {
|
|
168
|
+
baseline: 1,
|
|
169
|
+
current: 3,
|
|
170
|
+
migrations: {
|
|
171
|
+
1: (raw) => {
|
|
172
|
+
raw.steps = [...(raw.steps ?? []), 1];
|
|
173
|
+
},
|
|
174
|
+
2: (raw) => {
|
|
175
|
+
raw.steps = [...(raw.steps ?? []), 2];
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
it("upgrades step by step from the stored version, stamping each step", () => {
|
|
180
|
+
expect(migrateStoredProfile({ schemaVersion: 1 }, history)).toEqual({
|
|
181
|
+
doc: { schemaVersion: 3, steps: [1, 2] },
|
|
182
|
+
version: 3,
|
|
183
|
+
});
|
|
184
|
+
expect(migrateStoredProfile({ schemaVersion: 2 }, history)).toEqual({
|
|
185
|
+
doc: { schemaVersion: 3, steps: [2] },
|
|
186
|
+
version: 3,
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
it("stops at a version without its step (a build bug) and keeps the document there", () => {
|
|
190
|
+
const error = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
191
|
+
const gap = { ...history, migrations: { 1: history.migrations[1] } };
|
|
192
|
+
expect(migrateStoredProfile({ schemaVersion: 1 }, gap)).toEqual({
|
|
193
|
+
doc: { schemaVersion: 2, steps: [1] },
|
|
194
|
+
version: 2,
|
|
195
|
+
});
|
|
196
|
+
expect(error).toHaveBeenCalledTimes(1);
|
|
197
|
+
expect(error).toHaveBeenCalledWith(expect.stringContaining("No profile migration from schema v2"));
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=profile-migrations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-migrations.test.js","sourceRoot":"","sources":["../src/profile-migrations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { type LanguagePref } from "./profile-constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* The persisted profile record — deliberately connector-free: the
|
|
5
|
+
* cross-module preference every module may read (`language`), the per-module
|
|
6
|
+
* `modules.<module>` slice transport, and server-managed metadata. There is
|
|
7
|
+
* no theme preference: widgets follow the host's theme. A record an earlier
|
|
8
|
+
* build saved with a `theme` still reads — the key is unknown here, stays in
|
|
9
|
+
* the raw document and never reaches the typed view.
|
|
10
|
+
* Everything a connector wants to persist lives in ITS slice (validated
|
|
11
|
+
* fail-soft by the owning module), never as a new top-level field here.
|
|
12
|
+
*
|
|
13
|
+
* `id` is the profile key (the OAuth caller's id, or `anonymous` for an
|
|
14
|
+
* explicitly declared local caller — see `resolveProfileKey` in `profile.ts`);
|
|
15
|
+
* `userId` is the owner a save stamped (absent on the anonymous record).
|
|
16
|
+
*/
|
|
17
|
+
export declare const profileRecordSchema: z.ZodObject<{
|
|
18
|
+
language: z.ZodDefault<z.ZodEnum<{
|
|
19
|
+
en: "en";
|
|
20
|
+
de: "de";
|
|
21
|
+
system: "system";
|
|
22
|
+
}>>;
|
|
23
|
+
modules: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
24
|
+
id: z.ZodString;
|
|
25
|
+
userId: z.ZodOptional<z.ZodString>;
|
|
26
|
+
createdAt: z.ZodString;
|
|
27
|
+
updatedAt: z.ZodString;
|
|
28
|
+
schemaVersion: z.ZodDefault<z.ZodLiteral<3>>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type ProfileRecord = z.infer<typeof profileRecordSchema>;
|
|
31
|
+
/**
|
|
32
|
+
* Save input: any subset of the record's user-settable fields. Omitted fields
|
|
33
|
+
* keep their current value (the store merges over the existing record);
|
|
34
|
+
* `modules` slices merge per module key, one level deep — a save carrying
|
|
35
|
+
* `modules.analytics` spreads over the stored analytics slice (explicit
|
|
36
|
+
* `undefined` clears a field) and leaves other modules' slices untouched.
|
|
37
|
+
*
|
|
38
|
+
* A plain type, not a zod schema: validation happens at each module's TOOL
|
|
39
|
+
* boundary (with a default-free schema — see `withoutDefaults` in
|
|
40
|
+
* `profile.ts`), not in the store.
|
|
41
|
+
*/
|
|
42
|
+
export interface ProfileRecordSaveInput {
|
|
43
|
+
language?: LanguagePref;
|
|
44
|
+
modules?: Record<string, unknown>;
|
|
45
|
+
}
|
|
46
|
+
/** A fully-defaulted record for a key that has never been saved. */
|
|
47
|
+
export declare function defaultProfileRecord(key: string): ProfileRecord;
|
|
48
|
+
/**
|
|
49
|
+
* The typed VIEW of a stored profile document (current-shape, or written by a
|
|
50
|
+
* NEWER build), degrading per FIELD: a value this build cannot validate — a
|
|
51
|
+
* locale added later, a non-object `modules` — falls back to that field's
|
|
52
|
+
* default while everything else survives. Keys this build does not know are
|
|
53
|
+
* not part of the view, but they stay in the stored document: saves merge over
|
|
54
|
+
* the RAW document (`mergeStoredProfile` in `profile-store.ts`), never over
|
|
55
|
+
* this projection. Timestamps a hand-edited document lacks fall back to each
|
|
56
|
+
* other, then to `""` (the next save stamps both). `id` is the caller's (the
|
|
57
|
+
* store key wins).
|
|
58
|
+
*/
|
|
59
|
+
export declare function projectProfileRecord(doc: Record<string, unknown>, id: string): ProfileRecord;
|
|
60
|
+
//# sourceMappingURL=profile-record.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-record.d.ts","sourceRoot":"","sources":["../src/profile-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE7F;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBAoB9B,CAAA;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAClC;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAS/D;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CAc5F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { LANGUAGES, PROFILE_SCHEMA_VERSION } from "./profile-constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* The persisted profile record — deliberately connector-free: the
|
|
5
|
+
* cross-module preference every module may read (`language`), the per-module
|
|
6
|
+
* `modules.<module>` slice transport, and server-managed metadata. There is
|
|
7
|
+
* no theme preference: widgets follow the host's theme. A record an earlier
|
|
8
|
+
* build saved with a `theme` still reads — the key is unknown here, stays in
|
|
9
|
+
* the raw document and never reaches the typed view.
|
|
10
|
+
* Everything a connector wants to persist lives in ITS slice (validated
|
|
11
|
+
* fail-soft by the owning module), never as a new top-level field here.
|
|
12
|
+
*
|
|
13
|
+
* `id` is the profile key (the OAuth caller's id, or `anonymous` for an
|
|
14
|
+
* explicitly declared local caller — see `resolveProfileKey` in `profile.ts`);
|
|
15
|
+
* `userId` is the owner a save stamped (absent on the anonymous record).
|
|
16
|
+
*/
|
|
17
|
+
export const profileRecordSchema = z.object({
|
|
18
|
+
language: z
|
|
19
|
+
.enum(LANGUAGES)
|
|
20
|
+
.default("system")
|
|
21
|
+
.describe('UI + summary language; "system" follows the host locale (summaries then stay English).'),
|
|
22
|
+
modules: z
|
|
23
|
+
.record(z.string(), z.unknown())
|
|
24
|
+
.default({})
|
|
25
|
+
.describe("Per-module settings slices, keyed by module name (e.g. `analytics`, `camunda7`). Each " +
|
|
26
|
+
"module owns its slice's schema, validates it fail-soft on read, and writes it through " +
|
|
27
|
+
"its own save tool — this record only transports the slices."),
|
|
28
|
+
id: z.string(),
|
|
29
|
+
userId: z.string().optional(),
|
|
30
|
+
createdAt: z.string(),
|
|
31
|
+
updatedAt: z.string(),
|
|
32
|
+
schemaVersion: z.literal(PROFILE_SCHEMA_VERSION).default(PROFILE_SCHEMA_VERSION),
|
|
33
|
+
});
|
|
34
|
+
/** A fully-defaulted record for a key that has never been saved. */
|
|
35
|
+
export function defaultProfileRecord(key) {
|
|
36
|
+
const now = new Date().toISOString();
|
|
37
|
+
return {
|
|
38
|
+
...profileRecordSchema.omit({ id: true, createdAt: true, updatedAt: true }).parse({}),
|
|
39
|
+
id: key,
|
|
40
|
+
userId: undefined,
|
|
41
|
+
createdAt: now,
|
|
42
|
+
updatedAt: now,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const nonEmptyString = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
|
|
46
|
+
/** The field's own value when it validates, else the field's default. */
|
|
47
|
+
function fieldOrDefault(schema, value) {
|
|
48
|
+
const parsed = schema.safeParse(value);
|
|
49
|
+
return parsed.success ? parsed.data : schema.parse(undefined);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The typed VIEW of a stored profile document (current-shape, or written by a
|
|
53
|
+
* NEWER build), degrading per FIELD: a value this build cannot validate — a
|
|
54
|
+
* locale added later, a non-object `modules` — falls back to that field's
|
|
55
|
+
* default while everything else survives. Keys this build does not know are
|
|
56
|
+
* not part of the view, but they stay in the stored document: saves merge over
|
|
57
|
+
* the RAW document (`mergeStoredProfile` in `profile-store.ts`), never over
|
|
58
|
+
* this projection. Timestamps a hand-edited document lacks fall back to each
|
|
59
|
+
* other, then to `""` (the next save stamps both). `id` is the caller's (the
|
|
60
|
+
* store key wins).
|
|
61
|
+
*/
|
|
62
|
+
export function projectProfileRecord(doc, id) {
|
|
63
|
+
const whole = profileRecordSchema.safeParse(doc);
|
|
64
|
+
if (whole.success)
|
|
65
|
+
return { ...whole.data, id };
|
|
66
|
+
const { shape } = profileRecordSchema;
|
|
67
|
+
const updatedAt = nonEmptyString(doc.updatedAt) ?? nonEmptyString(doc.createdAt) ?? "";
|
|
68
|
+
return {
|
|
69
|
+
language: fieldOrDefault(shape.language, doc.language),
|
|
70
|
+
modules: fieldOrDefault(shape.modules, doc.modules),
|
|
71
|
+
id,
|
|
72
|
+
userId: fieldOrDefault(shape.userId, doc.userId),
|
|
73
|
+
createdAt: nonEmptyString(doc.createdAt) ?? updatedAt,
|
|
74
|
+
updatedAt,
|
|
75
|
+
schemaVersion: PROFILE_SCHEMA_VERSION,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=profile-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-record.js","sourceRoot":"","sources":["../src/profile-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { ProfileSource } from "./profile.js";
|
|
3
|
+
/**
|
|
4
|
+
* The `profile.modules.<module>` slice contract, shared by every module so
|
|
5
|
+
* the subtle rules cannot drift: WHOSE record a save touches (the canonical
|
|
6
|
+
* keyless refusal), HOW a slice patch is saved (the patch alone, merged by
|
|
7
|
+
* the store over the RAW stored slice under its lock, so foreign and
|
|
8
|
+
* concurrently saved fields survive), and HOW a slice reads (fail-soft per
|
|
9
|
+
* FIELD, so one bad value cannot reset the rest).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Fail-soft slice read: absent slices and garbage degrade to the schema's
|
|
13
|
+
* defaults — and degradation is per FIELD, not per slice: a single invalid
|
|
14
|
+
* value (say, one written by a newer build and then rolled back) drops to its
|
|
15
|
+
* own default while every other saved preference survives. Fields the schema
|
|
16
|
+
* doesn't know stay out of the VIEW but are preserved in storage: a save
|
|
17
|
+
* ({@link saveModuleSlice}) merges over the raw stored slice.
|
|
18
|
+
*
|
|
19
|
+
* Read-side only — save inputs keep validating loudly at the tool boundary;
|
|
20
|
+
* a write must never silently coerce.
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseModuleSlice<T extends z.ZodRawShape>(schema: z.ZodObject<T>, slice: unknown): z.output<z.ZodObject<T>>;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the profile key for a durable write, refusing without one. Settings
|
|
25
|
+
* are saved per signed-in user: a request without OAuth resolves no key (see
|
|
26
|
+
* `resolveProfileKey`) — writing anyway would silently share one record across
|
|
27
|
+
* unrelated callers, so every module's save tool throws this same,
|
|
28
|
+
* operator-actionable error instead.
|
|
29
|
+
*/
|
|
30
|
+
export declare function requireProfileKey(ctx?: unknown): string;
|
|
31
|
+
/**
|
|
32
|
+
* Persist a partial update of `module`'s slice: hand the store the PATCH
|
|
33
|
+
* alone, never a slice pre-read outside the store's lock. Every
|
|
34
|
+
* `ProfileStore` merges a `modules.<module>` patch one level deep over the
|
|
35
|
+
* RAW stored slice INSIDE its per-key serialization (the postgres
|
|
36
|
+
* transaction lock, the filesystem store's per-key mutex, the in-memory
|
|
37
|
+
* store's synchronous merge), so a concurrent save of another field in the
|
|
38
|
+
* same slice (or of another module's slice) survives, fields a newer build
|
|
39
|
+
* wrote survive, and no defaults are materialized into storage. A field set
|
|
40
|
+
* to `undefined` in the patch CLEARS the stored value; an absent field keeps
|
|
41
|
+
* it.
|
|
42
|
+
*
|
|
43
|
+
* Returns the saved slice, raw (the caller parses it fail-soft for its
|
|
44
|
+
* report): read off the record `save` returns (every shipped store returns
|
|
45
|
+
* it), or read back when a custom port implementation returns nothing.
|
|
46
|
+
*/
|
|
47
|
+
export declare function saveModuleSlice(store: {
|
|
48
|
+
get: ProfileSource["get"];
|
|
49
|
+
save: NonNullable<ProfileSource["save"]>;
|
|
50
|
+
}, key: string, module: string, patch: Record<string, unknown>, opts?: {
|
|
51
|
+
userId?: string;
|
|
52
|
+
}): Promise<unknown>;
|
|
53
|
+
//# sourceMappingURL=profile-slice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-slice.d.ts","sourceRoot":"","sources":["../src/profile-slice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAE5B,OAAO,KAAK,EAAgB,aAAa,EAAE,MAAM,cAAc,CAAA;AAE/D;;;;;;;GAOG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EACtD,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,OAAO,GACb,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAY1B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM,CAQvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE;IAAE,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,EAC9E,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACzB,OAAO,CAAC,OAAO,CAAC,CAIlB"}
|