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,297 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { dynamicImport } from "../dynamic-import.js";
|
|
3
|
+
import { isBun as IS_BUN, isDeno as IS_DENO } from "../runtime.js";
|
|
4
|
+
import { isWindowsPlatform, runtimeProcess } from "./runtime-process.js";
|
|
5
|
+
|
|
6
|
+
export interface CommandResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
code: number;
|
|
9
|
+
stdout?: string;
|
|
10
|
+
stderr?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface CommandOptions {
|
|
14
|
+
args?: string[];
|
|
15
|
+
cwd?: string;
|
|
16
|
+
env?: Record<string, string>;
|
|
17
|
+
/** Capture stdout/stderr to return in result */
|
|
18
|
+
capture?: boolean;
|
|
19
|
+
/** Inherit stdio from parent process (shows output in terminal) */
|
|
20
|
+
inherit?: boolean;
|
|
21
|
+
/** Use shell to run the command (needed for .cmd files on Windows) */
|
|
22
|
+
shell?: boolean;
|
|
23
|
+
/** Kill the command if it exceeds this duration (milliseconds) */
|
|
24
|
+
timeoutMs?: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const COMMAND_TIMEOUT_EXIT_CODE = 124;
|
|
28
|
+
const FORCE_KILL_GRACE_MS = 250;
|
|
29
|
+
|
|
30
|
+
function createTimeoutResult(
|
|
31
|
+
timeoutMs: number,
|
|
32
|
+
stdout?: string,
|
|
33
|
+
stderr?: string,
|
|
34
|
+
): CommandResult {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
code: COMMAND_TIMEOUT_EXIT_CODE,
|
|
38
|
+
stdout,
|
|
39
|
+
stderr: `${stderr ?? ""}\nCommand timed out after ${timeoutMs}ms`.trim(),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function createProcessTimeout(
|
|
44
|
+
timeoutMs: number | undefined,
|
|
45
|
+
terminate: () => void,
|
|
46
|
+
forceTerminate: () => void,
|
|
47
|
+
): { hasTimedOut: () => boolean; clear: () => void } {
|
|
48
|
+
let timedOut = false;
|
|
49
|
+
let timeoutId: ReturnType<typeof dntShim.setTimeout> | undefined;
|
|
50
|
+
let forceKillId: ReturnType<typeof dntShim.setTimeout> | undefined;
|
|
51
|
+
|
|
52
|
+
if (timeoutMs && timeoutMs > 0) {
|
|
53
|
+
timeoutId = dntShim.setTimeout(() => {
|
|
54
|
+
timedOut = true;
|
|
55
|
+
try {
|
|
56
|
+
terminate();
|
|
57
|
+
} catch (_) {
|
|
58
|
+
/* expected: best-effort terminate may fail if process already exited */
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
forceKillId = dntShim.setTimeout(() => {
|
|
62
|
+
try {
|
|
63
|
+
forceTerminate();
|
|
64
|
+
} catch (_) {
|
|
65
|
+
/* expected: best-effort force terminate may fail if process already exited */
|
|
66
|
+
}
|
|
67
|
+
}, FORCE_KILL_GRACE_MS);
|
|
68
|
+
}, timeoutMs);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
hasTimedOut: () => timedOut,
|
|
73
|
+
clear: () => {
|
|
74
|
+
if (timeoutId) clearTimeout(timeoutId);
|
|
75
|
+
if (forceKillId) clearTimeout(forceKillId);
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function readStreamToString(stream: ReadableStream<Uint8Array>): Promise<string> {
|
|
81
|
+
const reader = stream.getReader();
|
|
82
|
+
const chunks: Uint8Array[] = [];
|
|
83
|
+
|
|
84
|
+
while (true) {
|
|
85
|
+
const { done, value } = await reader.read();
|
|
86
|
+
if (done) break;
|
|
87
|
+
if (value) chunks.push(value);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const total = chunks.reduce((acc, c) => acc + c.length, 0);
|
|
91
|
+
const merged = new Uint8Array(total);
|
|
92
|
+
let offset = 0;
|
|
93
|
+
|
|
94
|
+
for (const chunk of chunks) {
|
|
95
|
+
merged.set(chunk, offset);
|
|
96
|
+
offset += chunk.length;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return new TextDecoder().decode(merged);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Run a command and return the result.
|
|
104
|
+
* Works across Deno, Node.js, and Bun.
|
|
105
|
+
*
|
|
106
|
+
* @param cmd - Command to run
|
|
107
|
+
* @param options - Command options
|
|
108
|
+
* @param options.capture - Capture stdout/stderr to return in result
|
|
109
|
+
* @param options.inherit - Inherit stdio from parent (shows output in terminal)
|
|
110
|
+
* @param options.shell - Use shell to run command (needed for .cmd on Windows)
|
|
111
|
+
*/
|
|
112
|
+
export async function runCommand(
|
|
113
|
+
cmd: string,
|
|
114
|
+
options: CommandOptions = {},
|
|
115
|
+
): Promise<CommandResult> {
|
|
116
|
+
const {
|
|
117
|
+
args = [],
|
|
118
|
+
cwd: cmdCwd,
|
|
119
|
+
env: cmdEnv,
|
|
120
|
+
capture = false,
|
|
121
|
+
inherit = false,
|
|
122
|
+
shell = false,
|
|
123
|
+
timeoutMs,
|
|
124
|
+
} = options;
|
|
125
|
+
const effectiveTimeoutMs = timeoutMs && timeoutMs > 0 ? Math.floor(timeoutMs) : undefined;
|
|
126
|
+
|
|
127
|
+
// Determine stdio mode: inherit > capture > null
|
|
128
|
+
const stdioMode = inherit ? "inherit" : capture ? "piped" : "null";
|
|
129
|
+
|
|
130
|
+
if (IS_DENO) {
|
|
131
|
+
const command = new dntShim.Deno.Command(cmd, {
|
|
132
|
+
args,
|
|
133
|
+
cwd: cmdCwd,
|
|
134
|
+
env: cmdEnv,
|
|
135
|
+
stdin: inherit ? "inherit" : "null",
|
|
136
|
+
stdout: stdioMode,
|
|
137
|
+
stderr: stdioMode,
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
const child = command.spawn();
|
|
141
|
+
const timeout = createProcessTimeout(
|
|
142
|
+
effectiveTimeoutMs,
|
|
143
|
+
() => child.kill("SIGTERM"),
|
|
144
|
+
() => child.kill("SIGKILL"),
|
|
145
|
+
);
|
|
146
|
+
|
|
147
|
+
try {
|
|
148
|
+
const [status, stdout, stderr] = await Promise.all([
|
|
149
|
+
child.status,
|
|
150
|
+
capture && child.stdout ? readStreamToString(child.stdout) : Promise.resolve(undefined),
|
|
151
|
+
capture && child.stderr ? readStreamToString(child.stderr) : Promise.resolve(undefined),
|
|
152
|
+
]);
|
|
153
|
+
|
|
154
|
+
if (timeout.hasTimedOut()) {
|
|
155
|
+
return createTimeoutResult(effectiveTimeoutMs ?? 0, stdout, stderr);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
success: status.success,
|
|
160
|
+
code: status.code,
|
|
161
|
+
stdout,
|
|
162
|
+
stderr,
|
|
163
|
+
};
|
|
164
|
+
} finally {
|
|
165
|
+
timeout.clear();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (IS_BUN) {
|
|
170
|
+
const bunGlobal = dntShim.dntGlobalThis as unknown as {
|
|
171
|
+
Bun: {
|
|
172
|
+
spawn: (options: {
|
|
173
|
+
cmd: string[];
|
|
174
|
+
cwd?: string;
|
|
175
|
+
env?: Record<string, string>;
|
|
176
|
+
stdout?: "pipe" | "inherit" | "ignore";
|
|
177
|
+
stderr?: "pipe" | "inherit" | "ignore";
|
|
178
|
+
}) => {
|
|
179
|
+
exited: Promise<number>;
|
|
180
|
+
stdout: ReadableStream<Uint8Array> | null;
|
|
181
|
+
stderr: ReadableStream<Uint8Array> | null;
|
|
182
|
+
kill?: (signal?: string | number) => void;
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const bunStdio = inherit ? "inherit" : capture ? "pipe" : "ignore";
|
|
188
|
+
|
|
189
|
+
const isWindows = isWindowsPlatform();
|
|
190
|
+
const bunCmd = shell
|
|
191
|
+
? args.length === 0
|
|
192
|
+
? isWindows ? ["cmd", "/c", cmd] : ["sh", "-c", cmd]
|
|
193
|
+
: isWindows
|
|
194
|
+
? ["cmd", "/c", cmd, ...args]
|
|
195
|
+
: ["sh", "-c", 'exec "$@"', "sh", cmd, ...args]
|
|
196
|
+
: [cmd, ...args];
|
|
197
|
+
|
|
198
|
+
const proc = bunGlobal.Bun.spawn({
|
|
199
|
+
cmd: bunCmd,
|
|
200
|
+
cwd: cmdCwd,
|
|
201
|
+
env: cmdEnv,
|
|
202
|
+
stdout: bunStdio,
|
|
203
|
+
stderr: bunStdio,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const timeout = createProcessTimeout(
|
|
207
|
+
effectiveTimeoutMs,
|
|
208
|
+
() => proc.kill?.("SIGTERM"),
|
|
209
|
+
() => proc.kill?.("SIGKILL"),
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const [code, stdout, stderr] = await Promise.all([
|
|
214
|
+
proc.exited,
|
|
215
|
+
capture && proc.stdout ? readStreamToString(proc.stdout) : Promise.resolve(undefined),
|
|
216
|
+
capture && proc.stderr ? readStreamToString(proc.stderr) : Promise.resolve(undefined),
|
|
217
|
+
]);
|
|
218
|
+
|
|
219
|
+
if (timeout.hasTimedOut()) {
|
|
220
|
+
return createTimeoutResult(effectiveTimeoutMs ?? 0, stdout, stderr);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return { success: code === 0, code, stdout, stderr };
|
|
224
|
+
} finally {
|
|
225
|
+
timeout.clear();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (!runtimeProcess) return { success: false, code: 1 };
|
|
230
|
+
const process = runtimeProcess;
|
|
231
|
+
|
|
232
|
+
const { spawn } = await dynamicImport<typeof import("node:child_process")>("node:child_process");
|
|
233
|
+
|
|
234
|
+
const nodeStdio: [
|
|
235
|
+
"ignore" | "inherit" | "pipe",
|
|
236
|
+
"ignore" | "inherit" | "pipe",
|
|
237
|
+
"ignore" | "inherit" | "pipe",
|
|
238
|
+
] = inherit
|
|
239
|
+
? ["inherit", "inherit", "inherit"]
|
|
240
|
+
: capture
|
|
241
|
+
? ["ignore", "pipe", "pipe"]
|
|
242
|
+
: ["ignore", "ignore", "ignore"];
|
|
243
|
+
|
|
244
|
+
return await new Promise((resolve) => {
|
|
245
|
+
const child = spawn(cmd, args, {
|
|
246
|
+
cwd: cmdCwd,
|
|
247
|
+
env: cmdEnv ? { ...process.env, ...cmdEnv } : undefined,
|
|
248
|
+
stdio: nodeStdio,
|
|
249
|
+
shell,
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
let stdout = "";
|
|
253
|
+
let stderr = "";
|
|
254
|
+
const decoder = new TextDecoder();
|
|
255
|
+
const timeout = createProcessTimeout(
|
|
256
|
+
effectiveTimeoutMs,
|
|
257
|
+
() => child.kill("SIGTERM"),
|
|
258
|
+
() => child.kill("SIGKILL"),
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
if (capture) {
|
|
262
|
+
child.stdout?.on("data", (data: Uint8Array) => {
|
|
263
|
+
stdout += decoder.decode(data);
|
|
264
|
+
});
|
|
265
|
+
child.stderr?.on("data", (data: Uint8Array) => {
|
|
266
|
+
stderr += decoder.decode(data);
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
child.on("close", (code) => {
|
|
271
|
+
timeout.clear();
|
|
272
|
+
|
|
273
|
+
if (timeout.hasTimedOut()) {
|
|
274
|
+
resolve(
|
|
275
|
+
createTimeoutResult(
|
|
276
|
+
effectiveTimeoutMs ?? 0,
|
|
277
|
+
capture ? stdout : undefined,
|
|
278
|
+
capture ? stderr : undefined,
|
|
279
|
+
),
|
|
280
|
+
);
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
resolve({
|
|
285
|
+
success: code === 0,
|
|
286
|
+
code: code ?? 1,
|
|
287
|
+
stdout: capture ? stdout : undefined,
|
|
288
|
+
stderr: capture ? stderr : undefined,
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
child.on("error", () => {
|
|
293
|
+
timeout.clear();
|
|
294
|
+
resolve({ success: false, code: 1 });
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import * as dntShim from "../../../../_dnt.shims.js";
|
|
2
|
+
import { isDeno as IS_DENO } from "../runtime.js";
|
|
3
|
+
import { runtimeProcess } from "./runtime-process.js";
|
|
4
|
+
|
|
5
|
+
type EnvOverlayValue = string | null;
|
|
6
|
+
type EnvOverlayStore = Map<string, EnvOverlayValue>;
|
|
7
|
+
|
|
8
|
+
export type EnvOverlayStorage = {
|
|
9
|
+
getStore: () => unknown;
|
|
10
|
+
run?: <T>(store: unknown, fn: () => T) => T;
|
|
11
|
+
enterWith?: (store: unknown) => void;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function getEnvOverlayStore(): EnvOverlayStore | null {
|
|
15
|
+
const storage = getEnvOverlayStorage();
|
|
16
|
+
const store = storage?.getStore();
|
|
17
|
+
return store instanceof Map ? store as EnvOverlayStore : null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function getOverlayEnvValue(
|
|
21
|
+
store: EnvOverlayStore | null,
|
|
22
|
+
key: string,
|
|
23
|
+
): { hasValue: boolean; value: string | undefined } {
|
|
24
|
+
if (!store?.has(key)) {
|
|
25
|
+
return { hasValue: false, value: undefined };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const value = store.get(key);
|
|
29
|
+
return { hasValue: true, value: value ?? undefined };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function env(): Record<string, string> {
|
|
33
|
+
const base = IS_DENO
|
|
34
|
+
? dntShim.Deno.env.toObject()
|
|
35
|
+
: runtimeProcess
|
|
36
|
+
? { ...runtimeProcess.env } as Record<string, string>
|
|
37
|
+
: {};
|
|
38
|
+
|
|
39
|
+
const overlay = getEnvOverlayStore();
|
|
40
|
+
if (!overlay) return base;
|
|
41
|
+
|
|
42
|
+
for (const [key, value] of overlay.entries()) {
|
|
43
|
+
if (value === null) {
|
|
44
|
+
delete base[key];
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
base[key] = value;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return base;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Read a host-level environment variable without consulting any project env overlay.
|
|
55
|
+
* Use this for framework-owned runtime configuration that should not be shadowed by tenant env.
|
|
56
|
+
*/
|
|
57
|
+
export function getHostEnv(key: string): string | undefined {
|
|
58
|
+
const overlayResult = getOverlayEnvValue(getEnvOverlayStore(), key);
|
|
59
|
+
if (overlayResult.hasValue) {
|
|
60
|
+
return overlayResult.value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (IS_DENO) return dntShim.Deno.env.get(key);
|
|
64
|
+
if (runtimeProcess) return runtimeProcess.env[key];
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Lazy-loaded references to project-env/storage.ts functions.
|
|
69
|
+
// Uses globalThis to avoid circular imports (process compat is low-level, project-env is high-level).
|
|
70
|
+
// IMPORTANT: Only cache when the real getter is found. If storage.ts hasn't loaded yet,
|
|
71
|
+
// re-check globalThis on every call to avoid permanently caching the fallback.
|
|
72
|
+
let _getProjectEnv: ((key: string) => string | undefined) | null = null;
|
|
73
|
+
let _isProjectEnvActive: (() => boolean) | null = null;
|
|
74
|
+
|
|
75
|
+
function getProjectEnvSafe(key: string): string | undefined {
|
|
76
|
+
if (_getProjectEnv === null) {
|
|
77
|
+
const mod = (dntShim.dntGlobalThis as Record<string, unknown>).__vfProjectEnvGetter as
|
|
78
|
+
| ((key: string) => string | undefined)
|
|
79
|
+
| undefined;
|
|
80
|
+
if (mod) {
|
|
81
|
+
_getProjectEnv = mod;
|
|
82
|
+
} else {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return _getProjectEnv(key);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function isProjectEnvActiveSafe(): boolean {
|
|
90
|
+
if (_isProjectEnvActive === null) {
|
|
91
|
+
const mod = (dntShim.dntGlobalThis as Record<string, unknown>).__vfProjectEnvActiveChecker as
|
|
92
|
+
| (() => boolean)
|
|
93
|
+
| undefined;
|
|
94
|
+
if (mod) {
|
|
95
|
+
_isProjectEnvActive = mod;
|
|
96
|
+
} else {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return _isProjectEnvActive();
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function getEnv(key: string): string | undefined {
|
|
104
|
+
// Check per-request project env overlay first (AsyncLocalStorage)
|
|
105
|
+
const projectValue = getProjectEnvSafe(key);
|
|
106
|
+
if (projectValue !== undefined) return projectValue;
|
|
107
|
+
|
|
108
|
+
// When a project env overlay is active (remote project request), do NOT
|
|
109
|
+
// fall through to host process env. This prevents remote projects from
|
|
110
|
+
// reading host-level secrets like AWS_SECRET_ACCESS_KEY, DATABASE_URL, etc.
|
|
111
|
+
if (isProjectEnvActiveSafe()) return undefined;
|
|
112
|
+
|
|
113
|
+
return getHostEnv(key);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const DEFAULT_ENV_TRUE_VALUES = ["1", "true", "yes"] as const;
|
|
117
|
+
const DEFAULT_ENV_FALSE_VALUES = ["0", "false", "no"] as const;
|
|
118
|
+
|
|
119
|
+
export interface EnvBooleanOptions {
|
|
120
|
+
trueValues?: readonly string[];
|
|
121
|
+
falseValues?: readonly string[];
|
|
122
|
+
trim?: boolean;
|
|
123
|
+
caseSensitive?: boolean;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function normalizeEnvToken(
|
|
127
|
+
value: string,
|
|
128
|
+
options: { trim: boolean; caseSensitive: boolean },
|
|
129
|
+
): string {
|
|
130
|
+
const normalized = options.trim ? value.trim() : value;
|
|
131
|
+
return options.caseSensitive ? normalized : normalized.toLowerCase();
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function getEnvString(key: string): string | undefined;
|
|
135
|
+
export function getEnvString(key: string, fallback: string): string;
|
|
136
|
+
export function getEnvString(key: string, fallback?: string): string | undefined {
|
|
137
|
+
const value = getEnv(key);
|
|
138
|
+
if (value === undefined) return fallback;
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export function getEnvNumber(key: string): number | undefined;
|
|
143
|
+
export function getEnvNumber(key: string, fallback: number): number;
|
|
144
|
+
export function getEnvNumber(key: string, fallback?: number): number | undefined {
|
|
145
|
+
const value = getEnvString(key);
|
|
146
|
+
if (value === undefined) return fallback;
|
|
147
|
+
|
|
148
|
+
const parsed = Number.parseInt(value, 10);
|
|
149
|
+
if (Number.isNaN(parsed)) return fallback ?? Number.NaN;
|
|
150
|
+
return parsed;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function getEnvBoolean(
|
|
154
|
+
key: string,
|
|
155
|
+
fallback = false,
|
|
156
|
+
options: EnvBooleanOptions = {},
|
|
157
|
+
): boolean {
|
|
158
|
+
const value = getEnvString(key);
|
|
159
|
+
if (value === undefined) return fallback;
|
|
160
|
+
|
|
161
|
+
const trim = options.trim ?? true;
|
|
162
|
+
const caseSensitive = options.caseSensitive ?? false;
|
|
163
|
+
const normalized = normalizeEnvToken(value, { trim, caseSensitive });
|
|
164
|
+
|
|
165
|
+
const trueValues = options.trueValues ?? DEFAULT_ENV_TRUE_VALUES;
|
|
166
|
+
for (const trueValue of trueValues) {
|
|
167
|
+
if (normalized === normalizeEnvToken(trueValue, { trim, caseSensitive })) return true;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const falseValues = options.falseValues ?? DEFAULT_ENV_FALSE_VALUES;
|
|
171
|
+
for (const falseValue of falseValues) {
|
|
172
|
+
if (normalized === normalizeEnvToken(falseValue, { trim, caseSensitive })) return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return fallback;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export function setEnv(key: string, value: string): void {
|
|
179
|
+
const overlay = getEnvOverlayStore();
|
|
180
|
+
if (overlay) {
|
|
181
|
+
overlay.set(key, value);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
if (IS_DENO) {
|
|
186
|
+
dntShim.Deno.env.set(key, value);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (runtimeProcess) {
|
|
190
|
+
runtimeProcess.env[key] = value;
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
throw new Error("setEnv() is not supported in this runtime");
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function deleteEnv(key: string): void {
|
|
197
|
+
const overlay = getEnvOverlayStore();
|
|
198
|
+
if (overlay) {
|
|
199
|
+
overlay.set(key, null);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (IS_DENO) {
|
|
204
|
+
dntShim.Deno.env.delete(key);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (runtimeProcess) {
|
|
208
|
+
delete runtimeProcess.env[key];
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
throw new Error("deleteEnv() is not supported in this runtime");
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Get an AsyncLocalStorage-based env overlay storage if installed.
|
|
216
|
+
* This enables per-async-context env isolation (e.g., in tests).
|
|
217
|
+
*/
|
|
218
|
+
export function getEnvOverlayStorage(): EnvOverlayStorage | null {
|
|
219
|
+
const globalAny = dntShim.dntGlobalThis as Record<string, unknown>;
|
|
220
|
+
const overlay =
|
|
221
|
+
(globalAny["__vfTestDenoEnvOverlay"] as { storage?: EnvOverlayStorage } | undefined) ??
|
|
222
|
+
(globalAny["__vfTestEnvOverlay"] as { storage?: EnvOverlayStorage } | undefined);
|
|
223
|
+
|
|
224
|
+
const storage = overlay?.storage;
|
|
225
|
+
if (!storage || typeof storage.getStore !== "function") return null;
|
|
226
|
+
return storage;
|
|
227
|
+
}
|