veryfront 0.1.128 → 0.1.129
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/esm/cli/router.d.ts +0 -5
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +30 -2
- package/esm/cli/shared/update-check.d.ts +4 -0
- package/esm/cli/shared/update-check.d.ts.map +1 -0
- package/esm/cli/shared/update-check.js +97 -0
- package/esm/deno.d.ts +5 -0
- package/esm/deno.js +13 -8
- package/esm/src/channels/control-plane.d.ts.map +1 -1
- package/esm/src/channels/control-plane.js +5 -5
- package/esm/src/channels/invoke.d.ts +1 -1
- package/esm/src/channels/invoke.d.ts.map +1 -1
- package/esm/src/channels/invoke.js +6 -6
- package/esm/src/chat/index.d.ts +12 -24
- package/esm/src/chat/index.d.ts.map +1 -1
- package/esm/src/chat/index.js +5 -25
- package/esm/src/config/env.d.ts.map +1 -1
- package/esm/src/config/env.js +18 -10
- package/esm/src/data/static-data-fetcher.d.ts +3 -0
- package/esm/src/data/static-data-fetcher.d.ts.map +1 -1
- package/esm/src/data/static-data-fetcher.js +29 -25
- package/esm/src/data/static-paths-fetcher.d.ts.map +1 -1
- package/esm/src/data/static-paths-fetcher.js +3 -2
- package/esm/src/errors/logging.d.ts.map +1 -1
- package/esm/src/errors/logging.js +16 -7
- package/esm/src/errors/user-friendly/error-formatter.d.ts.map +1 -1
- package/esm/src/errors/user-friendly/error-formatter.js +9 -25
- package/esm/src/fs/index.d.ts +11 -12
- package/esm/src/fs/index.d.ts.map +1 -1
- package/esm/src/fs/index.js +11 -24
- package/esm/src/html/dev-scripts.d.ts.map +1 -1
- package/esm/src/html/dev-scripts.js +5 -8
- package/esm/src/html/html-escape.d.ts +1 -0
- package/esm/src/html/html-escape.d.ts.map +1 -1
- package/esm/src/html/html-escape.js +3 -0
- package/esm/src/html/html-injection.js +2 -2
- package/esm/src/html/html-shell-generator.d.ts +5 -2
- package/esm/src/html/html-shell-generator.d.ts.map +1 -1
- package/esm/src/html/html-shell-generator.js +41 -30
- package/esm/src/html/hydration-script-builder/dev-client-renderer.js +2 -2
- package/esm/src/html/hydration-script-builder/dev-component-manifest.js +2 -2
- package/esm/src/html/hydration-script-builder/dev-error-logger.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/dev-error-logger.js +2 -6
- package/esm/src/html/hydration-script-builder/dev-scripts.js +2 -2
- package/esm/src/html/hydration-script-builder/hydration-data-generator.d.ts +3 -1
- package/esm/src/html/hydration-script-builder/hydration-data-generator.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/hydration-data-generator.js +2 -2
- package/esm/src/html/hydration-script-builder/index.d.ts +1 -1
- package/esm/src/html/hydration-script-builder/index.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/index.js +1 -1
- package/esm/src/html/hydration-script-builder/prod-hydration.js +2 -2
- package/esm/src/html/hydration-script-builder/prod-scripts.d.ts +2 -0
- package/esm/src/html/hydration-script-builder/prod-scripts.d.ts.map +1 -1
- package/esm/src/html/hydration-script-builder/prod-scripts.js +14 -14
- package/esm/src/html/schemas/html.schema.d.ts +2 -0
- package/esm/src/html/schemas/html.schema.d.ts.map +1 -1
- package/esm/src/html/schemas/html.schema.js +2 -0
- package/esm/src/html/styles-builder/css-pregeneration.d.ts +17 -1
- package/esm/src/html/styles-builder/css-pregeneration.d.ts.map +1 -1
- package/esm/src/html/styles-builder/css-pregeneration.js +103 -1
- package/esm/src/html/styles-builder/dev-styles.js +2 -2
- package/esm/src/html/utils.d.ts +2 -0
- package/esm/src/html/utils.d.ts.map +1 -1
- package/esm/src/html/utils.js +49 -28
- package/esm/src/integrations/remote-tools.d.ts.map +1 -1
- package/esm/src/integrations/remote-tools.js +32 -39
- package/esm/src/internal-agents/ag-ui-sse.d.ts +0 -1
- package/esm/src/internal-agents/ag-ui-sse.d.ts.map +1 -1
- package/esm/src/internal-agents/ag-ui-sse.js +2 -16
- package/esm/src/internal-agents/control-plane-auth.d.ts.map +1 -1
- package/esm/src/internal-agents/control-plane-auth.js +5 -3
- package/esm/src/internal-agents/request-body.d.ts.map +1 -1
- package/esm/src/internal-agents/request-body.js +6 -3
- package/esm/src/internal-agents/session-manager.d.ts +1 -0
- package/esm/src/internal-agents/session-manager.d.ts.map +1 -1
- package/esm/src/internal-agents/session-manager.js +12 -18
- package/esm/src/issues/core.d.ts.map +1 -1
- package/esm/src/issues/core.js +24 -23
- package/esm/src/issues/schemas/issue.schema.d.ts.map +1 -1
- package/esm/src/issues/schemas/issue.schema.js +2 -1
- package/esm/src/jobs/runtime-env.d.ts.map +1 -1
- package/esm/src/jobs/runtime-env.js +21 -44
- package/esm/src/markdown/index.d.ts +1 -2
- package/esm/src/markdown/index.d.ts.map +1 -1
- package/esm/src/markdown/index.js +1 -6
- package/esm/src/mcp/server.d.ts +0 -1
- package/esm/src/mcp/server.d.ts.map +1 -1
- package/esm/src/mcp/server.js +40 -41
- package/esm/src/mdx/index.d.ts +3 -2
- package/esm/src/mdx/index.d.ts.map +1 -1
- package/esm/src/mdx/index.js +3 -5
- package/esm/src/middleware/builtin/logger.d.ts.map +1 -1
- package/esm/src/middleware/builtin/logger.js +31 -28
- package/esm/src/middleware/builtin/security/rate-limit.d.ts.map +1 -1
- package/esm/src/middleware/builtin/security/rate-limit.js +17 -12
- package/esm/src/middleware/builtin/timeout.d.ts.map +1 -1
- package/esm/src/middleware/builtin/timeout.js +17 -10
- package/esm/src/modules/import-map/default-import-map.d.ts.map +1 -1
- package/esm/src/modules/import-map/default-import-map.js +4 -3
- package/esm/src/oauth/handlers/callback-handler.d.ts +0 -5
- package/esm/src/oauth/handlers/callback-handler.d.ts.map +1 -1
- package/esm/src/oauth/handlers/callback-handler.js +9 -14
- package/esm/src/oauth/handlers/index.d.ts +1 -1
- package/esm/src/oauth/handlers/index.js +1 -1
- package/esm/src/oauth/handlers/init-handler.d.ts.map +1 -1
- package/esm/src/oauth/handlers/init-handler.js +32 -20
- package/esm/src/oauth/providers/index.d.ts +1 -1
- package/esm/src/oauth/providers/index.js +1 -1
- package/esm/src/oauth/schemas/index.d.ts +1 -1
- package/esm/src/oauth/schemas/index.js +1 -1
- package/esm/src/oauth/token-store/index.d.ts +1 -1
- package/esm/src/oauth/token-store/index.js +1 -1
- package/esm/src/oauth/token-store/memory.d.ts +1 -1
- package/esm/src/oauth/token-store/memory.d.ts.map +1 -1
- package/esm/src/oauth/token-store/memory.js +8 -8
- package/esm/src/observability/request-profiler.d.ts +31 -0
- package/esm/src/observability/request-profiler.d.ts.map +1 -0
- package/esm/src/observability/request-profiler.js +94 -0
- package/esm/src/observability/tracing/otlp-setup.d.ts.map +1 -1
- package/esm/src/observability/tracing/otlp-setup.js +16 -21
- package/esm/src/prompt/factory.d.ts.map +1 -1
- package/esm/src/prompt/factory.js +10 -12
- package/esm/src/prompt/registry.d.ts.map +1 -1
- package/esm/src/prompt/registry.js +12 -10
- package/esm/src/prompt/schemas/prompt.schema.d.ts.map +1 -1
- package/esm/src/prompt/schemas/prompt.schema.js +0 -2
- package/esm/src/prompt/types.d.ts +1 -1
- package/esm/src/prompt/types.d.ts.map +1 -1
- package/esm/src/provider/local/ai-sdk-adapter.d.ts.map +1 -1
- package/esm/src/provider/local/ai-sdk-adapter.js +3 -8
- package/esm/src/provider/local/env.d.ts +4 -6
- package/esm/src/provider/local/env.d.ts.map +1 -1
- package/esm/src/provider/local/env.js +14 -1
- package/esm/src/provider/local/local-engine.d.ts.map +1 -1
- package/esm/src/provider/local/local-engine.js +2 -7
- package/esm/src/provider/model-registry.d.ts.map +1 -1
- package/esm/src/provider/model-registry.js +2 -7
- package/esm/src/provider/veryfront-cloud/provider.d.ts.map +1 -1
- package/esm/src/provider/veryfront-cloud/provider.js +1 -7
- package/esm/src/provider/veryfront-cloud/shared.d.ts.map +1 -1
- package/esm/src/provider/veryfront-cloud/shared.js +9 -11
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +56 -57
- package/esm/src/react/compat/hooks-adapter.d.ts +1 -7
- package/esm/src/react/compat/hooks-adapter.d.ts.map +1 -1
- package/esm/src/react/compat/hooks-adapter.js +35 -40
- package/esm/src/react/components/Head.d.ts +1 -26
- package/esm/src/react/components/Head.d.ts.map +1 -1
- package/esm/src/react/components/Head.js +1 -172
- package/esm/src/react/context/index.d.ts +2 -46
- package/esm/src/react/context/index.d.ts.map +1 -1
- package/esm/src/react/context/index.js +1 -44
- package/esm/src/react/head-collector.d.ts +1 -10
- package/esm/src/react/head-collector.d.ts.map +1 -1
- package/esm/src/react/head-collector.js +4 -0
- package/esm/src/react/router/index.d.ts +2 -45
- package/esm/src/react/router/index.d.ts.map +1 -1
- package/esm/src/react/router/index.js +1 -49
- package/esm/src/react/runtime/core.d.ts +49 -0
- package/esm/src/react/runtime/core.d.ts.map +1 -0
- package/esm/src/react/runtime/core.js +200 -0
- package/esm/src/rendering/orchestrator/html.d.ts +2 -0
- package/esm/src/rendering/orchestrator/html.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/html.js +69 -12
- package/esm/src/rendering/orchestrator/ssr-orchestrator.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/ssr-orchestrator.js +4 -0
- package/esm/src/rendering/orchestrator/types.d.ts +4 -0
- package/esm/src/rendering/orchestrator/types.d.ts.map +1 -1
- package/esm/src/repositories/types.d.ts.map +1 -1
- package/esm/src/resource/factory.d.ts.map +1 -1
- package/esm/src/resource/factory.js +12 -9
- package/esm/src/resource/registry.d.ts +3 -3
- package/esm/src/resource/registry.d.ts.map +1 -1
- package/esm/src/resource/registry.js +7 -7
- package/esm/src/schemas/common.d.ts.map +1 -1
- package/esm/src/schemas/common.js +7 -4
- package/esm/src/security/http/config.d.ts +0 -1
- package/esm/src/security/http/config.d.ts.map +1 -1
- package/esm/src/security/http/config.js +3 -16
- package/esm/src/security/http/response/security-handler.d.ts +1 -0
- package/esm/src/security/http/response/security-handler.d.ts.map +1 -1
- package/esm/src/security/http/response/security-handler.js +17 -12
- package/esm/src/security/index.d.ts +4 -2
- package/esm/src/security/index.d.ts.map +1 -1
- package/esm/src/security/index.js +3 -1
- package/esm/src/server/handlers/dev/styles-css.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/dev/styles-css.handler.js +8 -7
- package/esm/src/server/handlers/monitoring/metrics.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/monitoring/metrics.handler.js +3 -1
- package/esm/src/server/handlers/request/module/module-server-handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/module/module-server-handler.js +18 -15
- package/esm/src/server/handlers/request/prod-hydration-module.handler.d.ts +8 -0
- package/esm/src/server/handlers/request/prod-hydration-module.handler.d.ts.map +1 -0
- package/esm/src/server/handlers/request/prod-hydration-module.handler.js +41 -0
- package/esm/src/server/handlers/request/ssr/ssr.handler.d.ts.map +1 -1
- package/esm/src/server/handlers/request/ssr/ssr.handler.js +3 -0
- package/esm/src/server/production-server.d.ts.map +1 -1
- package/esm/src/server/production-server.js +65 -0
- package/esm/src/server/runtime-handler/handler-context-builder.d.ts +1 -1
- package/esm/src/server/runtime-handler/handler-context-builder.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.d.ts +1 -1
- package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/index.js +36 -11
- package/esm/src/server/runtime-handler/request-utils.d.ts +7 -0
- package/esm/src/server/runtime-handler/request-utils.d.ts.map +1 -1
- package/esm/src/server/runtime-handler/request-utils.js +10 -0
- package/esm/src/server/services/rendering/ssr.service.d.ts +1 -0
- package/esm/src/server/services/rendering/ssr.service.d.ts.map +1 -1
- package/esm/src/server/services/rendering/ssr.service.js +12 -5
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +1 -1
- package/esm/src/skill/allowed-tools.d.ts +3 -8
- package/esm/src/skill/allowed-tools.d.ts.map +1 -1
- package/esm/src/skill/executor.js +2 -2
- package/esm/src/skill/parser.d.ts.map +1 -1
- package/esm/src/skill/parser.js +12 -12
- package/esm/src/skill/path-safety.js +1 -1
- package/esm/src/skill/tools.d.ts.map +1 -1
- package/esm/src/skill/tools.js +18 -11
- package/esm/src/studio/bridge/bridge-bundle.generated.d.ts.map +1 -1
- package/esm/src/studio/bridge/bridge-bundle.generated.js +1 -1
- package/esm/src/task/discovery.d.ts.map +1 -1
- package/esm/src/task/discovery.js +73 -95
- package/esm/src/tool/executor.d.ts.map +1 -1
- package/esm/src/tool/executor.js +8 -7
- package/esm/src/tool/factory.d.ts.map +1 -1
- package/esm/src/tool/factory.js +13 -16
- package/esm/src/transforms/esm/package-registry.d.ts +4 -0
- package/esm/src/transforms/esm/package-registry.d.ts.map +1 -1
- package/esm/src/transforms/esm/package-registry.js +34 -17
- package/esm/src/transforms/import-rewriter/strategies/veryfront-strategy.d.ts.map +1 -1
- package/esm/src/transforms/import-rewriter/strategies/veryfront-strategy.js +2 -1
- package/esm/src/transforms/mdx/esm-module-loader/cache-format.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/cache-format.js +26 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/index.js +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.d.ts +1 -0
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.d.ts.map +1 -1
- package/esm/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.js +3 -0
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/index.d.ts +1 -1
- package/esm/src/transforms/pipeline/stages/ssr-vf-modules/index.js +1 -1
- package/esm/src/transforms/veryfront-module-urls.d.ts.map +1 -1
- package/esm/src/transforms/veryfront-module-urls.js +7 -3
- package/esm/src/types/entities/getEntityInfo.d.ts.map +1 -1
- package/esm/src/types/entities/getEntityInfo.js +79 -127
- package/esm/src/utils/path-utils.d.ts +1 -1
- package/esm/src/utils/path-utils.d.ts.map +1 -1
- package/esm/src/utils/path-utils.js +16 -7
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/esm/src/utils/version.d.ts.map +1 -1
- package/esm/src/utils/version.js +0 -1
- package/esm/src/workflow/worker/dynamic-job-entrypoint.d.ts.map +1 -1
- package/esm/src/workflow/worker/dynamic-job-entrypoint.js +5 -72
- package/esm/src/workflow/worker/job-entrypoint.d.ts.map +1 -1
- package/esm/src/workflow/worker/job-entrypoint.js +5 -72
- package/esm/src/workflow/worker/shared.d.ts +18 -0
- package/esm/src/workflow/worker/shared.d.ts.map +1 -0
- package/esm/src/workflow/worker/shared.js +77 -0
- package/package.json +1 -1
- package/src/cli/router.ts +41 -2
- package/src/cli/shared/update-check.ts +110 -0
- package/src/deno.js +13 -8
- package/src/src/channels/control-plane.ts +6 -10
- package/src/src/channels/invoke.ts +7 -7
- package/src/src/chat/index.ts +96 -132
- package/src/src/config/env.ts +24 -11
- package/src/src/data/static-data-fetcher.ts +59 -34
- package/src/src/data/static-paths-fetcher.ts +4 -2
- package/src/src/errors/logging.ts +21 -7
- package/src/src/errors/user-friendly/error-formatter.ts +14 -29
- package/src/src/fs/index.ts +21 -30
- package/src/src/html/dev-scripts.ts +5 -9
- package/src/src/html/html-escape.ts +4 -0
- package/src/src/html/html-injection.ts +2 -2
- package/src/src/html/html-shell-generator.ts +60 -26
- package/src/src/html/hydration-script-builder/dev-client-renderer.ts +2 -2
- package/src/src/html/hydration-script-builder/dev-component-manifest.ts +2 -2
- package/src/src/html/hydration-script-builder/dev-error-logger.ts +2 -8
- package/src/src/html/hydration-script-builder/dev-scripts.ts +2 -2
- package/src/src/html/hydration-script-builder/hydration-data-generator.ts +2 -1
- package/src/src/html/hydration-script-builder/index.ts +5 -1
- package/src/src/html/hydration-script-builder/prod-hydration.ts +2 -2
- package/src/src/html/hydration-script-builder/prod-scripts.ts +16 -15
- package/src/src/html/schemas/html.schema.ts +2 -0
- package/src/src/html/styles-builder/css-pregeneration.ts +133 -1
- package/src/src/html/styles-builder/dev-styles.ts +2 -2
- package/src/src/html/utils.ts +62 -29
- package/src/src/integrations/remote-tools.ts +39 -37
- package/src/src/internal-agents/ag-ui-sse.ts +2 -17
- package/src/src/internal-agents/control-plane-auth.ts +8 -6
- package/src/src/internal-agents/request-body.ts +7 -5
- package/src/src/internal-agents/session-manager.ts +16 -20
- package/src/src/issues/core.ts +24 -27
- package/src/src/issues/schemas/issue.schema.ts +3 -1
- package/src/src/jobs/runtime-env.ts +24 -50
- package/src/src/markdown/index.ts +5 -8
- package/src/src/mcp/server.ts +50 -53
- package/src/src/mdx/index.ts +7 -8
- package/src/src/middleware/builtin/logger.ts +44 -29
- package/src/src/middleware/builtin/security/rate-limit.ts +20 -11
- package/src/src/middleware/builtin/timeout.ts +22 -13
- package/src/src/modules/import-map/default-import-map.ts +4 -3
- package/src/src/oauth/handlers/callback-handler.ts +9 -16
- package/src/src/oauth/handlers/index.ts +1 -1
- package/src/src/oauth/handlers/init-handler.ts +56 -27
- package/src/src/oauth/providers/index.ts +1 -1
- package/src/src/oauth/schemas/index.ts +1 -1
- package/src/src/oauth/token-store/index.ts +1 -1
- package/src/src/oauth/token-store/memory.ts +8 -8
- package/src/src/observability/request-profiler.ts +140 -0
- package/src/src/observability/tracing/otlp-setup.ts +16 -22
- package/src/src/prompt/factory.ts +16 -14
- package/src/src/prompt/registry.ts +14 -13
- package/src/src/prompt/schemas/prompt.schema.ts +0 -4
- package/src/src/prompt/types.ts +1 -2
- package/src/src/provider/local/ai-sdk-adapter.ts +3 -10
- package/src/src/provider/local/env.ts +22 -2
- package/src/src/provider/local/local-engine.ts +2 -9
- package/src/src/provider/model-registry.ts +2 -9
- package/src/src/provider/veryfront-cloud/provider.ts +1 -8
- package/src/src/provider/veryfront-cloud/shared.ts +12 -15
- package/src/src/proxy/handler.ts +90 -74
- package/src/src/react/compat/hooks-adapter.ts +43 -44
- package/src/src/react/components/Head.tsx +1 -181
- package/src/src/react/context/index.tsx +2 -83
- package/src/src/react/head-collector.ts +9 -0
- package/src/src/react/router/index.tsx +2 -100
- package/src/src/react/runtime/core.ts +303 -0
- package/src/src/rendering/orchestrator/html.ts +122 -18
- package/src/src/rendering/orchestrator/ssr-orchestrator.ts +8 -0
- package/src/src/rendering/orchestrator/types.ts +4 -0
- package/src/src/repositories/types.ts +0 -4
- package/src/src/resource/factory.ts +15 -11
- package/src/src/resource/registry.ts +7 -7
- package/src/src/schemas/common.ts +8 -5
- package/src/src/security/http/config.ts +3 -19
- package/src/src/security/http/response/security-handler.ts +22 -13
- package/src/src/security/index.ts +4 -7
- package/src/src/server/handlers/dev/styles-css.handler.ts +32 -14
- package/src/src/server/handlers/monitoring/metrics.handler.ts +3 -1
- package/src/src/server/handlers/request/module/module-server-handler.ts +24 -17
- package/src/src/server/handlers/request/prod-hydration-module.handler.ts +61 -0
- package/src/src/server/handlers/request/ssr/ssr.handler.ts +3 -0
- package/src/src/server/production-server.ts +84 -0
- package/src/src/server/runtime-handler/handler-context-builder.ts +1 -1
- package/src/src/server/runtime-handler/index.ts +44 -13
- package/src/src/server/runtime-handler/request-utils.ts +11 -0
- package/src/src/server/services/rendering/ssr.service.ts +31 -18
- package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +1 -1
- package/src/src/skill/allowed-tools.ts +1 -8
- package/src/src/skill/executor.ts +2 -2
- package/src/src/skill/parser.ts +13 -20
- package/src/src/skill/path-safety.ts +1 -1
- package/src/src/skill/tools.ts +27 -20
- package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
- package/src/src/task/discovery.ts +97 -97
- package/src/src/tool/executor.ts +10 -8
- package/src/src/tool/factory.ts +21 -22
- package/src/src/tool/types.ts +0 -17
- package/src/src/transforms/esm/package-registry.ts +52 -20
- package/src/src/transforms/import-rewriter/strategies/veryfront-strategy.ts +2 -1
- package/src/src/transforms/mdx/esm-module-loader/cache-format.ts +34 -1
- package/src/src/transforms/mdx/esm-module-loader/module-fetcher/index.ts +1 -1
- package/src/src/transforms/mdx/esm-module-loader/module-fetcher/render-sessions.ts +4 -0
- package/src/src/transforms/pipeline/stages/ssr-vf-modules/index.ts +1 -1
- package/src/src/transforms/veryfront-module-urls.ts +6 -2
- package/src/src/types/entities/getEntityInfo.ts +131 -152
- package/src/src/utils/path-utils.ts +16 -7
- package/src/src/utils/version-constant.ts +1 -1
- package/src/src/utils/version.ts +0 -1
- package/src/src/workflow/worker/dynamic-job-entrypoint.ts +18 -84
- package/src/src/workflow/worker/job-entrypoint.ts +18 -85
- package/src/src/workflow/worker/shared.ts +127 -0
- package/esm/src/prompt/schemas/index.d.ts +0 -7
- package/esm/src/prompt/schemas/index.d.ts.map +0 -1
- package/esm/src/prompt/schemas/index.js +0 -6
- package/esm/src/security/http/handlers-index.d.ts +0 -5
- package/esm/src/security/http/handlers-index.d.ts.map +0 -1
- package/esm/src/security/http/handlers-index.js +0 -3
- package/src/src/prompt/schemas/index.ts +0 -7
- package/src/src/security/http/handlers-index.ts +0 -4
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import * as dntShim from "../../../_dnt.shims.js";
|
|
2
|
+
import React, { useEffect } from "react";
|
|
3
|
+
const defaultRouter = {
|
|
4
|
+
domain: "",
|
|
5
|
+
path: "/",
|
|
6
|
+
pathname: "/",
|
|
7
|
+
params: {},
|
|
8
|
+
query: {},
|
|
9
|
+
isPreview: false,
|
|
10
|
+
isMounted: false,
|
|
11
|
+
navigate: async () => { },
|
|
12
|
+
push: async () => { },
|
|
13
|
+
replace: async () => { },
|
|
14
|
+
reload: async () => { },
|
|
15
|
+
};
|
|
16
|
+
const defaultPageContext = {
|
|
17
|
+
slug: "/",
|
|
18
|
+
path: "/",
|
|
19
|
+
params: {},
|
|
20
|
+
query: {},
|
|
21
|
+
frontmatter: {},
|
|
22
|
+
headings: [],
|
|
23
|
+
mdxHeadings: [],
|
|
24
|
+
};
|
|
25
|
+
const ROUTER_CONTEXT_SYMBOL = Symbol.for("veryfront.react.router-context");
|
|
26
|
+
const PAGE_CONTEXT_SYMBOL = Symbol.for("veryfront.react.page-context");
|
|
27
|
+
const HEAD_COLLECTOR_SYMBOL = Symbol.for("veryfront.react.collect-head");
|
|
28
|
+
const globalRouterContext = dntShim.dntGlobalThis;
|
|
29
|
+
const globalPageContext = dntShim.dntGlobalThis;
|
|
30
|
+
const RouterContext = globalRouterContext[ROUTER_CONTEXT_SYMBOL] ??
|
|
31
|
+
(globalRouterContext[ROUTER_CONTEXT_SYMBOL] = React.createContext(defaultRouter));
|
|
32
|
+
const PageContextContext = globalPageContext[PAGE_CONTEXT_SYMBOL] ??
|
|
33
|
+
(globalPageContext[PAGE_CONTEXT_SYMBOL] = React.createContext(defaultPageContext));
|
|
34
|
+
function isServerEnvironment() {
|
|
35
|
+
const ssrFlag = dntShim.dntGlobalThis.__VERYFRONT_SSR__;
|
|
36
|
+
if (ssrFlag === true)
|
|
37
|
+
return true;
|
|
38
|
+
return typeof dntShim.dntGlobalThis === "undefined";
|
|
39
|
+
}
|
|
40
|
+
function getDocumentNonce() {
|
|
41
|
+
if (typeof document === "undefined")
|
|
42
|
+
return undefined;
|
|
43
|
+
const element = document.querySelector("script[nonce], style[nonce], link[nonce]");
|
|
44
|
+
if (!element)
|
|
45
|
+
return undefined;
|
|
46
|
+
const nonce = element.nonce || element.getAttribute("nonce") || "";
|
|
47
|
+
return nonce || undefined;
|
|
48
|
+
}
|
|
49
|
+
function collectHead(data) {
|
|
50
|
+
const collector = dntShim.dntGlobalThis[HEAD_COLLECTOR_SYMBOL];
|
|
51
|
+
collector?.(data);
|
|
52
|
+
}
|
|
53
|
+
export function RouterProvider({ children, router, }) {
|
|
54
|
+
return React.createElement(RouterContext.Provider, { value: router ?? defaultRouter }, children);
|
|
55
|
+
}
|
|
56
|
+
export function useRouter() {
|
|
57
|
+
return React.useContext(RouterContext);
|
|
58
|
+
}
|
|
59
|
+
export function Link({ prefetch = true, children, ...rest }) {
|
|
60
|
+
return React.createElement("a", { ...rest, "data-prefetch": prefetch ? "true" : undefined }, children);
|
|
61
|
+
}
|
|
62
|
+
export function PageContextProvider({ children, pageContext, }) {
|
|
63
|
+
return React.createElement(PageContextContext.Provider, { value: pageContext ?? defaultPageContext }, children);
|
|
64
|
+
}
|
|
65
|
+
export function usePageContext() {
|
|
66
|
+
return React.useContext(PageContextContext);
|
|
67
|
+
}
|
|
68
|
+
export function Head({ children }) {
|
|
69
|
+
const isSSR = isServerEnvironment();
|
|
70
|
+
if (isSSR && children) {
|
|
71
|
+
React.Children.forEach(children, (child) => {
|
|
72
|
+
if (!React.isValidElement(child))
|
|
73
|
+
return;
|
|
74
|
+
const { type } = child;
|
|
75
|
+
const props = child.props;
|
|
76
|
+
if (typeof type !== "string" || type === "body")
|
|
77
|
+
return;
|
|
78
|
+
if (type === "title") {
|
|
79
|
+
collectHead({ title: String(props.children ?? "") });
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (type === "meta") {
|
|
83
|
+
collectHead({
|
|
84
|
+
metas: [{
|
|
85
|
+
name: props.name,
|
|
86
|
+
property: props.property,
|
|
87
|
+
content: String(props.content ?? ""),
|
|
88
|
+
}],
|
|
89
|
+
});
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (type === "link") {
|
|
93
|
+
const link = {};
|
|
94
|
+
for (const [key, value] of Object.entries(props)) {
|
|
95
|
+
if (value != null)
|
|
96
|
+
link[key] = String(value);
|
|
97
|
+
}
|
|
98
|
+
collectHead({ links: [link] });
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
if (type === "style") {
|
|
102
|
+
collectHead({ styles: [String(props.children ?? "")] });
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (type === "script") {
|
|
106
|
+
const script = {};
|
|
107
|
+
for (const [key, value] of Object.entries(props)) {
|
|
108
|
+
if (key === "children" || key === "dangerouslySetInnerHTML")
|
|
109
|
+
continue;
|
|
110
|
+
if (value != null)
|
|
111
|
+
script[key] = String(value);
|
|
112
|
+
}
|
|
113
|
+
if (props.dangerouslySetInnerHTML) {
|
|
114
|
+
const html = props.dangerouslySetInnerHTML;
|
|
115
|
+
if (html.__html)
|
|
116
|
+
script.content = html.__html;
|
|
117
|
+
}
|
|
118
|
+
else if (typeof props.children === "string") {
|
|
119
|
+
script.content = props.children;
|
|
120
|
+
}
|
|
121
|
+
collectHead({ scripts: [script] });
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
useEffect(() => {
|
|
126
|
+
if (!children)
|
|
127
|
+
return;
|
|
128
|
+
const addedElements = [];
|
|
129
|
+
const nonce = getDocumentNonce();
|
|
130
|
+
React.Children.forEach(children, (child) => {
|
|
131
|
+
if (!React.isValidElement(child))
|
|
132
|
+
return;
|
|
133
|
+
const { type } = child;
|
|
134
|
+
const props = child.props;
|
|
135
|
+
if (typeof type !== "string" || type === "body")
|
|
136
|
+
return;
|
|
137
|
+
if (type === "title") {
|
|
138
|
+
document.title = String(props.children ?? "");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const element = document.createElement(type);
|
|
142
|
+
if ((type === "style" || type === "script") && !props.nonce && nonce) {
|
|
143
|
+
element.setAttribute("nonce", nonce);
|
|
144
|
+
}
|
|
145
|
+
if (type === "script") {
|
|
146
|
+
const src = props.src;
|
|
147
|
+
const id = props.id;
|
|
148
|
+
if (id && document.querySelector(`script[data-vf-head][id="${id}"]`))
|
|
149
|
+
return;
|
|
150
|
+
if (src && document.querySelector(`script[data-vf-head][src="${src}"]`))
|
|
151
|
+
return;
|
|
152
|
+
const content = typeof props.children === "string"
|
|
153
|
+
? props.children
|
|
154
|
+
: props.dangerouslySetInnerHTML?.__html;
|
|
155
|
+
if (content && !id) {
|
|
156
|
+
let sum = 0;
|
|
157
|
+
for (let i = 0; i < Math.min(content.length, 200); i++) {
|
|
158
|
+
sum = ((sum << 5) - sum + content.charCodeAt(i)) | 0;
|
|
159
|
+
}
|
|
160
|
+
const hash = `vf${Math.abs(sum).toString(36)}`;
|
|
161
|
+
if (document.querySelector(`script[data-vf-head][data-vf-hash="${hash}"]`))
|
|
162
|
+
return;
|
|
163
|
+
element.setAttribute("data-vf-hash", hash);
|
|
164
|
+
}
|
|
165
|
+
element.setAttribute("data-vf-head", "true");
|
|
166
|
+
}
|
|
167
|
+
for (const [key, value] of Object.entries(props)) {
|
|
168
|
+
if (key === "children")
|
|
169
|
+
continue;
|
|
170
|
+
let attrName = key;
|
|
171
|
+
if (key === "className")
|
|
172
|
+
attrName = "class";
|
|
173
|
+
else if (key === "htmlFor")
|
|
174
|
+
attrName = "for";
|
|
175
|
+
if (typeof value === "boolean") {
|
|
176
|
+
if (value)
|
|
177
|
+
element.setAttribute(attrName, "");
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (value != null)
|
|
181
|
+
element.setAttribute(attrName, String(value));
|
|
182
|
+
}
|
|
183
|
+
if (typeof props.children === "string") {
|
|
184
|
+
element.textContent = props.children;
|
|
185
|
+
}
|
|
186
|
+
element.setAttribute("data-veryfront-managed", "1");
|
|
187
|
+
document.head.appendChild(element);
|
|
188
|
+
addedElements.push(element);
|
|
189
|
+
});
|
|
190
|
+
return () => {
|
|
191
|
+
for (const el of addedElements)
|
|
192
|
+
el.remove();
|
|
193
|
+
};
|
|
194
|
+
}, [children]);
|
|
195
|
+
return React.createElement("div", {
|
|
196
|
+
"data-veryfront-head": "1",
|
|
197
|
+
style: { display: "none" },
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
export { RouterProvider as Router };
|
|
@@ -32,6 +32,8 @@ export declare class HTMLGenerator {
|
|
|
32
32
|
private detectUseClientDirective;
|
|
33
33
|
private wrapHTMLFragment;
|
|
34
34
|
private generateShellParts;
|
|
35
|
+
private startProjectCSSPreparation;
|
|
36
|
+
private startPreparedCSSWarmup;
|
|
35
37
|
private buildHeadElements;
|
|
36
38
|
private mergeFrontmatter;
|
|
37
39
|
private resolveAppPath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAS7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EAET,UAAU,EACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/html.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAS7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,SAAS,EAET,UAAU,EACX,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA2HhD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,SAAS,GAAG,SAAS,CAAC;IACpC,aAAa,EAAE,UAAU,EAAE,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIjC,gBAAgB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAajE,kBAAkB,CACtB,WAAW,EAAE,cAAc,EAC3B,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,cAAc,CAAC;YAgDZ,sBAAsB;YAiCtB,wBAAwB;YAmBxB,gBAAgB;YAyBhB,kBAAkB;IAwDhC,OAAO,CAAC,0BAA0B;IAsBlC,OAAO,CAAC,sBAAsB;IAgD9B,OAAO,CAAC,iBAAiB;IA4DzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;YAQR,eAAe;YAaf,gBAAgB;IAgF9B;;;;OAIG;YACW,gBAAgB;IA2D9B,OAAO,CAAC,wBAAwB;IAqBhC,OAAO,CAAC,qBAAqB;YAOf,6BAA6B;CAyD5C"}
|
|
@@ -8,7 +8,10 @@ import { computeSourceHash } from "../../studio/hash-utils.js";
|
|
|
8
8
|
import { extractRelativePath } from "../../utils/route-path-utils.js";
|
|
9
9
|
import { resolveAppComponentPath } from "../layouts/utils/app-resolver.js";
|
|
10
10
|
import { StreamTimeoutError, streamToString } from "../utils/stream-utils.js";
|
|
11
|
+
import { profilePhase, profileSyncPhase } from "../../observability/request-profiler.js";
|
|
11
12
|
import { normalizeCssModuleKey, rewriteCssModuleContent, } from "../../transforms/css-modules/naming.js";
|
|
13
|
+
import { getProjectCSS } from "../../html/styles-builder/index.js";
|
|
14
|
+
import { warmPreparedCSSArtifactFromFiles } from "../../html/styles-builder/css-pregeneration.js";
|
|
12
15
|
import { getRouteCandidates } from "./css-candidate-manifest.js";
|
|
13
16
|
import { resolveStyleContentVersion } from "../../html/styles-builder/content-version.js";
|
|
14
17
|
import { createStyleScopeProfile } from "../../html/styles-builder/style-scope-profile.js";
|
|
@@ -117,7 +120,9 @@ export class HTMLGenerator {
|
|
|
117
120
|
async generateHTMLStream(reactStream, context) {
|
|
118
121
|
const fullContext = context;
|
|
119
122
|
const mergedFrontmatter = this.mergeFrontmatter(fullContext);
|
|
120
|
-
const htmlOptions = await this.buildHTMLOptions(fullContext, mergedFrontmatter);
|
|
123
|
+
const htmlOptions = await profilePhase("html.build_options", () => this.buildHTMLOptions(fullContext, mergedFrontmatter));
|
|
124
|
+
const projectCSSPromise = this.startProjectCSSPreparation(fullContext, htmlOptions);
|
|
125
|
+
this.startPreparedCSSWarmup(fullContext, htmlOptions);
|
|
121
126
|
let reactContent;
|
|
122
127
|
try {
|
|
123
128
|
reactContent = (await streamToString(reactStream)).trim();
|
|
@@ -130,7 +135,7 @@ export class HTMLGenerator {
|
|
|
130
135
|
});
|
|
131
136
|
reactContent = error.partialContent.trim();
|
|
132
137
|
}
|
|
133
|
-
const { start, end } = await this.generateShellParts(fullContext, mergedFrontmatter, htmlOptions, reactContent);
|
|
138
|
+
const { start, end } = await profilePhase("html.generate_shell_parts", () => this.generateShellParts(fullContext, mergedFrontmatter, htmlOptions, reactContent, projectCSSPromise));
|
|
134
139
|
const encoder = new TextEncoder();
|
|
135
140
|
const fullHtml = addNonceToRenderedTags(`${start}${reactContent}${end}`, context.options?.nonce);
|
|
136
141
|
return new ReadableStream({
|
|
@@ -183,12 +188,14 @@ export class HTMLGenerator {
|
|
|
183
188
|
}
|
|
184
189
|
async wrapHTMLFragment(context) {
|
|
185
190
|
const mergedFrontmatter = this.mergeFrontmatter(context);
|
|
186
|
-
const htmlOptions = await this.buildHTMLOptions(context, mergedFrontmatter);
|
|
191
|
+
const htmlOptions = await profilePhase("html.build_options", () => this.buildHTMLOptions(context, mergedFrontmatter));
|
|
192
|
+
const projectCSSPromise = this.startProjectCSSPreparation(context, htmlOptions);
|
|
193
|
+
this.startPreparedCSSWarmup(context, htmlOptions);
|
|
187
194
|
const reactContent = context.html.trim();
|
|
188
|
-
const { start, end } = await this.generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent);
|
|
195
|
+
const { start, end } = await profilePhase("html.generate_shell_parts", () => this.generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent, projectCSSPromise));
|
|
189
196
|
return `${start}${reactContent}${end}`;
|
|
190
197
|
}
|
|
191
|
-
async generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent) {
|
|
198
|
+
async generateShellParts(context, mergedFrontmatter, htmlOptions, reactContent, projectCSSPromise) {
|
|
192
199
|
const head = context.collectedHead;
|
|
193
200
|
const effectiveTitle = head?.title || mergedFrontmatter.title || "Veryfront App";
|
|
194
201
|
const effectiveDescription = head?.description || mergedFrontmatter.description || "";
|
|
@@ -204,7 +211,7 @@ export class HTMLGenerator {
|
|
|
204
211
|
frontmatter: enrichedFrontmatter,
|
|
205
212
|
layoutFrontmatter: context.layoutBundle?.frontmatter,
|
|
206
213
|
ssrHash: context.ssrHash,
|
|
207
|
-
}, htmlOptions, context.options?.params, context.options?.props, reactContent);
|
|
214
|
+
}, htmlOptions, context.options?.params, context.options?.props, reactContent, projectCSSPromise);
|
|
208
215
|
const { scripts, other } = this.buildHeadElements(head);
|
|
209
216
|
if (!scripts && !other)
|
|
210
217
|
return { start, end };
|
|
@@ -225,6 +232,54 @@ export class HTMLGenerator {
|
|
|
225
232
|
}
|
|
226
233
|
return { start: modifiedStart, end };
|
|
227
234
|
}
|
|
235
|
+
startProjectCSSPreparation(context, htmlOptions) {
|
|
236
|
+
const isLocalProject = htmlOptions.isLocalProject ?? false;
|
|
237
|
+
if (isLocalProject || htmlOptions.environment !== "production")
|
|
238
|
+
return undefined;
|
|
239
|
+
const projectScope = htmlOptions.projectSlug || htmlOptions.projectId || context.slug;
|
|
240
|
+
if (!projectScope || projectScope === "default")
|
|
241
|
+
return undefined;
|
|
242
|
+
return getProjectCSS(projectScope, htmlOptions.globalCSS, new Set([...(htmlOptions.projectClasses ?? [])]), {
|
|
243
|
+
minify: true,
|
|
244
|
+
environment: htmlOptions.environment,
|
|
245
|
+
buildMode: htmlOptions.mode,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
startPreparedCSSWarmup(context, htmlOptions) {
|
|
249
|
+
const isLocalProject = htmlOptions.isLocalProject ?? false;
|
|
250
|
+
const usesPreviewStylesheet = isLocalProject || htmlOptions.environment !== "production";
|
|
251
|
+
if (!usesPreviewStylesheet)
|
|
252
|
+
return;
|
|
253
|
+
const wrappedFs = this.config.adapter.fs;
|
|
254
|
+
if (typeof wrappedFs.getUnderlyingAdapter !== "function")
|
|
255
|
+
return;
|
|
256
|
+
const fsAdapter = wrappedFs.getUnderlyingAdapter();
|
|
257
|
+
if (typeof fsAdapter.getAllSourceFiles !== "function")
|
|
258
|
+
return;
|
|
259
|
+
const projectScope = htmlOptions.projectSlug || htmlOptions.projectId || context.slug;
|
|
260
|
+
if (!projectScope || projectScope === "default")
|
|
261
|
+
return;
|
|
262
|
+
const projectVersion = this.getProjectContentVersion() ??
|
|
263
|
+
(this.config.mode === "development" ? "dev" : "unknown");
|
|
264
|
+
const styleProfile = createStyleScopeProfile(this.config.config);
|
|
265
|
+
const stylesheetPath = this.config.config?.tailwind?.stylesheet;
|
|
266
|
+
Promise.resolve(fsAdapter.getAllSourceFiles()).then((files) => warmPreparedCSSArtifactFromFiles({
|
|
267
|
+
projectSlug: projectScope,
|
|
268
|
+
projectVersion,
|
|
269
|
+
projectDir: this.config.projectDir,
|
|
270
|
+
files,
|
|
271
|
+
styleProfile,
|
|
272
|
+
stylesheetPath,
|
|
273
|
+
minify: true,
|
|
274
|
+
environment: "preview",
|
|
275
|
+
buildMode: "production",
|
|
276
|
+
})).catch((error) => {
|
|
277
|
+
logger.debug("Prepared CSS warmup skipped after source scan failure", {
|
|
278
|
+
projectScope,
|
|
279
|
+
error: error instanceof Error ? error.message : String(error),
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
}
|
|
228
283
|
buildHeadElements(head) {
|
|
229
284
|
if (!head)
|
|
230
285
|
return { scripts: "", other: "" };
|
|
@@ -309,14 +364,14 @@ export class HTMLGenerator {
|
|
|
309
364
|
async buildHTMLOptions(context, mergedFrontmatter) {
|
|
310
365
|
const stylesheetPath = this.config.config?.tailwind?.stylesheet || "globals.css";
|
|
311
366
|
const [appComponentPathOrNull, globalCSS] = await Promise.all([
|
|
312
|
-
this.resolveAppPath(),
|
|
313
|
-
this.loadProjectFile(stylesheetPath),
|
|
367
|
+
profilePhase("html.resolve_app_path", () => this.resolveAppPath()),
|
|
368
|
+
profilePhase("html.load_global_css", () => this.loadProjectFile(stylesheetPath)),
|
|
314
369
|
]);
|
|
315
370
|
const appComponentPath = appComponentPathOrNull ?? undefined;
|
|
316
|
-
const projectClasses = await this.extractProjectClassesForRoute(context, appComponentPath);
|
|
371
|
+
const projectClasses = await profilePhase("html.route_candidates", () => this.extractProjectClassesForRoute(context, appComponentPath));
|
|
317
372
|
// Load CSS imported by components and merge with globalCSS.
|
|
318
373
|
// Deduplicate against the configured stylesheet to avoid double-loading.
|
|
319
|
-
const combinedCSS = await this.mergeImportedCSS(globalCSS, context.cssImports, stylesheetPath);
|
|
374
|
+
const combinedCSS = await profilePhase("html.merge_imported_css", () => this.mergeImportedCSS(globalCSS, context.cssImports, stylesheetPath));
|
|
320
375
|
logger.debug("App component resolution", {
|
|
321
376
|
appComponentPath,
|
|
322
377
|
projectDir: this.config.projectDir,
|
|
@@ -329,7 +384,7 @@ export class HTMLGenerator {
|
|
|
329
384
|
const sourceHash = context.options?.studioEmbed && context.pageInfo.entity.content
|
|
330
385
|
? computeSourceHash(context.pageInfo.entity.content)
|
|
331
386
|
: undefined;
|
|
332
|
-
return {
|
|
387
|
+
return profileSyncPhase("html.build_options.finalize", () => ({
|
|
333
388
|
mode: this.config.mode,
|
|
334
389
|
config: this.config.config,
|
|
335
390
|
projectDir: this.config.projectDir,
|
|
@@ -346,6 +401,7 @@ export class HTMLGenerator {
|
|
|
346
401
|
frontmatter: mergedFrontmatter,
|
|
347
402
|
studioEmbed: context.options?.studioEmbed,
|
|
348
403
|
projectId: context.options?.projectId,
|
|
404
|
+
projectSlug: context.options?.projectSlug,
|
|
349
405
|
pageId: context.options?.pageId,
|
|
350
406
|
sourceHash,
|
|
351
407
|
colorScheme: context.options?.colorScheme,
|
|
@@ -356,7 +412,8 @@ export class HTMLGenerator {
|
|
|
356
412
|
projectClasses,
|
|
357
413
|
isLocalProject: this.config.mode === "development",
|
|
358
414
|
noHmr: context.options?.noHmr,
|
|
359
|
-
|
|
415
|
+
forceProductionScripts: context.options?.forceProductionScripts,
|
|
416
|
+
}));
|
|
360
417
|
}
|
|
361
418
|
/**
|
|
362
419
|
* Load CSS files imported by components and merge with the global stylesheet.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssr-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/ssr-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ssr-orchestrator.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/ssr-orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAIpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWhD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,cAAc,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACvC,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAUD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAInC,mBAAmB,CACvB,WAAW,EAAE,KAAK,CAAC,YAAY,EAC/B,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC,EAClE,OAAO,CAAC,EAAE,aAAa,EACvB,gBAAgB,CAAC,EAAE,mBAAmB,GACrC,OAAO,CAAC,kBAAkB,CAAC;IAqG9B;;;;;;OAMG;YACW,kBAAkB;IAiFhC,OAAO,CAAC,YAAY;CAerB"}
|
|
@@ -6,6 +6,7 @@ import { SpanNames } from "../../observability/tracing/span-names.js";
|
|
|
6
6
|
import { computeHash } from "../utils/index.js";
|
|
7
7
|
import { runWithHeadCollector } from "../../react/head-collector.js";
|
|
8
8
|
import { getWorkerPool, isSSRIsolationEnabled } from "../../security/sandbox/worker-pool.js";
|
|
9
|
+
import { endRenderSession, hasRenderSession, } from "../../transforms/mdx/esm-module-loader/module-fetcher/index.js";
|
|
9
10
|
const logger = rendererLogger.component("ssr-orchestrator");
|
|
10
11
|
function getElementTypeName(el) {
|
|
11
12
|
if (!el?.type)
|
|
@@ -47,6 +48,9 @@ export class SSROrchestrator {
|
|
|
47
48
|
"ssr.mode": this.config.mode,
|
|
48
49
|
}));
|
|
49
50
|
const { html, stream } = renderResult;
|
|
51
|
+
if (options?.renderSessionId && hasRenderSession(options.renderSessionId)) {
|
|
52
|
+
endRenderSession(options.renderSessionId);
|
|
53
|
+
}
|
|
50
54
|
const mergedOptions = {
|
|
51
55
|
...generationContext.options,
|
|
52
56
|
...options,
|
|
@@ -52,6 +52,10 @@ export interface RenderOptions {
|
|
|
52
52
|
skipCachePersist?: boolean;
|
|
53
53
|
/** Disable HMR scripts (for embedded iframes where WebSocket is unwanted) */
|
|
54
54
|
noHmr?: boolean;
|
|
55
|
+
/** Force production client scripts even when rendering a local project */
|
|
56
|
+
forceProductionScripts?: boolean;
|
|
57
|
+
/** Internal SSR module-tracking session id for first-response manifest preloads */
|
|
58
|
+
renderSessionId?: string;
|
|
55
59
|
}
|
|
56
60
|
export interface RenderContext {
|
|
57
61
|
slug: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE;QACZ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC;IAC1B,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC/B,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,yEAAyE;IACzE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qDAAqD;IACrD,WAAW,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IACvC,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/src/rendering/orchestrator/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/repositories/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/src/repositories/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACjD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM;IACzC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,UAAU,CAAC;IACxB,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/src/resource/factory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D,wBAAgB,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACzD,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GACrC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/src/resource/factory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D,wBAAgB,QAAQ,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,EACzD,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,GACrC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAqB1B"}
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { createError, toError } from "../errors/veryfront-error.js";
|
|
9
9
|
export function resource(config) {
|
|
10
|
-
const pattern = config.pattern ??
|
|
11
|
-
const id =
|
|
10
|
+
const pattern = config.pattern ?? generateFallbackPattern();
|
|
11
|
+
const id = resourcePatternToId(pattern);
|
|
12
12
|
return {
|
|
13
13
|
id,
|
|
14
14
|
pattern,
|
|
@@ -19,11 +19,7 @@ export function resource(config) {
|
|
|
19
19
|
config.paramsSchema.parse(params);
|
|
20
20
|
}
|
|
21
21
|
catch (error) {
|
|
22
|
-
|
|
23
|
-
throw toError(createError({
|
|
24
|
-
type: "agent",
|
|
25
|
-
message: `Resource "${id}" params validation failed: ${message}`,
|
|
26
|
-
}));
|
|
22
|
+
throw createParamsValidationError(id, error);
|
|
27
23
|
}
|
|
28
24
|
return config.load(params);
|
|
29
25
|
},
|
|
@@ -37,13 +33,20 @@ export function resource(config) {
|
|
|
37
33
|
* Auto-discovery is handled by the discovery module which scans
|
|
38
34
|
* the filesystem and extracts patterns from resource definitions.
|
|
39
35
|
*/
|
|
40
|
-
function
|
|
36
|
+
function generateFallbackPattern() {
|
|
41
37
|
return `/resource_${Date.now()}`;
|
|
42
38
|
}
|
|
43
39
|
/**
|
|
44
40
|
* Convert path pattern to ID
|
|
45
41
|
* Example: "/users/:userId/profile" -> "users_userId_profile"
|
|
46
42
|
*/
|
|
47
|
-
function
|
|
43
|
+
function resourcePatternToId(pattern) {
|
|
48
44
|
return pattern.replace(/^\//, "").replace(/\//g, "_").replace(/:/g, "");
|
|
49
45
|
}
|
|
46
|
+
function createParamsValidationError(resourceId, cause) {
|
|
47
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
48
|
+
return toError(createError({
|
|
49
|
+
type: "agent",
|
|
50
|
+
message: `Resource "${resourceId}" params validation failed: ${message}`,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Resource } from "./types.js";
|
|
10
10
|
import { ScopedRegistryFacade } from "../ai/registry-facade.js";
|
|
11
|
-
declare class
|
|
11
|
+
declare class ResourceRegistry extends ScopedRegistryFacade<Resource> {
|
|
12
12
|
findByPattern(uri: string): Resource | undefined;
|
|
13
13
|
private patternToRegex;
|
|
14
|
-
private
|
|
14
|
+
private matchPattern;
|
|
15
15
|
extractParams(uri: string, pattern: string): Record<string, string>;
|
|
16
16
|
list(): string[];
|
|
17
17
|
}
|
|
18
|
-
export declare const resourceRegistry:
|
|
18
|
+
export declare const resourceRegistry: ResourceRegistry;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/src/resource/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIhE,cAAM,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/src/resource/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAIhE,cAAM,gBAAiB,SAAQ,oBAAoB,CAAC,QAAQ,CAAC;IAC3D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOhD,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,YAAY;IAIpB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAInE,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED,eAAO,MAAM,gBAAgB,kBAAgD,CAAC"}
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { ProjectScopedRegistryManager } from "../ai/registry-manager.js";
|
|
10
10
|
import { ScopedRegistryFacade } from "../ai/registry-facade.js";
|
|
11
|
-
const
|
|
12
|
-
class
|
|
11
|
+
const resourceRegistryManager = new ProjectScopedRegistryManager("resource");
|
|
12
|
+
class ResourceRegistry extends ScopedRegistryFacade {
|
|
13
13
|
findByPattern(uri) {
|
|
14
14
|
for (const resource of this.getAll().values()) {
|
|
15
|
-
if (this.
|
|
15
|
+
if (this.matchPattern(uri, resource.pattern))
|
|
16
16
|
return resource;
|
|
17
17
|
}
|
|
18
18
|
return undefined;
|
|
@@ -20,14 +20,14 @@ class ResourceRegistryClass extends ScopedRegistryFacade {
|
|
|
20
20
|
patternToRegex(pattern) {
|
|
21
21
|
return new RegExp(`^${pattern.replace(/:(\w+)/g, "(?<$1>[^/]+)")}$`);
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
return this.patternToRegex(pattern)
|
|
23
|
+
matchPattern(uri, pattern) {
|
|
24
|
+
return uri.match(this.patternToRegex(pattern));
|
|
25
25
|
}
|
|
26
26
|
extractParams(uri, pattern) {
|
|
27
|
-
return
|
|
27
|
+
return this.matchPattern(uri, pattern)?.groups ?? {};
|
|
28
28
|
}
|
|
29
29
|
list() {
|
|
30
30
|
return this.getAllIds();
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
export const resourceRegistry = new
|
|
33
|
+
export const resourceRegistry = new ResourceRegistry(resourceRegistryManager);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;CA8BzB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;AACxD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AACtD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;AACpD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC;AAClE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAChE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,cAAc,CAAC,CAAC"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { MAX_URL_LENGTH_FOR_VALIDATION } from "../utils/constants/index.js";
|
|
3
|
+
import { timestamp } from "./primitives.js";
|
|
4
|
+
const SLUG_PATTERN = /^[a-z0-9-]+$/;
|
|
5
|
+
const E164_PHONE_NUMBER_PATTERN = /^\+?[1-9]\d{1,14}$/;
|
|
3
6
|
export const CommonSchemas = {
|
|
4
7
|
email: z.string().email().max(255),
|
|
5
8
|
uuid: z.string().uuid(),
|
|
6
|
-
slug: z.string().regex(
|
|
9
|
+
slug: z.string().regex(SLUG_PATTERN).min(1).max(100),
|
|
7
10
|
url: z.string().url().max(MAX_URL_LENGTH_FOR_VALIDATION),
|
|
8
|
-
phoneNumber: z.string().regex(
|
|
11
|
+
phoneNumber: z.string().regex(E164_PHONE_NUMBER_PATTERN),
|
|
9
12
|
pagination: z.object({
|
|
10
13
|
page: z.coerce.number().int().positive().default(1),
|
|
11
14
|
limit: z.coerce.number().int().positive().max(100).default(10),
|
|
@@ -14,8 +17,8 @@ export const CommonSchemas = {
|
|
|
14
17
|
}),
|
|
15
18
|
dateRange: z
|
|
16
19
|
.object({
|
|
17
|
-
from:
|
|
18
|
-
to:
|
|
20
|
+
from: timestamp,
|
|
21
|
+
to: timestamp,
|
|
19
22
|
})
|
|
20
23
|
.refine(({ from, to }) => new Date(from) <= new Date(to), {
|
|
21
24
|
message: "From date must be before or equal to To date",
|
|
@@ -13,7 +13,6 @@ export declare class SecurityConfigLoader {
|
|
|
13
13
|
ensureLoaded(): Promise<void>;
|
|
14
14
|
private load;
|
|
15
15
|
private applyConfig;
|
|
16
|
-
private parseCspUserHeader;
|
|
17
16
|
getSecurityConfig(): SecurityConfig | null;
|
|
18
17
|
getCspUserHeader(): string | null;
|
|
19
18
|
getCorsConfig(): SecurityConfig["cors"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc,CAAC;IARzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAGvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,eAAe,YAAA;IAGpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAQrB,IAAI;IAWlB,OAAO,CAAC,WAAW;IAoBnB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/src/security/http/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D,qBAAa,oBAAoB;IAO7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc,CAAC;IARzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAA8B;gBAGvC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,cAAc,CAAC,EAAE,eAAe,YAAA;IAGpC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAQrB,IAAI;IAWlB,OAAO,CAAC,WAAW;IAoBnB,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC;IAIvC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,GAAE,MAAwB,GAAG,MAAM;IAIjE,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM;IASnE,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getConfig } from "../../config/index.js";
|
|
2
2
|
import { serverLogger } from "../../utils/index.js";
|
|
3
|
-
import { buildCSP, generateNonce } from "./response/security-handler.js";
|
|
3
|
+
import { buildCSP, generateNonce, serializeCSPDirectives } from "./response/security-handler.js";
|
|
4
4
|
const logger = serverLogger.component("security-config-loader");
|
|
5
5
|
export class SecurityConfigLoader {
|
|
6
6
|
projectDir;
|
|
@@ -30,7 +30,7 @@ export class SecurityConfigLoader {
|
|
|
30
30
|
}
|
|
31
31
|
catch (error) {
|
|
32
32
|
// Config is optional, so we don't throw
|
|
33
|
-
logger.debug("Failed to load config
|
|
33
|
+
logger.debug("Failed to load config", { error });
|
|
34
34
|
this.isLoaded = true; // Mark as loaded even on error to prevent retry
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -45,22 +45,9 @@ export class SecurityConfigLoader {
|
|
|
45
45
|
"Consider explicitly configuring security.cors and security.csrf.");
|
|
46
46
|
}
|
|
47
47
|
this.securityConfig = security;
|
|
48
|
-
this.cspUserHeader =
|
|
48
|
+
this.cspUserHeader = serializeCSPDirectives(security.csp);
|
|
49
49
|
this.isLoaded = true;
|
|
50
50
|
}
|
|
51
|
-
parseCspUserHeader(csp) {
|
|
52
|
-
if (!csp || typeof csp !== "object")
|
|
53
|
-
return null;
|
|
54
|
-
const pieces = [];
|
|
55
|
-
for (const [k, v] of Object.entries(csp)) {
|
|
56
|
-
if (v === undefined)
|
|
57
|
-
continue;
|
|
58
|
-
const key = k.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);
|
|
59
|
-
const val = Array.isArray(v) ? v.join(" ") : String(v);
|
|
60
|
-
pieces.push(`${key} ${val}`);
|
|
61
|
-
}
|
|
62
|
-
return pieces.length ? pieces.join("; ") : null;
|
|
63
|
-
}
|
|
64
51
|
getSecurityConfig() {
|
|
65
52
|
return this.securityConfig;
|
|
66
53
|
}
|