@frontmcp/sdk 0.4.0 → 0.5.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/README.md +30 -18
- package/package.json +20 -5
- package/src/app/app.registry.d.ts +3 -2
- package/src/app/app.registry.js +3 -1
- package/src/app/app.registry.js.map +1 -1
- package/src/app/instances/app.local.instance.js +2 -2
- package/src/app/instances/app.local.instance.js.map +1 -1
- package/src/auth/auth.registry.d.ts +34 -2
- package/src/auth/auth.registry.js +162 -24
- package/src/auth/auth.registry.js.map +1 -1
- package/src/auth/auth.utils.js +8 -9
- package/src/auth/auth.utils.js.map +1 -1
- package/src/auth/authorization/authorization.class.d.ts +125 -0
- package/src/auth/authorization/authorization.class.js +224 -0
- package/src/auth/authorization/authorization.class.js.map +1 -0
- package/src/auth/authorization/authorization.types.d.ts +300 -0
- package/src/auth/authorization/authorization.types.js +79 -0
- package/src/auth/authorization/authorization.types.js.map +1 -0
- package/src/auth/authorization/index.d.ts +5 -0
- package/src/auth/authorization/index.js +19 -0
- package/src/auth/authorization/index.js.map +1 -0
- package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
- package/src/auth/authorization/orchestrated.authorization.js +306 -0
- package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
- package/src/auth/authorization/public.authorization.d.ts +91 -0
- package/src/auth/authorization/public.authorization.js +132 -0
- package/src/auth/authorization/public.authorization.js.map +1 -0
- package/src/auth/authorization/transparent.authorization.d.ts +130 -0
- package/src/auth/authorization/transparent.authorization.js +147 -0
- package/src/auth/authorization/transparent.authorization.js.map +1 -0
- package/src/auth/consent/consent.types.d.ts +111 -0
- package/src/auth/consent/consent.types.js +119 -0
- package/src/auth/consent/consent.types.js.map +1 -0
- package/src/auth/consent/index.d.ts +1 -0
- package/src/auth/consent/index.js +13 -0
- package/src/auth/consent/index.js.map +1 -0
- package/src/auth/detection/auth-provider-detection.d.ts +84 -0
- package/src/auth/detection/auth-provider-detection.js +230 -0
- package/src/auth/detection/auth-provider-detection.js.map +1 -0
- package/src/auth/detection/index.d.ts +1 -0
- package/src/auth/detection/index.js +15 -0
- package/src/auth/detection/index.js.map +1 -0
- package/src/auth/flows/auth.verify.flow.d.ts +110 -0
- package/src/auth/flows/auth.verify.flow.js +379 -0
- package/src/auth/flows/auth.verify.flow.js.map +1 -0
- package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
- package/src/auth/flows/oauth.authorize.flow.js +701 -33
- package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
- package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
- package/src/auth/flows/oauth.callback.flow.js +357 -0
- package/src/auth/flows/oauth.callback.flow.js.map +1 -0
- package/src/auth/flows/oauth.register.flow.d.ts +32 -125
- package/src/auth/flows/oauth.token.flow.d.ts +52 -154
- package/src/auth/flows/oauth.token.flow.js +193 -55
- package/src/auth/flows/oauth.token.flow.js.map +1 -1
- package/src/auth/flows/session.verify.flow.d.ts +66 -321
- package/src/auth/flows/session.verify.flow.js +107 -18
- package/src/auth/flows/session.verify.flow.js.map +1 -1
- package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
- package/src/auth/flows/well-known.jwks.flow.js +15 -8
- package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
- package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
- package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
- package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
- package/src/auth/flows/well-known.prm.flow.js +3 -4
- package/src/auth/flows/well-known.prm.flow.js.map +1 -1
- package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
- package/src/auth/instances/instance.local-primary-auth.js +236 -6
- package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
- package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
- package/src/auth/instances/instance.remote-primary-auth.js +2 -2
- package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
- package/src/auth/session/authorization-vault.d.ts +611 -0
- package/src/auth/session/authorization-vault.js +817 -0
- package/src/auth/session/authorization-vault.js.map +1 -0
- package/src/auth/session/authorization.store.d.ts +301 -0
- package/src/auth/session/authorization.store.js +323 -0
- package/src/auth/session/authorization.store.js.map +1 -0
- package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
- package/src/auth/session/encrypted-authorization-vault.js +493 -0
- package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
- package/src/auth/session/index.d.ts +4 -4
- package/src/auth/session/index.js +11 -7
- package/src/auth/session/index.js.map +1 -1
- package/src/auth/session/session.schema.d.ts +1 -1
- package/src/auth/session/session.service.d.ts +1 -1
- package/src/auth/session/transport-session.manager.d.ts +101 -0
- package/src/auth/session/transport-session.manager.js +300 -0
- package/src/auth/session/transport-session.manager.js.map +1 -0
- package/src/auth/session/transport-session.types.d.ts +457 -0
- package/src/auth/session/transport-session.types.js +110 -0
- package/src/auth/session/transport-session.types.js.map +1 -0
- package/src/auth/session/utils/session-id.utils.d.ts +14 -2
- package/src/auth/session/utils/session-id.utils.js +68 -19
- package/src/auth/session/utils/session-id.utils.js.map +1 -1
- package/src/auth/session/vault-encryption.d.ts +189 -0
- package/src/auth/session/vault-encryption.js +263 -0
- package/src/auth/session/vault-encryption.js.map +1 -0
- package/src/auth/ui/base-layout.d.ts +188 -0
- package/src/auth/ui/base-layout.js +292 -0
- package/src/auth/ui/base-layout.js.map +1 -0
- package/src/auth/ui/htmx-templates.d.ts +135 -0
- package/src/auth/ui/htmx-templates.js +433 -0
- package/src/auth/ui/htmx-templates.js.map +1 -0
- package/src/auth/ui/index.d.ts +11 -0
- package/src/auth/ui/index.js +35 -0
- package/src/auth/ui/index.js.map +1 -0
- package/src/auth/utils/audience.validator.d.ts +129 -0
- package/src/auth/utils/audience.validator.js +196 -0
- package/src/auth/utils/audience.validator.js.map +1 -0
- package/src/auth/utils/index.d.ts +2 -0
- package/src/auth/utils/index.js +7 -0
- package/src/auth/utils/index.js.map +1 -0
- package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
- package/src/auth/utils/www-authenticate.utils.js +183 -0
- package/src/auth/utils/www-authenticate.utils.js.map +1 -0
- package/src/common/common.schema.d.ts +2 -16
- package/src/common/constants.d.ts +3 -0
- package/src/common/constants.js +6 -1
- package/src/common/constants.js.map +1 -1
- package/src/common/decorators/decorator-utils.d.ts +131 -0
- package/src/common/decorators/decorator-utils.js +195 -0
- package/src/common/decorators/decorator-utils.js.map +1 -0
- package/src/common/decorators/front-mcp.decorator.js +3 -2
- package/src/common/decorators/front-mcp.decorator.js.map +1 -1
- package/src/common/decorators/hook.decorator.d.ts +58 -2
- package/src/common/decorators/hook.decorator.js +127 -17
- package/src/common/decorators/hook.decorator.js.map +1 -1
- package/src/common/decorators/plugin.decorator.d.ts +1 -1
- package/src/common/decorators/plugin.decorator.js +11 -10
- package/src/common/decorators/plugin.decorator.js.map +1 -1
- package/src/common/decorators/resource.decorator.d.ts +32 -3
- package/src/common/decorators/resource.decorator.js +46 -4
- package/src/common/decorators/resource.decorator.js.map +1 -1
- package/src/common/decorators/tool.decorator.d.ts +54 -5
- package/src/common/decorators/tool.decorator.js.map +1 -1
- package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
- package/src/common/dynamic/dynamic.plugin.js +7 -1
- package/src/common/dynamic/dynamic.plugin.js.map +1 -1
- package/src/common/entries/prompt.entry.d.ts +46 -2
- package/src/common/entries/prompt.entry.js +10 -0
- package/src/common/entries/prompt.entry.js.map +1 -1
- package/src/common/entries/resource.entry.d.ts +69 -6
- package/src/common/entries/resource.entry.js +27 -3
- package/src/common/entries/resource.entry.js.map +1 -1
- package/src/common/entries/scope.entry.d.ts +5 -1
- package/src/common/entries/scope.entry.js +3 -3
- package/src/common/entries/scope.entry.js.map +1 -1
- package/src/common/flow/flow.utils.d.ts +56 -0
- package/src/common/flow/flow.utils.js +96 -0
- package/src/common/flow/flow.utils.js.map +1 -0
- package/src/common/index.d.ts +2 -2
- package/src/common/index.js +2 -2
- package/src/common/index.js.map +1 -1
- package/src/common/interfaces/execution-context.interface.d.ts +59 -0
- package/src/common/interfaces/execution-context.interface.js +81 -0
- package/src/common/interfaces/execution-context.interface.js.map +1 -0
- package/src/common/interfaces/flow.interface.d.ts +1 -1
- package/src/common/interfaces/flow.interface.js.map +1 -1
- package/src/common/interfaces/index.d.ts +1 -0
- package/src/common/interfaces/index.js +1 -0
- package/src/common/interfaces/index.js.map +1 -1
- package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
- package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
- package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
- package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
- package/src/common/interfaces/internal/registry.interface.js.map +1 -1
- package/src/common/interfaces/plugin.interface.js.map +1 -1
- package/src/common/interfaces/prompt.interface.d.ts +53 -4
- package/src/common/interfaces/prompt.interface.js +78 -0
- package/src/common/interfaces/prompt.interface.js.map +1 -1
- package/src/common/interfaces/resource.interface.d.ts +47 -17
- package/src/common/interfaces/resource.interface.js +53 -0
- package/src/common/interfaces/resource.interface.js.map +1 -1
- package/src/common/interfaces/tool.interface.d.ts +39 -22
- package/src/common/interfaces/tool.interface.js +61 -34
- package/src/common/interfaces/tool.interface.js.map +1 -1
- package/src/common/metadata/adapter.metadata.d.ts +1 -9
- package/src/common/metadata/app.metadata.d.ts +425 -730
- package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
- package/src/common/metadata/flow.metadata.d.ts +10 -25
- package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
- package/src/common/metadata/front-mcp.metadata.js +6 -4
- package/src/common/metadata/front-mcp.metadata.js.map +1 -1
- package/src/common/metadata/hook.metadata.d.ts +1 -1
- package/src/common/metadata/hook.metadata.js.map +1 -1
- package/src/common/metadata/index.d.ts +1 -0
- package/src/common/metadata/index.js +1 -0
- package/src/common/metadata/index.js.map +1 -1
- package/src/common/metadata/logger.metadata.d.ts +1 -9
- package/src/common/metadata/plugin.metadata.d.ts +8 -30
- package/src/common/metadata/prompt.metadata.d.ts +4 -161
- package/src/common/metadata/provider.metadata.d.ts +2 -12
- package/src/common/metadata/resource.metadata.d.ts +6 -98
- package/src/common/metadata/resource.metadata.js +15 -6
- package/src/common/metadata/resource.metadata.js.map +1 -1
- package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
- package/src/common/metadata/tool-ui.metadata.js +12 -0
- package/src/common/metadata/tool-ui.metadata.js.map +1 -0
- package/src/common/metadata/tool.metadata.d.ts +78 -199
- package/src/common/metadata/tool.metadata.js +11 -14
- package/src/common/metadata/tool.metadata.js.map +1 -1
- package/src/common/providers/base-config.provider.d.ts +84 -0
- package/src/common/providers/base-config.provider.js +128 -0
- package/src/common/providers/base-config.provider.js.map +1 -0
- package/src/common/records/plugin.record.d.ts +5 -6
- package/src/common/records/plugin.record.js.map +1 -1
- package/src/common/records/prompt.record.js.map +1 -1
- package/src/common/records/resource.record.d.ts +17 -1
- package/src/common/records/resource.record.js +12 -6
- package/src/common/records/resource.record.js.map +1 -1
- package/src/common/records/tool.record.js.map +1 -1
- package/src/common/schemas/annotated-class.schema.d.ts +9 -9
- package/src/common/schemas/annotated-class.schema.js +92 -27
- package/src/common/schemas/annotated-class.schema.js.map +1 -1
- package/src/common/schemas/http-input.schema.d.ts +6 -30
- package/src/common/schemas/http-output.schema.d.ts +326 -1630
- package/src/common/schemas/http-output.schema.js +39 -1
- package/src/common/schemas/http-output.schema.js.map +1 -1
- package/src/common/tokens/front-mcp.tokens.js +4 -1
- package/src/common/tokens/front-mcp.tokens.js.map +1 -1
- package/src/common/tokens/resource.tokens.d.ts +2 -0
- package/src/common/tokens/resource.tokens.js +4 -1
- package/src/common/tokens/resource.tokens.js.map +1 -1
- package/src/common/tokens/tool.tokens.d.ts +2 -0
- package/src/common/tokens/tool.tokens.js +2 -0
- package/src/common/tokens/tool.tokens.js.map +1 -1
- package/src/common/types/auth/jwt.types.d.ts +5 -31
- package/src/common/types/auth/session.types.d.ts +97 -192
- package/src/common/types/auth/session.types.js +24 -11
- package/src/common/types/auth/session.types.js.map +1 -1
- package/src/common/types/options/auth.options.d.ts +1013 -490
- package/src/common/types/options/auth.options.js +554 -36
- package/src/common/types/options/auth.options.js.map +1 -1
- package/src/common/types/options/http.options.d.ts +1 -9
- package/src/common/types/options/logging.options.d.ts +7 -13
- package/src/common/types/options/logging.options.js +4 -0
- package/src/common/types/options/logging.options.js.map +1 -1
- package/src/common/types/options/server-info.options.d.ts +3 -31
- package/src/common/types/options/session.options.d.ts +90 -10
- package/src/common/types/options/session.options.js +26 -3
- package/src/common/types/options/session.options.js.map +1 -1
- package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
- package/src/common/utils/decide-request-intent.utils.js +88 -23
- package/src/common/utils/decide-request-intent.utils.js.map +1 -1
- package/src/completion/flows/complete.flow.d.ts +74 -0
- package/src/completion/flows/complete.flow.js +199 -0
- package/src/completion/flows/complete.flow.js.map +1 -0
- package/src/errors/authorization-required.error.d.ts +189 -0
- package/src/errors/authorization-required.error.js +274 -0
- package/src/errors/authorization-required.error.js.map +1 -0
- package/src/errors/index.d.ts +2 -1
- package/src/errors/index.js +17 -1
- package/src/errors/index.js.map +1 -1
- package/src/errors/mcp.error.d.ts +101 -1
- package/src/errors/mcp.error.js +147 -2
- package/src/errors/mcp.error.js.map +1 -1
- package/src/flows/flow.instance.js +4 -3
- package/src/flows/flow.instance.js.map +1 -1
- package/src/flows/flow.registry.js.map +1 -1
- package/src/flows/flow.stages.js +14 -11
- package/src/flows/flow.stages.js.map +1 -1
- package/src/front-mcp/front-mcp.providers.d.ts +464 -102
- package/src/front-mcp/front-mcp.providers.js +3 -5
- package/src/front-mcp/front-mcp.providers.js.map +1 -1
- package/src/hooks/hook.instance.d.ts +1 -1
- package/src/hooks/hook.instance.js +5 -2
- package/src/hooks/hook.instance.js.map +1 -1
- package/src/hooks/hook.registry.js +7 -5
- package/src/hooks/hook.registry.js.map +1 -1
- package/src/index.d.ts +28 -9
- package/src/index.js +5 -1
- package/src/index.js.map +1 -1
- package/src/logger/instances/instance.logger.js +3 -2
- package/src/logger/instances/instance.logger.js.map +1 -1
- package/src/logger/logger.registry.js +7 -2
- package/src/logger/logger.registry.js.map +1 -1
- package/src/logging/flows/set-level.flow.d.ts +62 -0
- package/src/logging/flows/set-level.flow.js +108 -0
- package/src/logging/flows/set-level.flow.js.map +1 -0
- package/src/mcp-apps/csp.d.ts +111 -0
- package/src/mcp-apps/csp.js +267 -0
- package/src/mcp-apps/csp.js.map +1 -0
- package/src/mcp-apps/index.d.ts +23 -0
- package/src/mcp-apps/index.js +91 -0
- package/src/mcp-apps/index.js.map +1 -0
- package/src/mcp-apps/schemas.d.ts +403 -0
- package/src/mcp-apps/schemas.js +345 -0
- package/src/mcp-apps/schemas.js.map +1 -0
- package/src/mcp-apps/template.d.ts +94 -0
- package/src/mcp-apps/template.js +419 -0
- package/src/mcp-apps/template.js.map +1 -0
- package/src/mcp-apps/types.d.ts +323 -0
- package/src/mcp-apps/types.js +59 -0
- package/src/mcp-apps/types.js.map +1 -0
- package/src/notification/index.d.ts +1 -0
- package/src/notification/index.js +13 -0
- package/src/notification/index.js.map +1 -0
- package/src/notification/notification.service.d.ts +378 -0
- package/src/notification/notification.service.js +727 -0
- package/src/notification/notification.service.js.map +1 -0
- package/src/plugin/plugin.registry.js +12 -9
- package/src/plugin/plugin.registry.js.map +1 -1
- package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
- package/src/prompt/flows/get-prompt.flow.js +214 -0
- package/src/prompt/flows/get-prompt.flow.js.map +1 -0
- package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
- package/src/prompt/flows/prompts-list.flow.js +176 -0
- package/src/prompt/flows/prompts-list.flow.js.map +1 -0
- package/src/prompt/index.d.ts +7 -0
- package/src/prompt/index.js +17 -0
- package/src/prompt/index.js.map +1 -0
- package/src/prompt/prompt.events.d.ts +17 -0
- package/src/prompt/prompt.events.js +25 -0
- package/src/prompt/prompt.events.js.map +1 -0
- package/src/prompt/prompt.instance.d.ts +30 -0
- package/src/prompt/prompt.instance.js +120 -0
- package/src/prompt/prompt.instance.js.map +1 -0
- package/src/prompt/prompt.registry.d.ts +79 -12
- package/src/prompt/prompt.registry.js +360 -15
- package/src/prompt/prompt.registry.js.map +1 -1
- package/src/prompt/prompt.types.d.ts +26 -0
- package/src/prompt/prompt.types.js +11 -0
- package/src/prompt/prompt.types.js.map +1 -0
- package/src/prompt/prompt.utils.d.ts +26 -0
- package/src/prompt/prompt.utils.js +136 -0
- package/src/prompt/prompt.utils.js.map +1 -0
- package/src/provider/provider.registry.d.ts +12 -5
- package/src/provider/provider.registry.js +30 -138
- package/src/provider/provider.registry.js.map +1 -1
- package/src/regsitry/registry.base.d.ts +1 -1
- package/src/regsitry/registry.base.js.map +1 -1
- package/src/resource/flows/read-resource.flow.d.ts +91 -0
- package/src/resource/flows/read-resource.flow.js +270 -0
- package/src/resource/flows/read-resource.flow.js.map +1 -0
- package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
- package/src/resource/flows/resource-templates-list.flow.js +191 -0
- package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
- package/src/resource/flows/resources-list.flow.d.ts +64 -0
- package/src/resource/flows/resources-list.flow.js +196 -0
- package/src/resource/flows/resources-list.flow.js.map +1 -0
- package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
- package/src/resource/flows/subscribe-resource.flow.js +123 -0
- package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
- package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
- package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
- package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
- package/src/resource/index.d.ts +8 -0
- package/src/resource/index.js +20 -0
- package/src/resource/index.js.map +1 -0
- package/src/resource/resource.events.d.ts +24 -0
- package/src/resource/resource.events.js +17 -0
- package/src/resource/resource.events.js.map +1 -0
- package/src/resource/resource.instance.d.ts +35 -0
- package/src/resource/resource.instance.js +163 -0
- package/src/resource/resource.instance.js.map +1 -0
- package/src/resource/resource.registry.d.ts +106 -12
- package/src/resource/resource.registry.js +449 -13
- package/src/resource/resource.registry.js.map +1 -1
- package/src/resource/resource.types.d.ts +35 -0
- package/src/resource/resource.types.js +11 -0
- package/src/resource/resource.types.js.map +1 -0
- package/src/resource/resource.utils.d.ts +30 -0
- package/src/resource/resource.utils.js +151 -0
- package/src/resource/resource.utils.js.map +1 -0
- package/src/scope/flows/http.request.flow.d.ts +48 -330
- package/src/scope/flows/http.request.flow.js +306 -78
- package/src/scope/flows/http.request.flow.js.map +1 -1
- package/src/scope/scope.instance.d.ts +12 -0
- package/src/scope/scope.instance.js +145 -15
- package/src/scope/scope.instance.js.map +1 -1
- package/src/tool/flows/call-tool.flow.d.ts +64 -1110
- package/src/tool/flows/call-tool.flow.js +303 -15
- package/src/tool/flows/call-tool.flow.js.map +1 -1
- package/src/tool/flows/tools-list.flow.d.ts +32 -473
- package/src/tool/flows/tools-list.flow.js +111 -10
- package/src/tool/flows/tools-list.flow.js.map +1 -1
- package/src/tool/tool.events.d.ts +8 -1
- package/src/tool/tool.events.js.map +1 -1
- package/src/tool/tool.instance.d.ts +3 -1
- package/src/tool/tool.instance.js +17 -3
- package/src/tool/tool.instance.js.map +1 -1
- package/src/tool/tool.registry.d.ts +7 -1
- package/src/tool/tool.registry.js +26 -10
- package/src/tool/tool.registry.js.map +1 -1
- package/src/tool/tool.types.d.ts +4 -4
- package/src/tool/tool.types.js.map +1 -1
- package/src/tool/tool.utils.d.ts +3 -12
- package/src/tool/tool.utils.js +39 -193
- package/src/tool/tool.utils.js.map +1 -1
- package/src/tool/ui/index.d.ts +22 -0
- package/src/tool/ui/index.js +63 -0
- package/src/tool/ui/index.js.map +1 -0
- package/src/tool/ui/platform-adapters.d.ts +10 -0
- package/src/tool/ui/platform-adapters.js +18 -0
- package/src/tool/ui/platform-adapters.js.map +1 -0
- package/src/tool/ui/template-helpers.d.ts +46 -0
- package/src/tool/ui/template-helpers.js +112 -0
- package/src/tool/ui/template-helpers.js.map +1 -0
- package/src/tool/ui/ui-resource-template.d.ts +34 -0
- package/src/tool/ui/ui-resource-template.js +64 -0
- package/src/tool/ui/ui-resource-template.js.map +1 -0
- package/src/tool/ui/ui-resource.handler.d.ts +74 -0
- package/src/tool/ui/ui-resource.handler.js +129 -0
- package/src/tool/ui/ui-resource.handler.js.map +1 -0
- package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.local.adapter.js +28 -7
- package/src/transport/adapters/transport.local.adapter.js.map +1 -1
- package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
- package/src/transport/adapters/transport.sse.adapter.js +4 -3
- package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
- package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
- package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
- package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
- package/src/transport/flows/handle.sse.flow.d.ts +29 -63
- package/src/transport/flows/handle.sse.flow.js +78 -10
- package/src/transport/flows/handle.sse.flow.js.map +1 -1
- package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
- package/src/transport/flows/handle.stateless-http.flow.js +102 -0
- package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
- package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
- package/src/transport/flows/handle.streamable-http.flow.js +158 -26
- package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
- package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
- package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
- package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
- package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
- package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
- package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
- package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/index.d.ts +517 -208
- package/src/transport/mcp-handlers/index.js +39 -2
- package/src/transport/mcp-handlers/index.js.map +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
- package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
- package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
- package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
- package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
- package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
- package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
- package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
- package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
- package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
- package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
- package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
- package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
- package/src/transport/transport.local.js +7 -2
- package/src/transport/transport.local.js.map +1 -1
- package/src/transport/transport.registry.d.ts +30 -0
- package/src/transport/transport.registry.js +84 -1
- package/src/transport/transport.registry.js.map +1 -1
- package/src/transport/transport.types.d.ts +3 -3
- package/src/transport/transport.types.js.map +1 -1
- package/src/utils/content.utils.d.ts +48 -0
- package/src/utils/content.utils.js +194 -0
- package/src/utils/content.utils.js.map +1 -0
- package/src/utils/index.d.ts +8 -0
- package/src/utils/index.js +55 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/lineage.utils.d.ts +40 -0
- package/src/utils/lineage.utils.js +82 -0
- package/src/utils/lineage.utils.js.map +1 -0
- package/src/utils/naming.utils.d.ts +46 -0
- package/src/utils/naming.utils.js +136 -0
- package/src/utils/naming.utils.js.map +1 -0
- package/src/utils/types.utils.d.ts +2 -2
- package/src/utils/types.utils.js.map +1 -1
- package/src/utils/uri-template.utils.d.ts +57 -0
- package/src/utils/uri-template.utils.js +113 -0
- package/src/utils/uri-template.utils.js.map +1 -0
- package/src/utils/uri-validation.utils.d.ts +40 -0
- package/src/utils/uri-validation.utils.js +76 -0
- package/src/utils/uri-validation.utils.js.map +1 -0
- package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
- package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/index.d.ts +0 -7
- package/src/__test-utils__/fixtures/index.js +0 -11
- package/src/__test-utils__/fixtures/index.js.map +0 -1
- package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
- package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
- package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
- package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
- package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
- package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
- package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
- package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
- package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
- package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
- package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
- package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
- package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
- package/src/__test-utils__/helpers/async.helpers.js +0 -112
- package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
- package/src/__test-utils__/helpers/index.d.ts +0 -6
- package/src/__test-utils__/helpers/index.js +0 -10
- package/src/__test-utils__/helpers/index.js.map +0 -1
- package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
- package/src/__test-utils__/helpers/setup.helpers.js +0 -106
- package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
- package/src/__test-utils__/index.d.ts +0 -9
- package/src/__test-utils__/index.js +0 -14
- package/src/__test-utils__/index.js.map +0 -1
- package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
- package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
- package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
- package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
- package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
- package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/index.d.ts +0 -8
- package/src/__test-utils__/mocks/index.js +0 -12
- package/src/__test-utils__/mocks/index.js.map +0 -1
- package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
- package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
- package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
- package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
- package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
- package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
- package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
- package/src/auth/path.utils.d.ts +0 -20
- package/src/auth/path.utils.js +0 -71
- package/src/auth/path.utils.js.map +0 -1
- package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
- package/src/common/decorators-old/async-with.decorator.js +0 -24
- package/src/common/decorators-old/async-with.decorator.js.map +0 -1
- package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/auth-hook.decorator.js +0 -27
- package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
- package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
- package/src/common/decorators-old/session-hook.decorator.js +0 -27
- package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base Layout for Server-Rendered Pages
|
|
3
|
+
*
|
|
4
|
+
* Provides a consistent HTML shell with all CDN resources pre-configured:
|
|
5
|
+
* - Tailwind CSS v4 (Browser CDN) - Utility-first CSS framework with @theme support
|
|
6
|
+
* - HTMX (CDN) - Progressive enhancement for interactivity
|
|
7
|
+
* - Google Fonts (Inter) - Modern UI typography
|
|
8
|
+
*
|
|
9
|
+
* No build step required - all resources loaded from CDN at runtime.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Basic usage
|
|
14
|
+
* const html = baseLayout('<div>content</div>', { title: 'Page' });
|
|
15
|
+
*
|
|
16
|
+
* // With custom theme
|
|
17
|
+
* const html = baseLayout('<div>content</div>', {
|
|
18
|
+
* title: 'Page',
|
|
19
|
+
* theme: {
|
|
20
|
+
* colors: {
|
|
21
|
+
* primary: '#3b82f6',
|
|
22
|
+
* 'primary-dark': '#2563eb',
|
|
23
|
+
* },
|
|
24
|
+
* },
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* CDN URLs and versions - centralized for easy updates
|
|
30
|
+
*/
|
|
31
|
+
export declare const CDN: {
|
|
32
|
+
/** Tailwind CSS v4 Browser CDN - generates styles on-the-fly with @theme support */
|
|
33
|
+
readonly tailwind: "https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4";
|
|
34
|
+
/** HTMX - lightweight JS for AJAX, CSS Transitions, WebSockets */
|
|
35
|
+
readonly htmx: {
|
|
36
|
+
readonly url: "https://unpkg.com/htmx.org@1.9.10";
|
|
37
|
+
readonly integrity: "sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC";
|
|
38
|
+
};
|
|
39
|
+
/** Google Fonts - Inter for modern UI */
|
|
40
|
+
readonly fonts: {
|
|
41
|
+
readonly preconnect: readonly ["https://fonts.googleapis.com", "https://fonts.gstatic.com"];
|
|
42
|
+
readonly stylesheet: "https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap";
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Theme color configuration
|
|
47
|
+
* Keys become CSS custom properties: --color-{key}
|
|
48
|
+
*/
|
|
49
|
+
export interface ThemeColors {
|
|
50
|
+
/** Primary brand color */
|
|
51
|
+
primary?: string;
|
|
52
|
+
/** Darker primary for hover states */
|
|
53
|
+
'primary-dark'?: string;
|
|
54
|
+
/** Secondary brand color */
|
|
55
|
+
secondary?: string;
|
|
56
|
+
/** Accent color for highlights */
|
|
57
|
+
accent?: string;
|
|
58
|
+
/** Success state color */
|
|
59
|
+
success?: string;
|
|
60
|
+
/** Warning state color */
|
|
61
|
+
warning?: string;
|
|
62
|
+
/** Error/danger state color */
|
|
63
|
+
danger?: string;
|
|
64
|
+
/** Custom colors (any additional colors) */
|
|
65
|
+
[key: string]: string | undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Theme font configuration
|
|
69
|
+
* Keys become CSS custom properties: --font-{key}
|
|
70
|
+
*/
|
|
71
|
+
export interface ThemeFonts {
|
|
72
|
+
/** Sans-serif font family */
|
|
73
|
+
sans?: string;
|
|
74
|
+
/** Serif font family */
|
|
75
|
+
serif?: string;
|
|
76
|
+
/** Monospace font family */
|
|
77
|
+
mono?: string;
|
|
78
|
+
/** Custom fonts */
|
|
79
|
+
[key: string]: string | undefined;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Complete theme configuration for FrontMCP UI
|
|
83
|
+
*/
|
|
84
|
+
export interface ThemeConfig {
|
|
85
|
+
/** Custom colors */
|
|
86
|
+
colors?: ThemeColors;
|
|
87
|
+
/** Custom fonts */
|
|
88
|
+
fonts?: ThemeFonts;
|
|
89
|
+
/** Additional custom CSS variables (raw @theme content) */
|
|
90
|
+
customVars?: string;
|
|
91
|
+
/** Additional custom CSS (outside @theme) */
|
|
92
|
+
customCss?: string;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Default theme with FrontMCP branding
|
|
96
|
+
*/
|
|
97
|
+
export declare const DEFAULT_THEME: ThemeConfig;
|
|
98
|
+
/**
|
|
99
|
+
* Options for the base layout
|
|
100
|
+
*/
|
|
101
|
+
export interface BaseLayoutOptions {
|
|
102
|
+
/** Page title (will be suffixed with " - FrontMCP") */
|
|
103
|
+
title: string;
|
|
104
|
+
/** Optional description for meta tag */
|
|
105
|
+
description?: string;
|
|
106
|
+
/** Include HTMX script (default: true) */
|
|
107
|
+
includeHtmx?: boolean;
|
|
108
|
+
/** Include Tailwind CSS (default: true) */
|
|
109
|
+
includeTailwind?: boolean;
|
|
110
|
+
/** Include Google Fonts (default: true) */
|
|
111
|
+
includeFonts?: boolean;
|
|
112
|
+
/** Additional head content (scripts, styles, meta tags) */
|
|
113
|
+
headExtra?: string;
|
|
114
|
+
/** Body classes (default: 'bg-gray-50 min-h-screen font-sans antialiased') */
|
|
115
|
+
bodyClass?: string;
|
|
116
|
+
/** Theme configuration - colors, fonts, and custom CSS */
|
|
117
|
+
theme?: ThemeConfig;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Escape HTML special characters to prevent XSS
|
|
121
|
+
* Per OWASP guidelines, escapes: & < > " ' /
|
|
122
|
+
*
|
|
123
|
+
* @param str - The string to escape
|
|
124
|
+
* @returns The escaped string safe for HTML content and attributes
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* escapeHtml('<script>alert("xss")</script>')
|
|
128
|
+
* // => '<script>alert("xss")</script>'
|
|
129
|
+
*/
|
|
130
|
+
export declare function escapeHtml(str: string): string;
|
|
131
|
+
/**
|
|
132
|
+
* Build the complete HTML document with CDN resources
|
|
133
|
+
*
|
|
134
|
+
* @param content - The page content (HTML string)
|
|
135
|
+
* @param options - Layout configuration options
|
|
136
|
+
* @returns Complete HTML document string
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```typescript
|
|
140
|
+
* const html = baseLayout('<div>My content</div>', {
|
|
141
|
+
* title: 'Sign In',
|
|
142
|
+
* description: 'Sign in to your account',
|
|
143
|
+
* theme: {
|
|
144
|
+
* colors: {
|
|
145
|
+
* primary: '#ff6b6b',
|
|
146
|
+
* },
|
|
147
|
+
* },
|
|
148
|
+
* });
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export declare function baseLayout(content: string, options: BaseLayoutOptions): string;
|
|
152
|
+
/**
|
|
153
|
+
* Create a layout wrapper function with preset options
|
|
154
|
+
*
|
|
155
|
+
* @param defaultOptions - Default options to apply to all pages
|
|
156
|
+
* @returns A function that wraps content with the layout
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```typescript
|
|
160
|
+
* const brandedLayout = createLayout({
|
|
161
|
+
* theme: {
|
|
162
|
+
* colors: {
|
|
163
|
+
* primary: '#ff6b6b',
|
|
164
|
+
* 'primary-dark': '#ee5a5a',
|
|
165
|
+
* },
|
|
166
|
+
* },
|
|
167
|
+
* });
|
|
168
|
+
*
|
|
169
|
+
* const html = brandedLayout('<div>Content</div>', { title: 'Page' });
|
|
170
|
+
* ```
|
|
171
|
+
*/
|
|
172
|
+
export declare function createLayout(defaultOptions: Partial<BaseLayoutOptions>): (content: string, options: BaseLayoutOptions) => string;
|
|
173
|
+
/**
|
|
174
|
+
* Default auth layout with standard styling
|
|
175
|
+
*/
|
|
176
|
+
export declare const authLayout: (content: string, options: BaseLayoutOptions) => string;
|
|
177
|
+
/**
|
|
178
|
+
* Centered card layout for login/auth pages
|
|
179
|
+
*/
|
|
180
|
+
export declare function centeredCardLayout(content: string, options: BaseLayoutOptions): string;
|
|
181
|
+
/**
|
|
182
|
+
* Wide layout for consent/selection pages
|
|
183
|
+
*/
|
|
184
|
+
export declare function wideLayout(content: string, options: BaseLayoutOptions): string;
|
|
185
|
+
/**
|
|
186
|
+
* Extra wide layout for tool selection pages
|
|
187
|
+
*/
|
|
188
|
+
export declare function extraWideLayout(content: string, options: BaseLayoutOptions): string;
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Base Layout for Server-Rendered Pages
|
|
4
|
+
*
|
|
5
|
+
* Provides a consistent HTML shell with all CDN resources pre-configured:
|
|
6
|
+
* - Tailwind CSS v4 (Browser CDN) - Utility-first CSS framework with @theme support
|
|
7
|
+
* - HTMX (CDN) - Progressive enhancement for interactivity
|
|
8
|
+
* - Google Fonts (Inter) - Modern UI typography
|
|
9
|
+
*
|
|
10
|
+
* No build step required - all resources loaded from CDN at runtime.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // Basic usage
|
|
15
|
+
* const html = baseLayout('<div>content</div>', { title: 'Page' });
|
|
16
|
+
*
|
|
17
|
+
* // With custom theme
|
|
18
|
+
* const html = baseLayout('<div>content</div>', {
|
|
19
|
+
* title: 'Page',
|
|
20
|
+
* theme: {
|
|
21
|
+
* colors: {
|
|
22
|
+
* primary: '#3b82f6',
|
|
23
|
+
* 'primary-dark': '#2563eb',
|
|
24
|
+
* },
|
|
25
|
+
* },
|
|
26
|
+
* });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.authLayout = exports.DEFAULT_THEME = exports.CDN = void 0;
|
|
31
|
+
exports.escapeHtml = escapeHtml;
|
|
32
|
+
exports.baseLayout = baseLayout;
|
|
33
|
+
exports.createLayout = createLayout;
|
|
34
|
+
exports.centeredCardLayout = centeredCardLayout;
|
|
35
|
+
exports.wideLayout = wideLayout;
|
|
36
|
+
exports.extraWideLayout = extraWideLayout;
|
|
37
|
+
// ============================================
|
|
38
|
+
// CDN Configuration
|
|
39
|
+
// ============================================
|
|
40
|
+
/**
|
|
41
|
+
* CDN URLs and versions - centralized for easy updates
|
|
42
|
+
*/
|
|
43
|
+
exports.CDN = {
|
|
44
|
+
/** Tailwind CSS v4 Browser CDN - generates styles on-the-fly with @theme support */
|
|
45
|
+
tailwind: 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4',
|
|
46
|
+
/** HTMX - lightweight JS for AJAX, CSS Transitions, WebSockets */
|
|
47
|
+
htmx: {
|
|
48
|
+
url: 'https://unpkg.com/htmx.org@1.9.10',
|
|
49
|
+
integrity: 'sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC',
|
|
50
|
+
},
|
|
51
|
+
/** Google Fonts - Inter for modern UI */
|
|
52
|
+
fonts: {
|
|
53
|
+
preconnect: ['https://fonts.googleapis.com', 'https://fonts.gstatic.com'],
|
|
54
|
+
stylesheet: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Default theme with FrontMCP branding
|
|
59
|
+
*/
|
|
60
|
+
exports.DEFAULT_THEME = {
|
|
61
|
+
colors: {
|
|
62
|
+
primary: '#3b82f6', // blue-500
|
|
63
|
+
'primary-dark': '#2563eb', // blue-600
|
|
64
|
+
secondary: '#8b5cf6', // violet-500
|
|
65
|
+
accent: '#06b6d4', // cyan-500
|
|
66
|
+
success: '#22c55e', // green-500
|
|
67
|
+
warning: '#f59e0b', // amber-500
|
|
68
|
+
danger: '#ef4444', // red-500
|
|
69
|
+
},
|
|
70
|
+
fonts: {
|
|
71
|
+
sans: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
// ============================================
|
|
75
|
+
// Utility Functions
|
|
76
|
+
// ============================================
|
|
77
|
+
/**
|
|
78
|
+
* Escape HTML special characters to prevent XSS
|
|
79
|
+
* Per OWASP guidelines, escapes: & < > " ' /
|
|
80
|
+
*
|
|
81
|
+
* @param str - The string to escape
|
|
82
|
+
* @returns The escaped string safe for HTML content and attributes
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* escapeHtml('<script>alert("xss")</script>')
|
|
86
|
+
* // => '<script>alert("xss")</script>'
|
|
87
|
+
*/
|
|
88
|
+
function escapeHtml(str) {
|
|
89
|
+
return str
|
|
90
|
+
.replace(/&/g, '&')
|
|
91
|
+
.replace(/</g, '<')
|
|
92
|
+
.replace(/>/g, '>')
|
|
93
|
+
.replace(/"/g, '"')
|
|
94
|
+
.replace(/'/g, ''')
|
|
95
|
+
.replace(/\//g, '/');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Build the @theme CSS block from theme configuration
|
|
99
|
+
*/
|
|
100
|
+
function buildThemeCss(theme) {
|
|
101
|
+
const lines = [];
|
|
102
|
+
// Add color variables
|
|
103
|
+
if (theme.colors) {
|
|
104
|
+
for (const [key, value] of Object.entries(theme.colors)) {
|
|
105
|
+
if (value) {
|
|
106
|
+
lines.push(`--color-${key}: ${value};`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Add font variables
|
|
111
|
+
if (theme.fonts) {
|
|
112
|
+
for (const [key, value] of Object.entries(theme.fonts)) {
|
|
113
|
+
if (value) {
|
|
114
|
+
lines.push(`--font-${key}: ${value};`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Add custom variables
|
|
119
|
+
if (theme.customVars) {
|
|
120
|
+
lines.push(theme.customVars);
|
|
121
|
+
}
|
|
122
|
+
return lines.join('\n ');
|
|
123
|
+
}
|
|
124
|
+
// ============================================
|
|
125
|
+
// Layout Builder
|
|
126
|
+
// ============================================
|
|
127
|
+
/**
|
|
128
|
+
* Build the complete HTML document with CDN resources
|
|
129
|
+
*
|
|
130
|
+
* @param content - The page content (HTML string)
|
|
131
|
+
* @param options - Layout configuration options
|
|
132
|
+
* @returns Complete HTML document string
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```typescript
|
|
136
|
+
* const html = baseLayout('<div>My content</div>', {
|
|
137
|
+
* title: 'Sign In',
|
|
138
|
+
* description: 'Sign in to your account',
|
|
139
|
+
* theme: {
|
|
140
|
+
* colors: {
|
|
141
|
+
* primary: '#ff6b6b',
|
|
142
|
+
* },
|
|
143
|
+
* },
|
|
144
|
+
* });
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
function baseLayout(content, options) {
|
|
148
|
+
const { title, description, includeHtmx = true, includeTailwind = true, includeFonts = true, headExtra = '', bodyClass = 'bg-gray-50 min-h-screen font-sans antialiased', theme, } = options;
|
|
149
|
+
// Merge theme with defaults
|
|
150
|
+
const mergedTheme = {
|
|
151
|
+
colors: { ...exports.DEFAULT_THEME.colors, ...theme?.colors },
|
|
152
|
+
fonts: { ...exports.DEFAULT_THEME.fonts, ...theme?.fonts },
|
|
153
|
+
customVars: theme?.customVars,
|
|
154
|
+
customCss: theme?.customCss,
|
|
155
|
+
};
|
|
156
|
+
// Build font preconnect links
|
|
157
|
+
const fontPreconnect = includeFonts
|
|
158
|
+
? exports.CDN.fonts.preconnect
|
|
159
|
+
.map((url, i) => `<link rel="preconnect" href="${url}"${i > 0 ? ' crossorigin' : ''}>`)
|
|
160
|
+
.join('\n ')
|
|
161
|
+
: '';
|
|
162
|
+
// Build font stylesheet
|
|
163
|
+
const fontStylesheet = includeFonts ? `<link href="${exports.CDN.fonts.stylesheet}" rel="stylesheet">` : '';
|
|
164
|
+
// Build Tailwind v4 script and theme styles
|
|
165
|
+
const themeCss = buildThemeCss(mergedTheme);
|
|
166
|
+
const customCss = mergedTheme.customCss || '';
|
|
167
|
+
const tailwindBlock = includeTailwind
|
|
168
|
+
? `<script src="${exports.CDN.tailwind}"></script>
|
|
169
|
+
<style type="text/tailwindcss">
|
|
170
|
+
@theme {
|
|
171
|
+
${themeCss}
|
|
172
|
+
}
|
|
173
|
+
${customCss}
|
|
174
|
+
</style>`
|
|
175
|
+
: '';
|
|
176
|
+
// Build HTMX script
|
|
177
|
+
const htmxScript = includeHtmx
|
|
178
|
+
? `<script src="${exports.CDN.htmx.url}" integrity="${exports.CDN.htmx.integrity}" crossorigin="anonymous"></script>`
|
|
179
|
+
: '';
|
|
180
|
+
// Build meta description
|
|
181
|
+
const metaDescription = description ? `<meta name="description" content="${escapeHtml(description)}">` : '';
|
|
182
|
+
return `<!DOCTYPE html>
|
|
183
|
+
<html lang="en">
|
|
184
|
+
<head>
|
|
185
|
+
<meta charset="UTF-8">
|
|
186
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
187
|
+
<title>${escapeHtml(title)} - FrontMCP</title>
|
|
188
|
+
${metaDescription}
|
|
189
|
+
|
|
190
|
+
<!-- Google Fonts CDN - Inter (modern UI font) -->
|
|
191
|
+
${fontPreconnect}
|
|
192
|
+
${fontStylesheet}
|
|
193
|
+
|
|
194
|
+
<!-- Tailwind CSS v4 Browser CDN with @theme support -->
|
|
195
|
+
${tailwindBlock}
|
|
196
|
+
|
|
197
|
+
<!-- HTMX CDN - progressive enhancement (~14KB gzipped) -->
|
|
198
|
+
${htmxScript}
|
|
199
|
+
${headExtra}
|
|
200
|
+
</head>
|
|
201
|
+
<body class="${escapeHtml(bodyClass)}">
|
|
202
|
+
${content}
|
|
203
|
+
</body>
|
|
204
|
+
</html>`;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Create a layout wrapper function with preset options
|
|
208
|
+
*
|
|
209
|
+
* @param defaultOptions - Default options to apply to all pages
|
|
210
|
+
* @returns A function that wraps content with the layout
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* ```typescript
|
|
214
|
+
* const brandedLayout = createLayout({
|
|
215
|
+
* theme: {
|
|
216
|
+
* colors: {
|
|
217
|
+
* primary: '#ff6b6b',
|
|
218
|
+
* 'primary-dark': '#ee5a5a',
|
|
219
|
+
* },
|
|
220
|
+
* },
|
|
221
|
+
* });
|
|
222
|
+
*
|
|
223
|
+
* const html = brandedLayout('<div>Content</div>', { title: 'Page' });
|
|
224
|
+
* ```
|
|
225
|
+
*/
|
|
226
|
+
function createLayout(defaultOptions) {
|
|
227
|
+
return (content, options) => {
|
|
228
|
+
// Deep merge themes
|
|
229
|
+
const mergedTheme = defaultOptions.theme || options.theme
|
|
230
|
+
? {
|
|
231
|
+
colors: { ...defaultOptions.theme?.colors, ...options.theme?.colors },
|
|
232
|
+
fonts: { ...defaultOptions.theme?.fonts, ...options.theme?.fonts },
|
|
233
|
+
customVars: options.theme?.customVars ?? defaultOptions.theme?.customVars,
|
|
234
|
+
customCss: options.theme?.customCss ?? defaultOptions.theme?.customCss,
|
|
235
|
+
}
|
|
236
|
+
: undefined;
|
|
237
|
+
return baseLayout(content, {
|
|
238
|
+
...defaultOptions,
|
|
239
|
+
...options,
|
|
240
|
+
theme: mergedTheme,
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// ============================================
|
|
245
|
+
// Pre-configured Layouts
|
|
246
|
+
// ============================================
|
|
247
|
+
/**
|
|
248
|
+
* Default auth layout with standard styling
|
|
249
|
+
*/
|
|
250
|
+
exports.authLayout = createLayout({
|
|
251
|
+
bodyClass: 'bg-gray-50 min-h-screen font-sans antialiased',
|
|
252
|
+
});
|
|
253
|
+
/**
|
|
254
|
+
* Centered card layout for login/auth pages
|
|
255
|
+
*/
|
|
256
|
+
function centeredCardLayout(content, options) {
|
|
257
|
+
const wrappedContent = `
|
|
258
|
+
<div class="min-h-screen flex items-center justify-center p-4">
|
|
259
|
+
<div class="w-full max-w-md">
|
|
260
|
+
${content}
|
|
261
|
+
</div>
|
|
262
|
+
</div>`;
|
|
263
|
+
return baseLayout(wrappedContent, {
|
|
264
|
+
...options,
|
|
265
|
+
bodyClass: 'bg-gradient-to-br from-primary to-secondary min-h-screen font-sans antialiased',
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Wide layout for consent/selection pages
|
|
270
|
+
*/
|
|
271
|
+
function wideLayout(content, options) {
|
|
272
|
+
const wrappedContent = `
|
|
273
|
+
<div class="min-h-screen py-8 px-4">
|
|
274
|
+
<div class="max-w-2xl mx-auto">
|
|
275
|
+
${content}
|
|
276
|
+
</div>
|
|
277
|
+
</div>`;
|
|
278
|
+
return baseLayout(wrappedContent, options);
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Extra wide layout for tool selection pages
|
|
282
|
+
*/
|
|
283
|
+
function extraWideLayout(content, options) {
|
|
284
|
+
const wrappedContent = `
|
|
285
|
+
<div class="min-h-screen py-8 px-4">
|
|
286
|
+
<div class="max-w-3xl mx-auto">
|
|
287
|
+
${content}
|
|
288
|
+
</div>
|
|
289
|
+
</div>`;
|
|
290
|
+
return baseLayout(wrappedContent, options);
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=base-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-layout.js","sourceRoot":"","sources":["../../../../src/auth/ui/base-layout.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Base Layout for Server-Rendered Pages\n *\n * Provides a consistent HTML shell with all CDN resources pre-configured:\n * - Tailwind CSS v4 (Browser CDN) - Utility-first CSS framework with @theme support\n * - HTMX (CDN) - Progressive enhancement for interactivity\n * - Google Fonts (Inter) - Modern UI typography\n *\n * No build step required - all resources loaded from CDN at runtime.\n *\n * @example\n * ```typescript\n * // Basic usage\n * const html = baseLayout('<div>content</div>', { title: 'Page' });\n *\n * // With custom theme\n * const html = baseLayout('<div>content</div>', {\n * title: 'Page',\n * theme: {\n * colors: {\n * primary: '#3b82f6',\n * 'primary-dark': '#2563eb',\n * },\n * },\n * });\n * ```\n */\n\n// ============================================\n// CDN Configuration\n// ============================================\n\n/**\n * CDN URLs and versions - centralized for easy updates\n */\nexport const CDN = {\n /** Tailwind CSS v4 Browser CDN - generates styles on-the-fly with @theme support */\n tailwind: 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4',\n\n /** HTMX - lightweight JS for AJAX, CSS Transitions, WebSockets */\n htmx: {\n url: 'https://unpkg.com/htmx.org@1.9.10',\n integrity: 'sha384-D1Kt99CQMDuVetoL1lrYwg5t+9QdHe7NLX/SoJYkXDFfX37iInKRy5xLSi8nO7UC',\n },\n\n /** Google Fonts - Inter for modern UI */\n fonts: {\n preconnect: ['https://fonts.googleapis.com', 'https://fonts.gstatic.com'],\n stylesheet: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap',\n },\n} as const;\n\n// ============================================\n// Theme Configuration\n// ============================================\n\n/**\n * Theme color configuration\n * Keys become CSS custom properties: --color-{key}\n */\nexport interface ThemeColors {\n /** Primary brand color */\n primary?: string;\n /** Darker primary for hover states */\n 'primary-dark'?: string;\n /** Secondary brand color */\n secondary?: string;\n /** Accent color for highlights */\n accent?: string;\n /** Success state color */\n success?: string;\n /** Warning state color */\n warning?: string;\n /** Error/danger state color */\n danger?: string;\n /** Custom colors (any additional colors) */\n [key: string]: string | undefined;\n}\n\n/**\n * Theme font configuration\n * Keys become CSS custom properties: --font-{key}\n */\nexport interface ThemeFonts {\n /** Sans-serif font family */\n sans?: string;\n /** Serif font family */\n serif?: string;\n /** Monospace font family */\n mono?: string;\n /** Custom fonts */\n [key: string]: string | undefined;\n}\n\n/**\n * Complete theme configuration for FrontMCP UI\n */\nexport interface ThemeConfig {\n /** Custom colors */\n colors?: ThemeColors;\n /** Custom fonts */\n fonts?: ThemeFonts;\n /** Additional custom CSS variables (raw @theme content) */\n customVars?: string;\n /** Additional custom CSS (outside @theme) */\n customCss?: string;\n}\n\n/**\n * Default theme with FrontMCP branding\n */\nexport const DEFAULT_THEME: ThemeConfig = {\n colors: {\n primary: '#3b82f6', // blue-500\n 'primary-dark': '#2563eb', // blue-600\n secondary: '#8b5cf6', // violet-500\n accent: '#06b6d4', // cyan-500\n success: '#22c55e', // green-500\n warning: '#f59e0b', // amber-500\n danger: '#ef4444', // red-500\n },\n fonts: {\n sans: 'Inter, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n },\n};\n\n// ============================================\n// Layout Options\n// ============================================\n\n/**\n * Options for the base layout\n */\nexport interface BaseLayoutOptions {\n /** Page title (will be suffixed with \" - FrontMCP\") */\n title: string;\n\n /** Optional description for meta tag */\n description?: string;\n\n /** Include HTMX script (default: true) */\n includeHtmx?: boolean;\n\n /** Include Tailwind CSS (default: true) */\n includeTailwind?: boolean;\n\n /** Include Google Fonts (default: true) */\n includeFonts?: boolean;\n\n /** Additional head content (scripts, styles, meta tags) */\n headExtra?: string;\n\n /** Body classes (default: 'bg-gray-50 min-h-screen font-sans antialiased') */\n bodyClass?: string;\n\n /** Theme configuration - colors, fonts, and custom CSS */\n theme?: ThemeConfig;\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Escape HTML special characters to prevent XSS\n * Per OWASP guidelines, escapes: & < > \" ' /\n *\n * @param str - The string to escape\n * @returns The escaped string safe for HTML content and attributes\n *\n * @example\n * escapeHtml('<script>alert(\"xss\")</script>')\n * // => '<script>alert("xss")</script>'\n */\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n}\n\n/**\n * Build the @theme CSS block from theme configuration\n */\nfunction buildThemeCss(theme: ThemeConfig): string {\n const lines: string[] = [];\n\n // Add color variables\n if (theme.colors) {\n for (const [key, value] of Object.entries(theme.colors)) {\n if (value) {\n lines.push(`--color-${key}: ${value};`);\n }\n }\n }\n\n // Add font variables\n if (theme.fonts) {\n for (const [key, value] of Object.entries(theme.fonts)) {\n if (value) {\n lines.push(`--font-${key}: ${value};`);\n }\n }\n }\n\n // Add custom variables\n if (theme.customVars) {\n lines.push(theme.customVars);\n }\n\n return lines.join('\\n ');\n}\n\n// ============================================\n// Layout Builder\n// ============================================\n\n/**\n * Build the complete HTML document with CDN resources\n *\n * @param content - The page content (HTML string)\n * @param options - Layout configuration options\n * @returns Complete HTML document string\n *\n * @example\n * ```typescript\n * const html = baseLayout('<div>My content</div>', {\n * title: 'Sign In',\n * description: 'Sign in to your account',\n * theme: {\n * colors: {\n * primary: '#ff6b6b',\n * },\n * },\n * });\n * ```\n */\nexport function baseLayout(content: string, options: BaseLayoutOptions): string {\n const {\n title,\n description,\n includeHtmx = true,\n includeTailwind = true,\n includeFonts = true,\n headExtra = '',\n bodyClass = 'bg-gray-50 min-h-screen font-sans antialiased',\n theme,\n } = options;\n\n // Merge theme with defaults\n const mergedTheme: ThemeConfig = {\n colors: { ...DEFAULT_THEME.colors, ...theme?.colors },\n fonts: { ...DEFAULT_THEME.fonts, ...theme?.fonts },\n customVars: theme?.customVars,\n customCss: theme?.customCss,\n };\n\n // Build font preconnect links\n const fontPreconnect = includeFonts\n ? CDN.fonts.preconnect\n .map((url, i) => `<link rel=\"preconnect\" href=\"${url}\"${i > 0 ? ' crossorigin' : ''}>`)\n .join('\\n ')\n : '';\n\n // Build font stylesheet\n const fontStylesheet = includeFonts ? `<link href=\"${CDN.fonts.stylesheet}\" rel=\"stylesheet\">` : '';\n\n // Build Tailwind v4 script and theme styles\n const themeCss = buildThemeCss(mergedTheme);\n const customCss = mergedTheme.customCss || '';\n\n const tailwindBlock = includeTailwind\n ? `<script src=\"${CDN.tailwind}\"></script>\n <style type=\"text/tailwindcss\">\n @theme {\n ${themeCss}\n }\n ${customCss}\n </style>`\n : '';\n\n // Build HTMX script\n const htmxScript = includeHtmx\n ? `<script src=\"${CDN.htmx.url}\" integrity=\"${CDN.htmx.integrity}\" crossorigin=\"anonymous\"></script>`\n : '';\n\n // Build meta description\n const metaDescription = description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : '';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(title)} - FrontMCP</title>\n ${metaDescription}\n\n <!-- Google Fonts CDN - Inter (modern UI font) -->\n ${fontPreconnect}\n ${fontStylesheet}\n\n <!-- Tailwind CSS v4 Browser CDN with @theme support -->\n ${tailwindBlock}\n\n <!-- HTMX CDN - progressive enhancement (~14KB gzipped) -->\n ${htmxScript}\n ${headExtra}\n</head>\n<body class=\"${escapeHtml(bodyClass)}\">\n ${content}\n</body>\n</html>`;\n}\n\n/**\n * Create a layout wrapper function with preset options\n *\n * @param defaultOptions - Default options to apply to all pages\n * @returns A function that wraps content with the layout\n *\n * @example\n * ```typescript\n * const brandedLayout = createLayout({\n * theme: {\n * colors: {\n * primary: '#ff6b6b',\n * 'primary-dark': '#ee5a5a',\n * },\n * },\n * });\n *\n * const html = brandedLayout('<div>Content</div>', { title: 'Page' });\n * ```\n */\nexport function createLayout(\n defaultOptions: Partial<BaseLayoutOptions>,\n): (content: string, options: BaseLayoutOptions) => string {\n return (content: string, options: BaseLayoutOptions) => {\n // Deep merge themes\n const mergedTheme: ThemeConfig | undefined =\n defaultOptions.theme || options.theme\n ? {\n colors: { ...defaultOptions.theme?.colors, ...options.theme?.colors },\n fonts: { ...defaultOptions.theme?.fonts, ...options.theme?.fonts },\n customVars: options.theme?.customVars ?? defaultOptions.theme?.customVars,\n customCss: options.theme?.customCss ?? defaultOptions.theme?.customCss,\n }\n : undefined;\n\n return baseLayout(content, {\n ...defaultOptions,\n ...options,\n theme: mergedTheme,\n });\n };\n}\n\n// ============================================\n// Pre-configured Layouts\n// ============================================\n\n/**\n * Default auth layout with standard styling\n */\nexport const authLayout = createLayout({\n bodyClass: 'bg-gray-50 min-h-screen font-sans antialiased',\n});\n\n/**\n * Centered card layout for login/auth pages\n */\nexport function centeredCardLayout(content: string, options: BaseLayoutOptions): string {\n const wrappedContent = `\n <div class=\"min-h-screen flex items-center justify-center p-4\">\n <div class=\"w-full max-w-md\">\n ${content}\n </div>\n </div>`;\n\n return baseLayout(wrappedContent, {\n ...options,\n bodyClass: 'bg-gradient-to-br from-primary to-secondary min-h-screen font-sans antialiased',\n });\n}\n\n/**\n * Wide layout for consent/selection pages\n */\nexport function wideLayout(content: string, options: BaseLayoutOptions): string {\n const wrappedContent = `\n <div class=\"min-h-screen py-8 px-4\">\n <div class=\"max-w-2xl mx-auto\">\n ${content}\n </div>\n </div>`;\n\n return baseLayout(wrappedContent, options);\n}\n\n/**\n * Extra wide layout for tool selection pages\n */\nexport function extraWideLayout(content: string, options: BaseLayoutOptions): string {\n const wrappedContent = `\n <div class=\"min-h-screen py-8 px-4\">\n <div class=\"max-w-3xl mx-auto\">\n ${content}\n </div>\n </div>`;\n\n return baseLayout(wrappedContent, options);\n}\n"]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTMX Template Builders for OAuth UI
|
|
3
|
+
*
|
|
4
|
+
* Server-side HTML rendering with HTMX for interactivity.
|
|
5
|
+
* No build step required - pure runtime rendering with Tailwind CSS CDN.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - OAuth consent page with multiple apps
|
|
9
|
+
* - Incremental authorization page for single app
|
|
10
|
+
* - Federated login page for multi-provider selection
|
|
11
|
+
* - All pages use Tailwind CSS from CDN (no build required)
|
|
12
|
+
* - Google Fonts (Inter) for modern typography
|
|
13
|
+
* - HTMX for progressive enhancement (~14KB)
|
|
14
|
+
*
|
|
15
|
+
* Uses base-layout.ts for consistent HTML shell with CDN resources.
|
|
16
|
+
*/
|
|
17
|
+
import { escapeHtml as baseEscapeHtml } from './base-layout';
|
|
18
|
+
/**
|
|
19
|
+
* App information for authorization cards
|
|
20
|
+
*/
|
|
21
|
+
export interface AppAuthCard {
|
|
22
|
+
/** App identifier */
|
|
23
|
+
appId: string;
|
|
24
|
+
/** Display name */
|
|
25
|
+
appName: string;
|
|
26
|
+
/** App description */
|
|
27
|
+
description?: string;
|
|
28
|
+
/** Icon URL (optional, will use initials fallback) */
|
|
29
|
+
iconUrl?: string;
|
|
30
|
+
/** Scopes required by this app */
|
|
31
|
+
requiredScopes?: string[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Provider information for federated login
|
|
35
|
+
*/
|
|
36
|
+
export interface ProviderCard {
|
|
37
|
+
/** Provider identifier */
|
|
38
|
+
providerId: string;
|
|
39
|
+
/** Display name */
|
|
40
|
+
providerName: string;
|
|
41
|
+
/** Provider URL (for remote providers) */
|
|
42
|
+
providerUrl?: string;
|
|
43
|
+
/** Auth mode */
|
|
44
|
+
mode: string;
|
|
45
|
+
/** App IDs associated with this provider */
|
|
46
|
+
appIds: string[];
|
|
47
|
+
/** Whether this is the parent/primary provider */
|
|
48
|
+
isPrimary?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Tool information for consent page
|
|
52
|
+
*/
|
|
53
|
+
export interface ToolCard {
|
|
54
|
+
/** Tool identifier */
|
|
55
|
+
toolId: string;
|
|
56
|
+
/** Display name */
|
|
57
|
+
toolName: string;
|
|
58
|
+
/** Tool description */
|
|
59
|
+
description?: string;
|
|
60
|
+
/** Parent app ID */
|
|
61
|
+
appId: string;
|
|
62
|
+
/** Parent app name */
|
|
63
|
+
appName: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Escape HTML special characters
|
|
67
|
+
* Re-exported from base-layout for convenience
|
|
68
|
+
*/
|
|
69
|
+
export declare const escapeHtml: typeof baseEscapeHtml;
|
|
70
|
+
/**
|
|
71
|
+
* Build OAuth consent page with HTMX + Tailwind
|
|
72
|
+
* Shows all apps at once with Authorize/Skip buttons
|
|
73
|
+
*/
|
|
74
|
+
export declare function buildConsentPage(params: {
|
|
75
|
+
apps: AppAuthCard[];
|
|
76
|
+
clientName: string;
|
|
77
|
+
pendingAuthId: string;
|
|
78
|
+
csrfToken: string;
|
|
79
|
+
callbackPath: string;
|
|
80
|
+
}): string;
|
|
81
|
+
/**
|
|
82
|
+
* Build incremental auth page (single app) with HTMX + Tailwind
|
|
83
|
+
* Used when a tool requires authorization for a skipped app
|
|
84
|
+
*/
|
|
85
|
+
export declare function buildIncrementalAuthPage(params: {
|
|
86
|
+
app: AppAuthCard;
|
|
87
|
+
toolId: string;
|
|
88
|
+
sessionHint: string;
|
|
89
|
+
callbackPath: string;
|
|
90
|
+
}): string;
|
|
91
|
+
/**
|
|
92
|
+
* Build federated login page for multi-provider selection
|
|
93
|
+
*/
|
|
94
|
+
export declare function buildFederatedLoginPage(params: {
|
|
95
|
+
providers: ProviderCard[];
|
|
96
|
+
clientName: string;
|
|
97
|
+
pendingAuthId: string;
|
|
98
|
+
csrfToken: string;
|
|
99
|
+
callbackPath: string;
|
|
100
|
+
}): string;
|
|
101
|
+
/**
|
|
102
|
+
* Build consent page for tool selection
|
|
103
|
+
*/
|
|
104
|
+
export declare function buildToolConsentPage(params: {
|
|
105
|
+
tools: ToolCard[];
|
|
106
|
+
clientName: string;
|
|
107
|
+
pendingAuthId: string;
|
|
108
|
+
csrfToken: string;
|
|
109
|
+
callbackPath: string;
|
|
110
|
+
userName?: string;
|
|
111
|
+
userEmail?: string;
|
|
112
|
+
}): string;
|
|
113
|
+
/**
|
|
114
|
+
* Build simple login page
|
|
115
|
+
*/
|
|
116
|
+
export declare function buildLoginPage(params: {
|
|
117
|
+
clientName: string;
|
|
118
|
+
scope: string;
|
|
119
|
+
pendingAuthId: string;
|
|
120
|
+
callbackPath: string;
|
|
121
|
+
}): string;
|
|
122
|
+
/**
|
|
123
|
+
* Build error page
|
|
124
|
+
*/
|
|
125
|
+
export declare function buildErrorPage(params: {
|
|
126
|
+
error: string;
|
|
127
|
+
description: string;
|
|
128
|
+
}): string;
|
|
129
|
+
/**
|
|
130
|
+
* Simple wrapper for compatibility - just returns the HTML string
|
|
131
|
+
* (HTMX templates are already complete HTML documents)
|
|
132
|
+
*/
|
|
133
|
+
export declare function renderToHtml(html: string, _options?: {
|
|
134
|
+
title?: string;
|
|
135
|
+
}): string;
|