veryfront 0.1.215 → 0.1.217
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 +1 -1
- package/esm/cli/commands/extension/command-help.d.ts +3 -0
- package/esm/cli/commands/extension/command-help.d.ts.map +1 -0
- package/esm/cli/commands/extension/command-help.js +16 -0
- package/esm/cli/commands/extension/handler.d.ts +3 -0
- package/esm/cli/commands/extension/handler.d.ts.map +1 -0
- package/esm/cli/commands/extension/handler.js +36 -0
- package/esm/cli/commands/extension/init-command.d.ts +19 -0
- package/esm/cli/commands/extension/init-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/init-command.js +122 -0
- package/esm/cli/commands/extension/validate-command.d.ts +13 -0
- package/esm/cli/commands/extension/validate-command.d.ts.map +1 -0
- package/esm/cli/commands/extension/validate-command.js +62 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts +35 -0
- package/esm/cli/commands/generate/integration-generator-helpers.d.ts.map +1 -0
- package/esm/cli/commands/generate/integration-generator-helpers.js +123 -0
- package/esm/cli/commands/generate/integration-generator.d.ts +1 -2
- package/esm/cli/commands/generate/integration-generator.d.ts.map +1 -1
- package/esm/cli/commands/generate/integration-generator.js +1 -123
- package/esm/cli/commands/knowledge/command-helpers.d.ts +48 -0
- package/esm/cli/commands/knowledge/command-helpers.d.ts.map +1 -0
- package/esm/cli/commands/knowledge/command-helpers.js +216 -0
- package/esm/cli/commands/knowledge/command.d.ts +12 -17
- package/esm/cli/commands/knowledge/command.d.ts.map +1 -1
- package/esm/cli/commands/knowledge/command.js +26 -214
- package/esm/cli/help/command-definitions.d.ts.map +1 -1
- package/esm/cli/help/command-definitions.js +2 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts +5 -0
- package/esm/cli/mcp/remote-file-tool-helpers.d.ts.map +1 -0
- package/esm/cli/mcp/remote-file-tool-helpers.js +22 -0
- package/esm/cli/mcp/remote-file-tools.d.ts.map +1 -1
- package/esm/cli/mcp/remote-file-tools.js +1 -22
- package/esm/cli/router.d.ts.map +1 -1
- package/esm/cli/router.js +2 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts +8 -0
- package/esm/cli/templates/integration-loader-helpers.d.ts.map +1 -0
- package/esm/cli/templates/integration-loader-helpers.js +29 -0
- package/esm/cli/templates/integration-loader.d.ts.map +1 -1
- package/esm/cli/templates/integration-loader.js +5 -21
- package/esm/cli/templates/manifest.d.ts +1 -0
- package/esm/cli/templates/manifest.js +2 -1
- package/esm/deno.d.ts +3 -0
- package/esm/deno.js +5 -2
- package/esm/src/agent/runtime/index.d.ts.map +1 -1
- package/esm/src/agent/runtime/index.js +48 -90
- package/esm/src/chat/ag-ui-helpers.d.ts +17 -0
- package/esm/src/chat/ag-ui-helpers.d.ts.map +1 -0
- package/esm/src/chat/ag-ui-helpers.js +111 -0
- package/esm/src/chat/ag-ui.d.ts.map +1 -1
- package/esm/src/chat/ag-ui.js +1 -111
- package/esm/src/config/schemas/config.schema.d.ts +1 -0
- package/esm/src/config/schemas/config.schema.d.ts.map +1 -1
- package/esm/src/config/schemas/config.schema.js +11 -0
- package/esm/src/config/schemas/index.d.ts +11 -1
- package/esm/src/config/schemas/index.d.ts.map +1 -1
- package/esm/src/errors/error-registry-helpers.d.ts +6 -0
- package/esm/src/errors/error-registry-helpers.d.ts.map +1 -0
- package/esm/src/errors/error-registry-helpers.js +9 -0
- package/esm/src/errors/error-registry.d.ts.map +1 -1
- package/esm/src/errors/error-registry.js +4 -3
- package/esm/src/extensions/capabilities.d.ts +20 -0
- package/esm/src/extensions/capabilities.d.ts.map +1 -0
- package/esm/src/extensions/capabilities.js +77 -0
- package/esm/src/extensions/contracts.d.ts +10 -0
- package/esm/src/extensions/contracts.d.ts.map +1 -0
- package/esm/src/extensions/contracts.js +28 -0
- package/esm/src/extensions/discovery.d.ts +48 -0
- package/esm/src/extensions/discovery.d.ts.map +1 -0
- package/esm/src/extensions/discovery.js +179 -0
- package/esm/src/extensions/errors.d.ts +10 -0
- package/esm/src/extensions/errors.d.ts.map +1 -0
- package/esm/src/extensions/errors.js +34 -0
- package/esm/src/extensions/factory-loader.d.ts +29 -0
- package/esm/src/extensions/factory-loader.d.ts.map +1 -0
- package/esm/src/extensions/factory-loader.js +63 -0
- package/esm/src/extensions/index.d.ts +37 -0
- package/esm/src/extensions/index.d.ts.map +1 -0
- package/esm/src/extensions/index.js +41 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts +94 -0
- package/esm/src/extensions/interfaces/ai-model-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/ai-model-provider.js +8 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts +49 -0
- package/esm/src/extensions/interfaces/auth-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/auth-provider.js +8 -0
- package/esm/src/extensions/interfaces/bundler.d.ts +118 -0
- package/esm/src/extensions/interfaces/bundler.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/bundler.js +8 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts +27 -0
- package/esm/src/extensions/interfaces/cache-store.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/cache-store.js +8 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts +76 -0
- package/esm/src/extensions/interfaces/code-parser.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/code-parser.js +8 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts +40 -0
- package/esm/src/extensions/interfaces/content-transformer.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/content-transformer.js +8 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts +38 -0
- package/esm/src/extensions/interfaces/css-processor.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/css-processor.js +8 -0
- package/esm/src/extensions/interfaces/database-client.d.ts +31 -0
- package/esm/src/extensions/interfaces/database-client.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/database-client.js +8 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts +37 -0
- package/esm/src/extensions/interfaces/embedding-provider.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/embedding-provider.js +8 -0
- package/esm/src/extensions/interfaces/index.d.ts +21 -0
- package/esm/src/extensions/interfaces/index.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/index.js +9 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts +25 -0
- package/esm/src/extensions/interfaces/node-compat.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/node-compat.js +8 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts +46 -0
- package/esm/src/extensions/interfaces/schema-validator.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/schema-validator.js +8 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts +44 -0
- package/esm/src/extensions/interfaces/tracing-exporter.d.ts.map +1 -0
- package/esm/src/extensions/interfaces/tracing-exporter.js +8 -0
- package/esm/src/extensions/loader.d.ts +33 -0
- package/esm/src/extensions/loader.d.ts.map +1 -0
- package/esm/src/extensions/loader.js +209 -0
- package/esm/src/extensions/orchestrate.d.ts +54 -0
- package/esm/src/extensions/orchestrate.d.ts.map +1 -0
- package/esm/src/extensions/orchestrate.js +116 -0
- package/esm/src/extensions/recommendations.d.ts +7 -0
- package/esm/src/extensions/recommendations.d.ts.map +1 -0
- package/esm/src/extensions/recommendations.js +22 -0
- package/esm/src/extensions/types.d.ts +47 -0
- package/esm/src/extensions/types.d.ts.map +1 -0
- package/esm/src/extensions/types.js +6 -0
- package/esm/src/extensions/validation.d.ts +44 -0
- package/esm/src/extensions/validation.d.ts.map +1 -0
- package/esm/src/extensions/validation.js +115 -0
- package/esm/src/html/styles-builder/plugin-loader.d.ts.map +1 -1
- package/esm/src/html/styles-builder/plugin-loader.js +23 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts +29 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.d.ts.map +1 -0
- package/esm/src/html/styles-builder/tailwind-plugin-allowlist.js +48 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts +15 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader-helpers.js +22 -0
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts +0 -2
- package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
- package/esm/src/modules/react-loader/ssr-module-loader/loader.js +4 -24
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts +19 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter-helpers.js +26 -0
- package/esm/src/platform/adapters/fs/veryfront/adapter.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/adapter.js +4 -20
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts +1 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations-helpers.js +3 -0
- package/esm/src/platform/adapters/fs/veryfront/read-operations.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/read-operations.js +4 -7
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts +28 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.d.ts.map +1 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager-helpers.js +41 -0
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts +1 -4
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.d.ts.map +1 -1
- package/esm/src/platform/adapters/fs/veryfront/websocket-manager.js +7 -40
- package/esm/src/platform/compat/process/command.d.ts +31 -0
- package/esm/src/platform/compat/process/command.d.ts.map +1 -0
- package/esm/src/platform/compat/process/command.js +193 -0
- package/esm/src/platform/compat/process/env.d.ts +31 -0
- package/esm/src/platform/compat/process/env.d.ts.map +1 -0
- package/esm/src/platform/compat/process/env.js +175 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts +98 -0
- package/esm/src/platform/compat/process/lifecycle.d.ts.map +1 -0
- package/esm/src/platform/compat/process/lifecycle.js +305 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts +10 -0
- package/esm/src/platform/compat/process/runtime-process.d.ts.map +1 -0
- package/esm/src/platform/compat/process/runtime-process.js +24 -0
- package/esm/src/platform/compat/process.d.ts +4 -165
- package/esm/src/platform/compat/process.d.ts.map +1 -1
- package/esm/src/platform/compat/process.js +4 -682
- package/esm/src/platform/index.d.ts +1 -1
- package/esm/src/platform/index.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts +8 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-endpoints.js +27 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts +32 -0
- package/esm/src/provider/runtime-loader/provider-request-init.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/provider-request-init.js +67 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts +17 -0
- package/esm/src/provider/runtime-loader/tool-input-status.d.ts.map +1 -0
- package/esm/src/provider/runtime-loader/tool-input-status.js +155 -0
- package/esm/src/provider/runtime-loader.d.ts +2 -3
- package/esm/src/provider/runtime-loader.d.ts.map +1 -1
- package/esm/src/provider/runtime-loader.js +92 -291
- package/esm/src/proxy/handler.d.ts.map +1 -1
- package/esm/src/proxy/handler.js +14 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts +8 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.d.ts.map +1 -0
- package/esm/src/rendering/orchestrator/pipeline-helpers.js +20 -0
- package/esm/src/rendering/orchestrator/pipeline.d.ts +0 -3
- package/esm/src/rendering/orchestrator/pipeline.d.ts.map +1 -1
- package/esm/src/rendering/orchestrator/pipeline.js +4 -22
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts +10 -0
- package/esm/src/routing/api/module-loader/loader-helpers.d.ts.map +1 -0
- package/esm/src/routing/api/module-loader/loader-helpers.js +62 -0
- package/esm/src/routing/api/module-loader/loader.d.ts +1 -1
- package/esm/src/routing/api/module-loader/loader.d.ts.map +1 -1
- package/esm/src/routing/api/module-loader/loader.js +2 -60
- package/esm/src/server/bootstrap.d.ts +22 -2
- package/esm/src/server/bootstrap.d.ts.map +1 -1
- package/esm/src/server/bootstrap.js +67 -5
- package/esm/src/server/dev-ui/manifest.d.ts +2 -0
- package/esm/src/server/dev-ui/manifest.js +3 -1
- package/esm/src/server/handlers/request/api/project-discovery.d.ts.map +1 -1
- package/esm/src/server/handlers/request/api/project-discovery.js +14 -8
- package/esm/src/server/production-server.js +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.d.ts.map +1 -1
- package/esm/src/server/services/rsc/endpoints/rsc-bundles.generated.js +2 -2
- package/esm/src/server/utils/domain-parser.d.ts.map +1 -1
- package/esm/src/server/utils/domain-parser.js +4 -0
- 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/tool/index.d.ts +1 -1
- package/esm/src/tool/index.d.ts.map +1 -1
- package/esm/src/tool/types.d.ts +20 -0
- package/esm/src/tool/types.d.ts.map +1 -1
- package/esm/src/utils/version-constant.d.ts +1 -1
- package/esm/src/utils/version-constant.js +1 -1
- package/package.json +7 -1
- package/src/cli/commands/extension/command-help.ts +18 -0
- package/src/cli/commands/extension/handler.ts +41 -0
- package/src/cli/commands/extension/init-command.ts +140 -0
- package/src/cli/commands/extension/validate-command.ts +78 -0
- package/src/cli/commands/generate/integration-generator-helpers.ts +185 -0
- package/src/cli/commands/generate/integration-generator.ts +12 -168
- package/src/cli/commands/knowledge/command-helpers.ts +295 -0
- package/src/cli/commands/knowledge/command.ts +34 -261
- package/src/cli/help/command-definitions.ts +2 -0
- package/src/cli/mcp/remote-file-tool-helpers.ts +27 -0
- package/src/cli/mcp/remote-file-tools.ts +6 -28
- package/src/cli/router.ts +2 -0
- package/src/cli/templates/integration-loader-helpers.ts +49 -0
- package/src/cli/templates/integration-loader.ts +10 -28
- package/src/cli/templates/manifest.js +2 -1
- package/src/deno.js +5 -2
- package/src/src/agent/runtime/index.ts +77 -94
- package/src/src/chat/ag-ui-helpers.ts +139 -0
- package/src/src/chat/ag-ui.ts +11 -139
- package/src/src/config/schemas/config.schema.ts +11 -0
- package/src/src/config/schemas/index.ts +15 -1
- package/src/src/errors/error-registry-helpers.ts +23 -0
- package/src/src/errors/error-registry.ts +8 -3
- package/src/src/extensions/capabilities.ts +97 -0
- package/src/src/extensions/contracts.ts +36 -0
- package/src/src/extensions/discovery.ts +221 -0
- package/src/src/extensions/errors.ts +39 -0
- package/src/src/extensions/factory-loader.ts +76 -0
- package/src/src/extensions/index.ts +79 -0
- package/src/src/extensions/interfaces/ai-model-provider.ts +100 -0
- package/src/src/extensions/interfaces/auth-provider.ts +52 -0
- package/src/src/extensions/interfaces/bundler.ts +116 -0
- package/src/src/extensions/interfaces/cache-store.ts +27 -0
- package/src/src/extensions/interfaces/code-parser.ts +84 -0
- package/src/src/extensions/interfaces/content-transformer.ts +38 -0
- package/src/src/extensions/interfaces/css-processor.ts +40 -0
- package/src/src/extensions/interfaces/database-client.ts +35 -0
- package/src/src/extensions/interfaces/embedding-provider.ts +39 -0
- package/src/src/extensions/interfaces/index.ts +81 -0
- package/src/src/extensions/interfaces/node-compat.ts +25 -0
- package/src/src/extensions/interfaces/schema-validator.ts +51 -0
- package/src/src/extensions/interfaces/tracing-exporter.ts +42 -0
- package/src/src/extensions/loader.ts +245 -0
- package/src/src/extensions/orchestrate.ts +184 -0
- package/src/src/extensions/recommendations.ts +24 -0
- package/src/src/extensions/types.ts +57 -0
- package/src/src/extensions/validation.ts +147 -0
- package/src/src/html/styles-builder/plugin-loader.ts +32 -0
- package/src/src/html/styles-builder/tailwind-plugin-allowlist.ts +51 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader-helpers.ts +37 -0
- package/src/src/modules/react-loader/ssr-module-loader/loader.ts +8 -39
- package/src/src/platform/adapters/fs/veryfront/adapter-helpers.ts +43 -0
- package/src/src/platform/adapters/fs/veryfront/adapter.ts +8 -22
- package/src/src/platform/adapters/fs/veryfront/read-operations-helpers.ts +4 -0
- package/src/src/platform/adapters/fs/veryfront/read-operations.ts +4 -7
- package/src/src/platform/adapters/fs/veryfront/websocket-manager-helpers.ts +73 -0
- package/src/src/platform/adapters/fs/veryfront/websocket-manager.ts +29 -44
- package/src/src/platform/compat/process/command.ts +297 -0
- package/src/src/platform/compat/process/env.ts +227 -0
- package/src/src/platform/compat/process/lifecycle.ts +330 -0
- package/src/src/platform/compat/process/runtime-process.ts +27 -0
- package/src/src/platform/compat/process.ts +37 -870
- package/src/src/platform/index.ts +1 -0
- package/src/src/provider/runtime-loader/provider-endpoints.ts +50 -0
- package/src/src/provider/runtime-loader/provider-request-init.ts +101 -0
- package/src/src/provider/runtime-loader/tool-input-status.ts +210 -0
- package/src/src/provider/runtime-loader.ts +113 -368
- package/src/src/proxy/handler.ts +16 -0
- package/src/src/rendering/orchestrator/pipeline-helpers.ts +35 -0
- package/src/src/rendering/orchestrator/pipeline.ts +8 -35
- package/src/src/routing/api/module-loader/loader-helpers.ts +68 -0
- package/src/src/routing/api/module-loader/loader.ts +8 -65
- package/src/src/server/bootstrap.ts +88 -7
- package/src/src/server/dev-ui/manifest.js +3 -1
- package/src/src/server/handlers/request/api/project-discovery.ts +19 -8
- package/src/src/server/production-server.ts +1 -1
- package/src/src/server/services/rsc/endpoints/rsc-bundles.generated.ts +2 -2
- package/src/src/server/utils/domain-parser.ts +4 -0
- package/src/src/studio/bridge/bridge-bundle.generated.ts +1 -1
- package/src/src/tool/index.ts +1 -0
- package/src/src/tool/types.ts +21 -0
- package/src/src/utils/version-constant.ts +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel export for all extension contract interfaces.
|
|
3
|
+
*
|
|
4
|
+
* Every export is a pure TypeScript type -- no runtime code is emitted.
|
|
5
|
+
*
|
|
6
|
+
* @module extensions/interfaces
|
|
7
|
+
*/
|
|
8
|
+
import "../../../_dnt.polyfills.js";
|
|
9
|
+
export type { BundleOptions, BundleOutput, Bundler, BundleResult, BundlerPlugin, BundlerPluginBuild, TransformOptions, TransformResult, } from "./bundler.js";
|
|
10
|
+
export type { CacheStore } from "./cache-store.js";
|
|
11
|
+
export type { CSSProcessOptions, CSSProcessor, CSSProcessResult } from "./css-processor.js";
|
|
12
|
+
export type { ContentTransformer, ContentTransformOptions, ContentTransformResult, } from "./content-transformer.js";
|
|
13
|
+
export type { DatabaseClient, QueryResult } from "./database-client.js";
|
|
14
|
+
export type { AuthProvider, SignOptions, TokenPayload, VerifyOptions } from "./auth-provider.js";
|
|
15
|
+
export type { SpanData, TracingExporter } from "./tracing-exporter.js";
|
|
16
|
+
export type { AIModelProvider, ChatMessage, CompletionOptions, CompletionResult, ContentPart, StreamChunk, ToolDefinition, } from "./ai-model-provider.js";
|
|
17
|
+
export type { EmbeddingOptions, EmbeddingProvider, EmbeddingResult } from "./embedding-provider.js";
|
|
18
|
+
export type { ASTNode, CodeParser, GenerateOptions, GenerateResult, NodePath, ParseOptions, TraverseVisitor, } from "./code-parser.js";
|
|
19
|
+
export type { Schema, SchemaValidator, ValidationFailure, ValidationIssue, ValidationResult, ValidationSuccess, } from "./schema-validator.js";
|
|
20
|
+
export type { NodeCompat } from "./node-compat.js";
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/extensions/interfaces/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,4BAA4B,CAAC;AAEpC,YAAY,EACV,aAAa,EACb,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,GAChB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG5F,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGxE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGjG,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAGvE,YAAY,EACV,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGpG,YAAY,EACV,OAAO,EACP,UAAU,EACV,eAAe,EACf,cAAc,EACd,QAAQ,EACR,YAAY,EACZ,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EACV,MAAM,EACN,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract interface for Node.js compatibility shims.
|
|
3
|
+
*
|
|
4
|
+
* Default implementation: `@veryfront/ext-node-compat`
|
|
5
|
+
*
|
|
6
|
+
* @module extensions/interfaces/node-compat
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* NodeCompat contract interface.
|
|
10
|
+
*
|
|
11
|
+
* Implementations provide access to Node.js-compatible APIs in
|
|
12
|
+
* environments where native Node modules are unavailable (e.g. Deno).
|
|
13
|
+
*
|
|
14
|
+
* Each getter returns the module's namespace object, matching the
|
|
15
|
+
* shape of the corresponding Node.js built-in.
|
|
16
|
+
*/
|
|
17
|
+
export interface NodeCompat {
|
|
18
|
+
/** Return a Node-compatible `fs` module (sync + async + promises). */
|
|
19
|
+
getFS(): unknown;
|
|
20
|
+
/** Return a Node-compatible `path` module. */
|
|
21
|
+
getPath(): unknown;
|
|
22
|
+
/** Return a Node-compatible `WebSocket` constructor. */
|
|
23
|
+
getWebSocket(): unknown;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=node-compat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-compat.d.ts","sourceRoot":"","sources":["../../../../src/src/extensions/interfaces/node-compat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,KAAK,IAAI,OAAO,CAAC;IACjB,8CAA8C;IAC9C,OAAO,IAAI,OAAO,CAAC;IACnB,wDAAwD;IACxD,YAAY,IAAI,OAAO,CAAC;CACzB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract interface for schema validation.
|
|
3
|
+
*
|
|
4
|
+
* Default implementation: `@veryfront/ext-zod`
|
|
5
|
+
*
|
|
6
|
+
* @module extensions/interfaces/schema-validator
|
|
7
|
+
*/
|
|
8
|
+
/** An opaque schema definition that validates and infers type `T`. */
|
|
9
|
+
export interface Schema<T = unknown> {
|
|
10
|
+
/** Brand field for nominal typing -- not used at runtime. */
|
|
11
|
+
readonly _output: T;
|
|
12
|
+
}
|
|
13
|
+
/** A single validation issue with location context. */
|
|
14
|
+
export interface ValidationIssue {
|
|
15
|
+
/** Dot-path to the offending field (e.g. `"user.email"`). */
|
|
16
|
+
path: (string | number)[];
|
|
17
|
+
/** Human-readable error message. */
|
|
18
|
+
message: string;
|
|
19
|
+
/** Machine-readable error code. */
|
|
20
|
+
code?: string;
|
|
21
|
+
}
|
|
22
|
+
/** Successful validation outcome. */
|
|
23
|
+
export interface ValidationSuccess<T> {
|
|
24
|
+
success: true;
|
|
25
|
+
/** Parsed and validated data. */
|
|
26
|
+
data: T;
|
|
27
|
+
}
|
|
28
|
+
/** Failed validation outcome. */
|
|
29
|
+
export interface ValidationFailure {
|
|
30
|
+
success: false;
|
|
31
|
+
/** List of issues found during validation. */
|
|
32
|
+
issues: ValidationIssue[];
|
|
33
|
+
}
|
|
34
|
+
/** Discriminated union of validation outcomes. */
|
|
35
|
+
export type ValidationResult<T> = ValidationSuccess<T> | ValidationFailure;
|
|
36
|
+
/**
|
|
37
|
+
* SchemaValidator contract interface.
|
|
38
|
+
*
|
|
39
|
+
* Implementations validate unknown input against a typed schema and
|
|
40
|
+
* return a discriminated success/failure result.
|
|
41
|
+
*/
|
|
42
|
+
export interface SchemaValidator {
|
|
43
|
+
/** Validate `data` against the given schema. */
|
|
44
|
+
validate<T>(schema: Schema<T>, data: unknown): ValidationResult<T>;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../../src/src/extensions/interfaces/schema-validator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,sEAAsE;AACtE,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;CACrB;AAED,uDAAuD;AACvD,MAAM,WAAW,eAAe;IAC9B,6DAA6D;IAC7D,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC1B,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,CAAC;IACd,iCAAiC;IACjC,IAAI,EAAE,CAAC,CAAC;CACT;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,8CAA8C;IAC9C,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,kDAAkD;AAClD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;CACpE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract interface for tracing/telemetry exporters.
|
|
3
|
+
*
|
|
4
|
+
* Default implementation: `@veryfront/ext-opentelemetry`
|
|
5
|
+
*
|
|
6
|
+
* @module extensions/interfaces/tracing-exporter
|
|
7
|
+
*/
|
|
8
|
+
/** Data describing a single trace span. */
|
|
9
|
+
export interface SpanData {
|
|
10
|
+
/** Unique span identifier. */
|
|
11
|
+
spanId: string;
|
|
12
|
+
/** Trace identifier this span belongs to. */
|
|
13
|
+
traceId: string;
|
|
14
|
+
/** Parent span identifier, if any. */
|
|
15
|
+
parentSpanId?: string;
|
|
16
|
+
/** Human-readable operation name. */
|
|
17
|
+
name: string;
|
|
18
|
+
/** Span kind (`client`, `server`, `internal`, `producer`, `consumer`). */
|
|
19
|
+
kind: "client" | "server" | "internal" | "producer" | "consumer";
|
|
20
|
+
/** Start time as a Unix timestamp in milliseconds. */
|
|
21
|
+
startTime: number;
|
|
22
|
+
/** End time as a Unix timestamp in milliseconds. */
|
|
23
|
+
endTime: number;
|
|
24
|
+
/** Key-value attributes attached to the span. */
|
|
25
|
+
attributes: Record<string, string | number | boolean>;
|
|
26
|
+
/** Status of the span. */
|
|
27
|
+
status: {
|
|
28
|
+
code: "ok" | "error" | "unset";
|
|
29
|
+
message?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* TracingExporter contract interface.
|
|
34
|
+
*
|
|
35
|
+
* Implementations export collected trace spans to an observability
|
|
36
|
+
* backend (e.g. Jaeger, Zipkin, OTLP collector).
|
|
37
|
+
*/
|
|
38
|
+
export interface TracingExporter {
|
|
39
|
+
/** Export a batch of completed spans. */
|
|
40
|
+
export(spans: SpanData[]): Promise<void>;
|
|
41
|
+
/** Flush pending data and release resources. */
|
|
42
|
+
shutdown(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=tracing-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing-exporter.d.ts","sourceRoot":"","sources":["../../../../src/src/extensions/interfaces/tracing-exporter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IACjE,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IACtD,0BAA0B;IAC1B,MAAM,EAAE;QAAE,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAED;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,yCAAyC;IACzC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,gDAAgD;IAChD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension loader — topological sort, lifecycle management, preset flattening.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/loader
|
|
5
|
+
*/
|
|
6
|
+
import type { ExtensionLogger, ResolvedExtension } from "./types.js";
|
|
7
|
+
export declare class ExtensionLoader {
|
|
8
|
+
private logger;
|
|
9
|
+
private setupOrder;
|
|
10
|
+
constructor(logger: ExtensionLogger);
|
|
11
|
+
/**
|
|
12
|
+
* Flatten presets: extensions with `extends` are replaced by their children.
|
|
13
|
+
* Recurses through nested presets; throws on cyclic `extends` graphs rather
|
|
14
|
+
* than stack-overflowing.
|
|
15
|
+
*/
|
|
16
|
+
flattenPresets(extensions: ResolvedExtension[]): ResolvedExtension[];
|
|
17
|
+
private flattenPresetsInner;
|
|
18
|
+
/**
|
|
19
|
+
* Topological sort: providers load before consumers.
|
|
20
|
+
* Throws on circular dependencies.
|
|
21
|
+
*/
|
|
22
|
+
topologicalSort(extensions: ResolvedExtension[]): ResolvedExtension[];
|
|
23
|
+
/**
|
|
24
|
+
* Run the full setup lifecycle for all extensions.
|
|
25
|
+
* If called while extensions are already loaded, tears them down first.
|
|
26
|
+
*/
|
|
27
|
+
setupAll(extensions: ResolvedExtension[], projectConfig: Record<string, unknown>): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Teardown all loaded extensions in reverse order.
|
|
30
|
+
*/
|
|
31
|
+
teardownAll(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,OAAO,KAAK,EAA+B,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElG,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,UAAU,CAA2B;gBAEjC,MAAM,EAAE,eAAe;IAInC;;;;OAIG;IACH,cAAc,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;IAIpE,OAAO,CAAC,mBAAmB;IA8B3B;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,iBAAiB,EAAE;IA6ErE;;;OAGG;IACG,QAAQ,CACZ,UAAU,EAAE,iBAAiB,EAAE,EAC/B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC;IA4EhB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;CAcnC"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension loader — topological sort, lifecycle management, preset flattening.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/loader
|
|
5
|
+
*/
|
|
6
|
+
import { CIRCULAR_DEPENDENCY_ERROR, EXTENSION_CONFLICT_ERROR, EXTENSION_VALIDATION_ERROR, } from "./errors.js";
|
|
7
|
+
import { register, reset, resolve as resolveContract, tryResolve } from "./contracts.js";
|
|
8
|
+
import { auditCapabilities } from "./capabilities.js";
|
|
9
|
+
import { detectConflicts, selectContractProviders, validateExtension } from "./validation.js";
|
|
10
|
+
export class ExtensionLoader {
|
|
11
|
+
logger;
|
|
12
|
+
setupOrder = [];
|
|
13
|
+
constructor(logger) {
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Flatten presets: extensions with `extends` are replaced by their children.
|
|
18
|
+
* Recurses through nested presets; throws on cyclic `extends` graphs rather
|
|
19
|
+
* than stack-overflowing.
|
|
20
|
+
*/
|
|
21
|
+
flattenPresets(extensions) {
|
|
22
|
+
return this.flattenPresetsInner(extensions, new Set());
|
|
23
|
+
}
|
|
24
|
+
flattenPresetsInner(extensions, path) {
|
|
25
|
+
const result = [];
|
|
26
|
+
for (const resolved of extensions) {
|
|
27
|
+
const ext = resolved.extension;
|
|
28
|
+
if (ext.extends && ext.extends.length > 0) {
|
|
29
|
+
if (path.has(ext)) {
|
|
30
|
+
throw EXTENSION_VALIDATION_ERROR.create({
|
|
31
|
+
message: `Circular preset extends chain detected via "${ext.name}"`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
path.add(ext);
|
|
35
|
+
const children = ext.extends.map((child) => ({
|
|
36
|
+
extension: child,
|
|
37
|
+
source: resolved.source,
|
|
38
|
+
origin: resolved.origin,
|
|
39
|
+
}));
|
|
40
|
+
result.push(...this.flattenPresetsInner(children, path));
|
|
41
|
+
path.delete(ext);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
result.push(resolved);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Topological sort: providers load before consumers.
|
|
51
|
+
* Throws on circular dependencies.
|
|
52
|
+
*/
|
|
53
|
+
topologicalSort(extensions) {
|
|
54
|
+
const providerOf = new Map();
|
|
55
|
+
const extByName = new Map();
|
|
56
|
+
const consumesContracts = new Map();
|
|
57
|
+
for (const resolved of extensions) {
|
|
58
|
+
const ext = resolved.extension;
|
|
59
|
+
extByName.set(ext.name, resolved);
|
|
60
|
+
if (ext.provides) {
|
|
61
|
+
for (const contract of Object.keys(ext.provides)) {
|
|
62
|
+
providerOf.set(contract, ext.name);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const contracts = ext.capabilities
|
|
66
|
+
.filter((c) => c.type === "contract")
|
|
67
|
+
.map((c) => c.name);
|
|
68
|
+
if (contracts.length > 0) {
|
|
69
|
+
consumesContracts.set(ext.name, contracts);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Build adjacency list
|
|
73
|
+
const graph = new Map();
|
|
74
|
+
const inDegree = new Map();
|
|
75
|
+
for (const resolved of extensions) {
|
|
76
|
+
const name = resolved.extension.name;
|
|
77
|
+
if (!graph.has(name))
|
|
78
|
+
graph.set(name, new Set());
|
|
79
|
+
if (!inDegree.has(name))
|
|
80
|
+
inDegree.set(name, 0);
|
|
81
|
+
}
|
|
82
|
+
for (const [consumer, contracts] of consumesContracts) {
|
|
83
|
+
for (const contract of contracts) {
|
|
84
|
+
const provider = providerOf.get(contract);
|
|
85
|
+
if (provider && provider !== consumer) {
|
|
86
|
+
const edges = graph.get(provider);
|
|
87
|
+
if (!edges.has(consumer)) {
|
|
88
|
+
edges.add(consumer);
|
|
89
|
+
inDegree.set(consumer, (inDegree.get(consumer) || 0) + 1);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Kahn's algorithm
|
|
95
|
+
const queue = [];
|
|
96
|
+
for (const [name, degree] of inDegree) {
|
|
97
|
+
if (degree === 0)
|
|
98
|
+
queue.push(name);
|
|
99
|
+
}
|
|
100
|
+
const sorted = [];
|
|
101
|
+
while (queue.length > 0) {
|
|
102
|
+
const name = queue.shift();
|
|
103
|
+
sorted.push(extByName.get(name));
|
|
104
|
+
for (const dependent of graph.get(name) || []) {
|
|
105
|
+
const newDegree = (inDegree.get(dependent) || 1) - 1;
|
|
106
|
+
inDegree.set(dependent, newDegree);
|
|
107
|
+
if (newDegree === 0)
|
|
108
|
+
queue.push(dependent);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (sorted.length !== extByName.size) {
|
|
112
|
+
const unsorted = [...extByName.values()]
|
|
113
|
+
.filter((r) => !sorted.includes(r))
|
|
114
|
+
.map((r) => r.extension.name);
|
|
115
|
+
throw CIRCULAR_DEPENDENCY_ERROR.create({
|
|
116
|
+
message: `Circular extension dependency detected among: ${unsorted.join(", ")}`,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
return sorted;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Run the full setup lifecycle for all extensions.
|
|
123
|
+
* If called while extensions are already loaded, tears them down first.
|
|
124
|
+
*/
|
|
125
|
+
async setupAll(extensions, projectConfig) {
|
|
126
|
+
// Idempotent: teardownAll clears setupOrder and resets the contract
|
|
127
|
+
// registry even when nothing is loaded yet.
|
|
128
|
+
await this.teardownAll();
|
|
129
|
+
// Check for contract conflicts before loading
|
|
130
|
+
const conflicts = detectConflicts(extensions);
|
|
131
|
+
if (conflicts.length > 0) {
|
|
132
|
+
const details = conflicts
|
|
133
|
+
.map((c) => `"${c.contract}" provided by: ${c.providers.map((p) => p.name).join(", ")}`)
|
|
134
|
+
.join("; ");
|
|
135
|
+
throw EXTENSION_CONFLICT_ERROR.create({
|
|
136
|
+
message: `Extension conflicts detected: ${details}`,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
// Precompute the priority winner per contract so that a lower-priority
|
|
140
|
+
// provider later in the iteration order cannot overwrite the winning impl
|
|
141
|
+
// via register(). Without this, merged inputs (config -> package ->
|
|
142
|
+
// project -> local-file) silently invert the documented source priority.
|
|
143
|
+
const contractWinner = selectContractProviders(extensions);
|
|
144
|
+
for (const resolved of extensions) {
|
|
145
|
+
const ext = resolved.extension;
|
|
146
|
+
const issues = validateExtension(ext);
|
|
147
|
+
if (issues.length > 0) {
|
|
148
|
+
throw EXTENSION_VALIDATION_ERROR.create({
|
|
149
|
+
message: `Extension "${ext.name}" is invalid:\n ${issues.join("\n ")}`,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
auditCapabilities(ext.name, ext.capabilities, this.logger);
|
|
153
|
+
if (ext.provides) {
|
|
154
|
+
for (const [contract, impl] of Object.entries(ext.provides)) {
|
|
155
|
+
if (contractWinner.get(contract) === resolved) {
|
|
156
|
+
register(contract, impl);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (ext.setup) {
|
|
161
|
+
const ctx = {
|
|
162
|
+
get: (contract) => tryResolve(contract),
|
|
163
|
+
require: (contract) => resolveContract(contract),
|
|
164
|
+
provide: (contract, impl) => register(contract, impl),
|
|
165
|
+
config: projectConfig,
|
|
166
|
+
logger: this.logger,
|
|
167
|
+
};
|
|
168
|
+
try {
|
|
169
|
+
await ext.setup(ctx);
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
// Best-effort teardown of the partially-initialized extension so
|
|
173
|
+
// any resources it opened before throwing get a chance to close.
|
|
174
|
+
if (ext.teardown) {
|
|
175
|
+
try {
|
|
176
|
+
await ext.teardown();
|
|
177
|
+
}
|
|
178
|
+
catch (teardownErr) {
|
|
179
|
+
this.logger.error(`Error during rollback teardown of "${ext.name}":`, teardownErr);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Roll back everything loaded so far and clear the registry.
|
|
183
|
+
await this.teardownAll();
|
|
184
|
+
throw err;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
this.setupOrder.push(resolved);
|
|
188
|
+
this.logger.info(`Extension "${ext.name}" v${ext.version} loaded from ${resolved.source}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Teardown all loaded extensions in reverse order.
|
|
193
|
+
*/
|
|
194
|
+
async teardownAll() {
|
|
195
|
+
const reversed = [...this.setupOrder].reverse();
|
|
196
|
+
for (const resolved of reversed) {
|
|
197
|
+
if (resolved.extension.teardown) {
|
|
198
|
+
try {
|
|
199
|
+
await resolved.extension.teardown();
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
this.logger.error(`Error tearing down "${resolved.extension.name}":`, err);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
this.setupOrder = [];
|
|
207
|
+
reset();
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension orchestration pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Discovers, loads, merges, sorts, and runs setup for every extension
|
|
5
|
+
* contributed by the four sources (config, package, project, local-file).
|
|
6
|
+
* Invoked once by `bootstrap()` after config resolution.
|
|
7
|
+
*
|
|
8
|
+
* @module extensions/orchestrate
|
|
9
|
+
*/
|
|
10
|
+
import * as defaultDiscovery from "./discovery.js";
|
|
11
|
+
import { loadExtensionFactory as defaultLoadFactory } from "./factory-loader.js";
|
|
12
|
+
import { ExtensionLoader } from "./loader.js";
|
|
13
|
+
import type { ExtensionConfigEntry, ExtensionLogger } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Options for `orchestrateExtensions`.
|
|
16
|
+
*
|
|
17
|
+
* The `discovery` and `loadFactory` fields are test seams — they are not
|
|
18
|
+
* part of the stable public API and default to the real implementations.
|
|
19
|
+
*/
|
|
20
|
+
export interface OrchestrateOptions {
|
|
21
|
+
projectDir: string;
|
|
22
|
+
config: {
|
|
23
|
+
extensions?: ExtensionConfigEntry[];
|
|
24
|
+
};
|
|
25
|
+
logger: ExtensionLogger;
|
|
26
|
+
/** @internal Override discovery functions in tests. */
|
|
27
|
+
discovery?: {
|
|
28
|
+
discoverPackageExtensions: typeof defaultDiscovery.discoverPackageExtensions;
|
|
29
|
+
discoverProjectExtensions: typeof defaultDiscovery.discoverProjectExtensions;
|
|
30
|
+
discoverLocalExtensions: typeof defaultDiscovery.discoverLocalExtensions;
|
|
31
|
+
mergeExtensions: typeof defaultDiscovery.mergeExtensions;
|
|
32
|
+
};
|
|
33
|
+
/** @internal Override factory loading in tests. */
|
|
34
|
+
loadFactory?: typeof defaultLoadFactory;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Run the full extension pipeline against a resolved project config.
|
|
38
|
+
*
|
|
39
|
+
* Pipeline:
|
|
40
|
+
* 1. Split `config.extensions` into resolved entries and disable directives.
|
|
41
|
+
* 2. Discover extensions from package, project, and local sources.
|
|
42
|
+
* 3. Skip loading factories for package- and project-source extensions whose
|
|
43
|
+
* names appear in the disable set (local-file names are not reliable
|
|
44
|
+
* pre-load and are filtered after `mergeExtensions`).
|
|
45
|
+
* 4. Dynamic-import factories for every remaining discovered path.
|
|
46
|
+
* 5. Merge sources honoring priority `config > package > project > local-file`.
|
|
47
|
+
* 6. Construct an `ExtensionLoader` and run `setupAll`.
|
|
48
|
+
*
|
|
49
|
+
* On factory error during `setup()`, `ExtensionLoader.setupAll` performs
|
|
50
|
+
* partial rollback internally. The error is re-thrown unchanged so callers
|
|
51
|
+
* can surface the extension name to the user.
|
|
52
|
+
*/
|
|
53
|
+
export declare function orchestrateExtensions(options: OrchestrateOptions): Promise<ExtensionLoader>;
|
|
54
|
+
//# sourceMappingURL=orchestrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrate.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/orchestrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,gBAAgB,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,oBAAoB,IAAI,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAEV,oBAAoB,EACpB,eAAe,EAGhB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE;QAAE,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAA;KAAE,CAAC;IAChD,MAAM,EAAE,eAAe,CAAC;IACxB,uDAAuD;IACvD,SAAS,CAAC,EAAE;QACV,yBAAyB,EAAE,OAAO,gBAAgB,CAAC,yBAAyB,CAAC;QAC7E,yBAAyB,EAAE,OAAO,gBAAgB,CAAC,yBAAyB,CAAC;QAC7E,uBAAuB,EAAE,OAAO,gBAAgB,CAAC,uBAAuB,CAAC;QACzE,eAAe,EAAE,OAAO,gBAAgB,CAAC,eAAe,CAAC;KAC1D,CAAC;IACF,mDAAmD;IACnD,WAAW,CAAC,EAAE,OAAO,kBAAkB,CAAC;CACzC;AAmCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA4E1B"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension orchestration pipeline.
|
|
3
|
+
*
|
|
4
|
+
* Discovers, loads, merges, sorts, and runs setup for every extension
|
|
5
|
+
* contributed by the four sources (config, package, project, local-file).
|
|
6
|
+
* Invoked once by `bootstrap()` after config resolution.
|
|
7
|
+
*
|
|
8
|
+
* @module extensions/orchestrate
|
|
9
|
+
*/
|
|
10
|
+
import { basename, dirname } from "../../deps/jsr.io/@std/path/1.1.4/mod.js";
|
|
11
|
+
import * as defaultDiscovery from "./discovery.js";
|
|
12
|
+
import { loadExtensionFactory as defaultLoadFactory } from "./factory-loader.js";
|
|
13
|
+
import { ExtensionLoader } from "./loader.js";
|
|
14
|
+
function isDisableDirective(entry) {
|
|
15
|
+
return (typeof entry === "object" &&
|
|
16
|
+
entry !== null &&
|
|
17
|
+
"enabled" in entry &&
|
|
18
|
+
entry.enabled === false);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract the extension name from a project-extension path.
|
|
22
|
+
*
|
|
23
|
+
* Project extensions live under `<baseDir>/extensions/<name>/...`. Discovery
|
|
24
|
+
* emits either `<baseDir>/extensions/<name>/src/index.ts` or
|
|
25
|
+
* `<baseDir>/extensions/<name>/index.ts`. This walks parent directories until
|
|
26
|
+
* it finds the ancestor whose parent is `extensions/`.
|
|
27
|
+
*/
|
|
28
|
+
function projectExtensionNameFromPath(path) {
|
|
29
|
+
let current = dirname(path);
|
|
30
|
+
// Safety limit in case of a malformed path that never reaches a root.
|
|
31
|
+
for (let i = 0; i < 8; i++) {
|
|
32
|
+
const parent = dirname(current);
|
|
33
|
+
if (basename(parent) === "extensions") {
|
|
34
|
+
return basename(current);
|
|
35
|
+
}
|
|
36
|
+
if (parent === current)
|
|
37
|
+
return undefined;
|
|
38
|
+
current = parent;
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run the full extension pipeline against a resolved project config.
|
|
44
|
+
*
|
|
45
|
+
* Pipeline:
|
|
46
|
+
* 1. Split `config.extensions` into resolved entries and disable directives.
|
|
47
|
+
* 2. Discover extensions from package, project, and local sources.
|
|
48
|
+
* 3. Skip loading factories for package- and project-source extensions whose
|
|
49
|
+
* names appear in the disable set (local-file names are not reliable
|
|
50
|
+
* pre-load and are filtered after `mergeExtensions`).
|
|
51
|
+
* 4. Dynamic-import factories for every remaining discovered path.
|
|
52
|
+
* 5. Merge sources honoring priority `config > package > project > local-file`.
|
|
53
|
+
* 6. Construct an `ExtensionLoader` and run `setupAll`.
|
|
54
|
+
*
|
|
55
|
+
* On factory error during `setup()`, `ExtensionLoader.setupAll` performs
|
|
56
|
+
* partial rollback internally. The error is re-thrown unchanged so callers
|
|
57
|
+
* can surface the extension name to the user.
|
|
58
|
+
*/
|
|
59
|
+
export async function orchestrateExtensions(options) {
|
|
60
|
+
const { projectDir, config, logger } = options;
|
|
61
|
+
const disc = options.discovery ?? defaultDiscovery;
|
|
62
|
+
const loadFactory = options.loadFactory ?? defaultLoadFactory;
|
|
63
|
+
const configEntries = Array.isArray(config.extensions) ? config.extensions : [];
|
|
64
|
+
const disables = [];
|
|
65
|
+
const configResolved = [];
|
|
66
|
+
for (const entry of configEntries) {
|
|
67
|
+
if (isDisableDirective(entry)) {
|
|
68
|
+
disables.push(entry);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
configResolved.push({
|
|
72
|
+
extension: entry,
|
|
73
|
+
source: "config",
|
|
74
|
+
origin: "veryfront.config",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Build the disabled-names set early so we can skip dynamic imports for
|
|
79
|
+
// extensions the user has explicitly turned off. A factory whose module
|
|
80
|
+
// fails to import or invoke would otherwise take down bootstrap even
|
|
81
|
+
// though the user asked for it to be disabled.
|
|
82
|
+
const disabledNames = new Set(disables.map((d) => d.name));
|
|
83
|
+
const [packageHits, projectPaths, localPaths] = await Promise.all([
|
|
84
|
+
disc.discoverPackageExtensions(projectDir),
|
|
85
|
+
disc.discoverProjectExtensions(projectDir),
|
|
86
|
+
disc.discoverLocalExtensions(projectDir),
|
|
87
|
+
]);
|
|
88
|
+
// Package hits carry the package name directly — filter before loading.
|
|
89
|
+
const enabledPackageNames = packageHits
|
|
90
|
+
.map((hit) => hit.packageName)
|
|
91
|
+
.filter((name) => !disabledNames.has(name));
|
|
92
|
+
// Project paths have the shape `<projectDir>/extensions/<name>/src/index.ts`
|
|
93
|
+
// (or `<projectDir>/extensions/<name>/index.ts`). `mergeExtensions` is the
|
|
94
|
+
// safety net for any path whose name cannot be derived.
|
|
95
|
+
const enabledProjectPaths = projectPaths.filter((path) => {
|
|
96
|
+
const name = projectExtensionNameFromPath(path);
|
|
97
|
+
return name === undefined || !disabledNames.has(name);
|
|
98
|
+
});
|
|
99
|
+
// Local-file paths cannot be reliably filtered pre-load: the filename
|
|
100
|
+
// (`foo.extension.ts`) is not guaranteed to match the extension name
|
|
101
|
+
// declared by the factory. `mergeExtensions` applies the post-hoc filter.
|
|
102
|
+
const packageResolved = await loadAllFactories(enabledPackageNames, "package", loadFactory);
|
|
103
|
+
const projectResolved = await loadAllFactories(enabledProjectPaths, "project", loadFactory);
|
|
104
|
+
const localResolved = await loadAllFactories(localPaths, "local-file", loadFactory);
|
|
105
|
+
const merged = disc.mergeExtensions(configResolved, packageResolved, projectResolved, localResolved, disables);
|
|
106
|
+
const loader = new ExtensionLoader(logger);
|
|
107
|
+
await loader.setupAll(merged, config);
|
|
108
|
+
return loader;
|
|
109
|
+
}
|
|
110
|
+
async function loadAllFactories(paths, source, loadFactory) {
|
|
111
|
+
const resolved = [];
|
|
112
|
+
for (const path of paths) {
|
|
113
|
+
resolved.push(await loadFactory(path, source));
|
|
114
|
+
}
|
|
115
|
+
return resolved;
|
|
116
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recommendations.d.ts","sourceRoot":"","sources":["../../../src/src/extensions/recommendations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Maps contract names to recommended first-party extension packages.
|
|
3
|
+
*
|
|
4
|
+
* @module extensions/recommendations
|
|
5
|
+
*/
|
|
6
|
+
const recommendations = new Map([
|
|
7
|
+
["Bundler", "@veryfront/ext-esbuild"],
|
|
8
|
+
["CacheStore", "@veryfront/ext-redis"],
|
|
9
|
+
["CSSProcessor", "@veryfront/ext-tailwind"],
|
|
10
|
+
["ContentTransformer", "@veryfront/ext-mdx"],
|
|
11
|
+
["DatabaseClient", "@veryfront/ext-postgres"],
|
|
12
|
+
["AuthProvider", "@veryfront/ext-jwt"],
|
|
13
|
+
["TracingExporter", "@veryfront/ext-opentelemetry"],
|
|
14
|
+
["AIModelProvider", "@veryfront/ext-openai"],
|
|
15
|
+
["EmbeddingProvider", "@veryfront/ext-embeddings"],
|
|
16
|
+
["CodeParser", "@veryfront/ext-babel"],
|
|
17
|
+
["SchemaValidator", "@veryfront/ext-zod"],
|
|
18
|
+
["NodeCompat", "@veryfront/ext-node-compat"],
|
|
19
|
+
]);
|
|
20
|
+
export function getRecommendation(contractName) {
|
|
21
|
+
return recommendations.get(contractName);
|
|
22
|
+
}
|