@herdctl/core 0.0.1 → 0.0.2
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/dist/config/__tests__/agent.test.js +31 -13
- package/dist/config/__tests__/agent.test.js.map +1 -1
- package/dist/config/__tests__/merge.test.js +9 -2
- package/dist/config/__tests__/merge.test.js.map +1 -1
- package/dist/config/__tests__/schema.test.js +350 -1
- package/dist/config/__tests__/schema.test.js.map +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +828 -24
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +118 -6
- package/dist/config/schema.js.map +1 -1
- package/dist/fleet-manager/__tests__/coverage.test.js +11 -332
- package/dist/fleet-manager/__tests__/coverage.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/errors.test.js +1 -49
- package/dist/fleet-manager/__tests__/errors.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/integration.test.js +109 -0
- package/dist/fleet-manager/__tests__/integration.test.js.map +1 -1
- package/dist/fleet-manager/__tests__/reload.test.js +1 -1
- package/dist/fleet-manager/__tests__/reload.test.js.map +1 -1
- package/dist/fleet-manager/config-reload.d.ts +164 -0
- package/dist/fleet-manager/config-reload.d.ts.map +1 -0
- package/dist/fleet-manager/config-reload.js +445 -0
- package/dist/fleet-manager/config-reload.js.map +1 -0
- package/dist/fleet-manager/context.d.ts +76 -0
- package/dist/fleet-manager/context.d.ts.map +1 -0
- package/dist/fleet-manager/context.js +11 -0
- package/dist/fleet-manager/context.js.map +1 -0
- package/dist/fleet-manager/errors.d.ts +0 -25
- package/dist/fleet-manager/errors.d.ts.map +1 -1
- package/dist/fleet-manager/errors.js +0 -38
- package/dist/fleet-manager/errors.js.map +1 -1
- package/dist/fleet-manager/event-emitters.d.ts +123 -0
- package/dist/fleet-manager/event-emitters.d.ts.map +1 -0
- package/dist/fleet-manager/event-emitters.js +136 -0
- package/dist/fleet-manager/event-emitters.js.map +1 -0
- package/dist/fleet-manager/event-types.d.ts +0 -15
- package/dist/fleet-manager/event-types.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.d.ts +40 -653
- package/dist/fleet-manager/fleet-manager.d.ts.map +1 -1
- package/dist/fleet-manager/fleet-manager.js +95 -1720
- package/dist/fleet-manager/fleet-manager.js.map +1 -1
- package/dist/fleet-manager/index.d.ts +13 -2
- package/dist/fleet-manager/index.d.ts.map +1 -1
- package/dist/fleet-manager/index.js +19 -6
- package/dist/fleet-manager/index.js.map +1 -1
- package/dist/fleet-manager/job-control.d.ts +64 -0
- package/dist/fleet-manager/job-control.d.ts.map +1 -0
- package/dist/fleet-manager/job-control.js +296 -0
- package/dist/fleet-manager/job-control.js.map +1 -0
- package/dist/fleet-manager/log-streaming.d.ts +171 -0
- package/dist/fleet-manager/log-streaming.d.ts.map +1 -0
- package/dist/fleet-manager/log-streaming.js +503 -0
- package/dist/fleet-manager/log-streaming.js.map +1 -0
- package/dist/fleet-manager/schedule-executor.d.ts +63 -0
- package/dist/fleet-manager/schedule-executor.d.ts.map +1 -0
- package/dist/fleet-manager/schedule-executor.js +209 -0
- package/dist/fleet-manager/schedule-executor.js.map +1 -0
- package/dist/fleet-manager/schedule-management.d.ts +71 -0
- package/dist/fleet-manager/schedule-management.d.ts.map +1 -0
- package/dist/fleet-manager/schedule-management.js +171 -0
- package/dist/fleet-manager/schedule-management.js.map +1 -0
- package/dist/fleet-manager/status-queries.d.ts +105 -0
- package/dist/fleet-manager/status-queries.d.ts.map +1 -0
- package/dist/fleet-manager/status-queries.js +247 -0
- package/dist/fleet-manager/status-queries.js.map +1 -0
- package/dist/fleet-manager/types.d.ts +0 -39
- package/dist/fleet-manager/types.d.ts.map +1 -1
- package/dist/runner/__tests__/job-executor.test.js +206 -1
- package/dist/runner/__tests__/job-executor.test.js.map +1 -1
- package/dist/runner/job-executor.d.ts +9 -0
- package/dist/runner/job-executor.d.ts.map +1 -1
- package/dist/runner/job-executor.js +78 -4
- package/dist/runner/job-executor.js.map +1 -1
- package/dist/runner/types.d.ts +2 -0
- package/dist/runner/types.d.ts.map +1 -1
- package/dist/scheduler/__tests__/cron.test.d.ts +2 -0
- package/dist/scheduler/__tests__/cron.test.d.ts.map +1 -0
- package/dist/scheduler/__tests__/cron.test.js +867 -0
- package/dist/scheduler/__tests__/cron.test.js.map +1 -0
- package/dist/scheduler/__tests__/scheduler.test.js +164 -5
- package/dist/scheduler/__tests__/scheduler.test.js.map +1 -1
- package/dist/scheduler/cron.d.ts +126 -0
- package/dist/scheduler/cron.d.ts.map +1 -0
- package/dist/scheduler/cron.js +390 -0
- package/dist/scheduler/cron.js.map +1 -0
- package/dist/scheduler/errors.d.ts +81 -1
- package/dist/scheduler/errors.d.ts.map +1 -1
- package/dist/scheduler/errors.js +81 -6
- package/dist/scheduler/errors.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -0
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/schedule-runner.d.ts +2 -2
- package/dist/scheduler/schedule-runner.d.ts.map +1 -1
- package/dist/scheduler/schedule-runner.js +20 -8
- package/dist/scheduler/schedule-runner.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +4 -4
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +86 -20
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +1 -1
- package/dist/scheduler/types.d.ts.map +1 -1
- package/dist/state/schemas/job-metadata.d.ts +2 -2
- package/package.json +33 -8
- package/.turbo/turbo-build.log +0 -4
- package/.turbo/turbo-test.log +0 -219
- package/.turbo/turbo-typecheck.log +0 -4
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-final.json +0 -51
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -251
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/config/index.html +0 -191
- package/coverage/src/config/index.ts.html +0 -442
- package/coverage/src/config/interpolate.ts.html +0 -652
- package/coverage/src/config/loader.ts.html +0 -1501
- package/coverage/src/config/merge.ts.html +0 -823
- package/coverage/src/config/parser.ts.html +0 -1213
- package/coverage/src/config/schema.ts.html +0 -1123
- package/coverage/src/fleet-manager/errors.ts.html +0 -2326
- package/coverage/src/fleet-manager/event-types.ts.html +0 -1219
- package/coverage/src/fleet-manager/fleet-manager.ts.html +0 -7030
- package/coverage/src/fleet-manager/index.html +0 -206
- package/coverage/src/fleet-manager/index.ts.html +0 -469
- package/coverage/src/fleet-manager/job-manager.ts.html +0 -2074
- package/coverage/src/fleet-manager/job-queue.ts.html +0 -2479
- package/coverage/src/fleet-manager/types.ts.html +0 -2602
- package/coverage/src/index.html +0 -116
- package/coverage/src/index.ts.html +0 -181
- package/coverage/src/runner/errors.ts.html +0 -1006
- package/coverage/src/runner/index.html +0 -191
- package/coverage/src/runner/index.ts.html +0 -256
- package/coverage/src/runner/job-executor.ts.html +0 -1429
- package/coverage/src/runner/message-processor.ts.html +0 -1150
- package/coverage/src/runner/sdk-adapter.ts.html +0 -658
- package/coverage/src/runner/types.ts.html +0 -559
- package/coverage/src/scheduler/errors.ts.html +0 -388
- package/coverage/src/scheduler/index.html +0 -206
- package/coverage/src/scheduler/index.ts.html +0 -244
- package/coverage/src/scheduler/interval.ts.html +0 -652
- package/coverage/src/scheduler/schedule-runner.ts.html +0 -1411
- package/coverage/src/scheduler/schedule-state.ts.html +0 -718
- package/coverage/src/scheduler/scheduler.ts.html +0 -1795
- package/coverage/src/scheduler/types.ts.html +0 -733
- package/coverage/src/state/directory.ts.html +0 -736
- package/coverage/src/state/errors.ts.html +0 -376
- package/coverage/src/state/fleet-state.ts.html +0 -937
- package/coverage/src/state/index.html +0 -221
- package/coverage/src/state/index.ts.html +0 -322
- package/coverage/src/state/job-metadata.ts.html +0 -1420
- package/coverage/src/state/job-output.ts.html +0 -1033
- package/coverage/src/state/schemas/fleet-state.ts.html +0 -445
- package/coverage/src/state/schemas/index.html +0 -176
- package/coverage/src/state/schemas/index.ts.html +0 -286
- package/coverage/src/state/schemas/job-metadata.ts.html +0 -628
- package/coverage/src/state/schemas/job-output.ts.html +0 -616
- package/coverage/src/state/schemas/session-info.ts.html +0 -361
- package/coverage/src/state/session.ts.html +0 -844
- package/coverage/src/state/types.ts.html +0 -262
- package/coverage/src/state/utils/atomic.ts.html +0 -748
- package/coverage/src/state/utils/index.html +0 -146
- package/coverage/src/state/utils/index.ts.html +0 -103
- package/coverage/src/state/utils/reads.ts.html +0 -1621
- package/coverage/src/work-sources/adapters/github.ts.html +0 -3583
- package/coverage/src/work-sources/adapters/index.html +0 -131
- package/coverage/src/work-sources/adapters/index.ts.html +0 -277
- package/coverage/src/work-sources/errors.ts.html +0 -298
- package/coverage/src/work-sources/index.html +0 -176
- package/coverage/src/work-sources/index.ts.html +0 -529
- package/coverage/src/work-sources/manager.ts.html +0 -1324
- package/coverage/src/work-sources/registry.ts.html +0 -619
- package/coverage/src/work-sources/types.ts.html +0 -568
- package/dist/fleet-manager/__tests__/event-helpers.test.d.ts +0 -7
- package/dist/fleet-manager/__tests__/event-helpers.test.d.ts.map +0 -1
- package/dist/fleet-manager/__tests__/event-helpers.test.js +0 -368
- package/dist/fleet-manager/__tests__/event-helpers.test.js.map +0 -1
- package/src/config/__tests__/agent.test.ts +0 -864
- package/src/config/__tests__/interpolate.test.ts +0 -644
- package/src/config/__tests__/loader.test.ts +0 -784
- package/src/config/__tests__/merge.test.ts +0 -751
- package/src/config/__tests__/parser.test.ts +0 -533
- package/src/config/__tests__/schema.test.ts +0 -873
- package/src/config/index.ts +0 -119
- package/src/config/interpolate.ts +0 -189
- package/src/config/loader.ts +0 -472
- package/src/config/merge.ts +0 -246
- package/src/config/parser.ts +0 -376
- package/src/config/schema.ts +0 -346
- package/src/fleet-manager/__tests__/coverage.test.ts +0 -2869
- package/src/fleet-manager/__tests__/errors.test.ts +0 -660
- package/src/fleet-manager/__tests__/event-helpers.test.ts +0 -448
- package/src/fleet-manager/__tests__/integration.test.ts +0 -1209
- package/src/fleet-manager/__tests__/job-control.test.ts +0 -283
- package/src/fleet-manager/__tests__/job-manager.test.ts +0 -869
- package/src/fleet-manager/__tests__/job-queue.test.ts +0 -401
- package/src/fleet-manager/__tests__/reload.test.ts +0 -751
- package/src/fleet-manager/__tests__/status-queries.test.ts +0 -595
- package/src/fleet-manager/__tests__/trigger.test.ts +0 -601
- package/src/fleet-manager/errors.ts +0 -747
- package/src/fleet-manager/event-types.ts +0 -378
- package/src/fleet-manager/fleet-manager.ts +0 -2315
- package/src/fleet-manager/index.ts +0 -128
- package/src/fleet-manager/job-manager.ts +0 -663
- package/src/fleet-manager/job-queue.ts +0 -798
- package/src/fleet-manager/types.ts +0 -839
- package/src/index.ts +0 -32
- package/src/runner/__tests__/errors.test.ts +0 -382
- package/src/runner/__tests__/job-executor.test.ts +0 -1708
- package/src/runner/__tests__/message-processor.test.ts +0 -960
- package/src/runner/__tests__/sdk-adapter.test.ts +0 -626
- package/src/runner/errors.ts +0 -307
- package/src/runner/index.ts +0 -57
- package/src/runner/job-executor.ts +0 -448
- package/src/runner/message-processor.ts +0 -355
- package/src/runner/sdk-adapter.ts +0 -191
- package/src/runner/types.ts +0 -158
- package/src/scheduler/__tests__/errors.test.ts +0 -159
- package/src/scheduler/__tests__/interval.test.ts +0 -515
- package/src/scheduler/__tests__/schedule-runner.test.ts +0 -798
- package/src/scheduler/__tests__/schedule-state.test.ts +0 -671
- package/src/scheduler/__tests__/scheduler.test.ts +0 -1280
- package/src/scheduler/errors.ts +0 -101
- package/src/scheduler/index.ts +0 -53
- package/src/scheduler/interval.ts +0 -189
- package/src/scheduler/schedule-runner.ts +0 -442
- package/src/scheduler/schedule-state.ts +0 -211
- package/src/scheduler/scheduler.ts +0 -570
- package/src/scheduler/types.ts +0 -216
- package/src/state/__tests__/directory.test.ts +0 -595
- package/src/state/__tests__/fleet-state.test.ts +0 -868
- package/src/state/__tests__/job-metadata-schema.test.ts +0 -414
- package/src/state/__tests__/job-metadata.test.ts +0 -831
- package/src/state/__tests__/job-output.test.ts +0 -856
- package/src/state/__tests__/session-schema.test.ts +0 -378
- package/src/state/__tests__/session.test.ts +0 -604
- package/src/state/directory.ts +0 -217
- package/src/state/errors.ts +0 -97
- package/src/state/fleet-state.ts +0 -284
- package/src/state/index.ts +0 -79
- package/src/state/job-metadata.ts +0 -445
- package/src/state/job-output.ts +0 -316
- package/src/state/schemas/__tests__/job-output.test.ts +0 -338
- package/src/state/schemas/fleet-state.ts +0 -120
- package/src/state/schemas/index.ts +0 -67
- package/src/state/schemas/job-metadata.ts +0 -181
- package/src/state/schemas/job-output.ts +0 -177
- package/src/state/schemas/session-info.ts +0 -92
- package/src/state/session.ts +0 -253
- package/src/state/types.ts +0 -59
- package/src/state/utils/__tests__/atomic.test.ts +0 -723
- package/src/state/utils/__tests__/reads.test.ts +0 -1071
- package/src/state/utils/atomic.ts +0 -221
- package/src/state/utils/index.ts +0 -6
- package/src/state/utils/reads.ts +0 -512
- package/src/work-sources/__tests__/github.test.ts +0 -1800
- package/src/work-sources/__tests__/manager.test.ts +0 -529
- package/src/work-sources/__tests__/registry.test.ts +0 -477
- package/src/work-sources/__tests__/types.test.ts +0 -479
- package/src/work-sources/adapters/github.ts +0 -1166
- package/src/work-sources/adapters/index.ts +0 -64
- package/src/work-sources/errors.ts +0 -71
- package/src/work-sources/index.ts +0 -148
- package/src/work-sources/manager.ts +0 -413
- package/src/work-sources/registry.ts +0 -178
- package/src/work-sources/types.ts +0 -161
- package/tsconfig.json +0 -9
- package/vitest.config.ts +0 -19
package/src/config/index.ts
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration module for herdctl
|
|
3
|
-
*
|
|
4
|
-
* Provides parsing and validation for herdctl.yaml fleet configuration files
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
// Schema exports
|
|
8
|
-
export {
|
|
9
|
-
// Schemas
|
|
10
|
-
FleetConfigSchema,
|
|
11
|
-
DefaultsSchema,
|
|
12
|
-
WorkspaceSchema,
|
|
13
|
-
AgentReferenceSchema,
|
|
14
|
-
ChatSchema,
|
|
15
|
-
DiscordChatSchema,
|
|
16
|
-
WebhooksSchema,
|
|
17
|
-
DockerSchema,
|
|
18
|
-
PermissionsSchema,
|
|
19
|
-
PermissionModeSchema,
|
|
20
|
-
BashPermissionsSchema,
|
|
21
|
-
WorkSourceSchema,
|
|
22
|
-
WorkSourceTypeSchema,
|
|
23
|
-
WorkSourceLabelsSchema,
|
|
24
|
-
GitHubAuthSchema,
|
|
25
|
-
GitHubWorkSourceSchema,
|
|
26
|
-
BaseWorkSourceSchema,
|
|
27
|
-
InstancesSchema,
|
|
28
|
-
// Agent-specific schemas
|
|
29
|
-
AgentConfigSchema,
|
|
30
|
-
IdentitySchema,
|
|
31
|
-
SessionSchema,
|
|
32
|
-
ScheduleSchema,
|
|
33
|
-
ScheduleTypeSchema,
|
|
34
|
-
McpServerSchema,
|
|
35
|
-
AgentChatSchema,
|
|
36
|
-
AgentWorkspaceSchema,
|
|
37
|
-
// Types
|
|
38
|
-
type FleetConfig,
|
|
39
|
-
type Defaults,
|
|
40
|
-
type Workspace,
|
|
41
|
-
type AgentReference,
|
|
42
|
-
type Chat,
|
|
43
|
-
type DiscordChat,
|
|
44
|
-
type Webhooks,
|
|
45
|
-
type Docker,
|
|
46
|
-
type Permissions,
|
|
47
|
-
type PermissionMode,
|
|
48
|
-
type BashPermissions,
|
|
49
|
-
type WorkSource,
|
|
50
|
-
type WorkSourceType,
|
|
51
|
-
type WorkSourceLabels,
|
|
52
|
-
type GitHubAuth,
|
|
53
|
-
type GitHubWorkSource,
|
|
54
|
-
type BaseWorkSource,
|
|
55
|
-
type Instances,
|
|
56
|
-
// Agent-specific types
|
|
57
|
-
type AgentConfig,
|
|
58
|
-
type Identity,
|
|
59
|
-
type Session,
|
|
60
|
-
type Schedule,
|
|
61
|
-
type ScheduleType,
|
|
62
|
-
type McpServer,
|
|
63
|
-
type AgentChat,
|
|
64
|
-
type AgentWorkspace,
|
|
65
|
-
} from "./schema.js";
|
|
66
|
-
|
|
67
|
-
// Parser exports
|
|
68
|
-
export {
|
|
69
|
-
// Fleet config parsers
|
|
70
|
-
parseFleetConfig,
|
|
71
|
-
validateFleetConfig,
|
|
72
|
-
safeParseFleetConfig,
|
|
73
|
-
// Agent config parsers
|
|
74
|
-
parseAgentConfig,
|
|
75
|
-
validateAgentConfig,
|
|
76
|
-
safeParseAgentConfig,
|
|
77
|
-
loadAgentConfig,
|
|
78
|
-
resolveAgentPath,
|
|
79
|
-
// Error classes
|
|
80
|
-
ConfigError,
|
|
81
|
-
YamlSyntaxError,
|
|
82
|
-
SchemaValidationError,
|
|
83
|
-
FileReadError,
|
|
84
|
-
AgentValidationError,
|
|
85
|
-
AgentYamlSyntaxError,
|
|
86
|
-
type SchemaIssue,
|
|
87
|
-
} from "./parser.js";
|
|
88
|
-
|
|
89
|
-
// Merge exports
|
|
90
|
-
export {
|
|
91
|
-
deepMerge,
|
|
92
|
-
mergeAgentConfig,
|
|
93
|
-
mergeAllAgentConfigs,
|
|
94
|
-
type PermissionsInput,
|
|
95
|
-
type MergeableDefaults,
|
|
96
|
-
type ExtendedDefaults,
|
|
97
|
-
} from "./merge.js";
|
|
98
|
-
|
|
99
|
-
// Interpolation exports
|
|
100
|
-
export {
|
|
101
|
-
interpolateConfig,
|
|
102
|
-
interpolateValue,
|
|
103
|
-
interpolateString,
|
|
104
|
-
UndefinedVariableError,
|
|
105
|
-
type InterpolateOptions,
|
|
106
|
-
} from "./interpolate.js";
|
|
107
|
-
|
|
108
|
-
// Loader exports
|
|
109
|
-
export {
|
|
110
|
-
loadConfig,
|
|
111
|
-
safeLoadConfig,
|
|
112
|
-
findConfigFile,
|
|
113
|
-
CONFIG_FILE_NAMES,
|
|
114
|
-
ConfigNotFoundError,
|
|
115
|
-
AgentLoadError,
|
|
116
|
-
type ResolvedConfig,
|
|
117
|
-
type ResolvedAgent,
|
|
118
|
-
type LoadConfigOptions,
|
|
119
|
-
} from "./loader.js";
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment variable interpolation for herdctl configuration
|
|
3
|
-
*
|
|
4
|
-
* Supports:
|
|
5
|
-
* - ${VAR_NAME} - interpolate from environment variables
|
|
6
|
-
* - ${VAR_NAME:-default} - provide default value if not set
|
|
7
|
-
* - Preserves non-string values (numbers, booleans, objects)
|
|
8
|
-
* - Works at any nesting depth
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { ConfigError } from "./parser.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Error thrown when an undefined environment variable is referenced without a default
|
|
15
|
-
*/
|
|
16
|
-
export class UndefinedVariableError extends ConfigError {
|
|
17
|
-
public readonly variableName: string;
|
|
18
|
-
public readonly path: string;
|
|
19
|
-
|
|
20
|
-
constructor(variableName: string, path: string) {
|
|
21
|
-
super(
|
|
22
|
-
`Undefined environment variable '${variableName}' at '${path}' (no default provided)`
|
|
23
|
-
);
|
|
24
|
-
this.name = "UndefinedVariableError";
|
|
25
|
-
this.variableName = variableName;
|
|
26
|
-
this.path = path;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Regular expression to match ${VAR} and ${VAR:-default} patterns
|
|
32
|
-
* Captures:
|
|
33
|
-
* - Group 1: Variable name (letters, numbers, underscores)
|
|
34
|
-
* - Group 2: Default value (everything after :- if present)
|
|
35
|
-
*/
|
|
36
|
-
const ENV_VAR_PATTERN = /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Options for interpolation
|
|
40
|
-
*/
|
|
41
|
-
export interface InterpolateOptions {
|
|
42
|
-
/**
|
|
43
|
-
* Custom environment object to use instead of process.env
|
|
44
|
-
* Useful for testing
|
|
45
|
-
*/
|
|
46
|
-
env?: Record<string, string | undefined>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Interpolate a single string value, replacing ${VAR} and ${VAR:-default} patterns
|
|
51
|
-
*
|
|
52
|
-
* @param value - The string value to interpolate
|
|
53
|
-
* @param path - The config path for error messages
|
|
54
|
-
* @param env - Environment variables object
|
|
55
|
-
* @returns The interpolated string
|
|
56
|
-
* @throws {UndefinedVariableError} If a variable is undefined and has no default
|
|
57
|
-
*/
|
|
58
|
-
export function interpolateString(
|
|
59
|
-
value: string,
|
|
60
|
-
path: string,
|
|
61
|
-
env: Record<string, string | undefined> = process.env
|
|
62
|
-
): string {
|
|
63
|
-
// Reset regex state
|
|
64
|
-
ENV_VAR_PATTERN.lastIndex = 0;
|
|
65
|
-
|
|
66
|
-
// Collect all matches first to check for undefined variables
|
|
67
|
-
const matches: Array<{
|
|
68
|
-
fullMatch: string;
|
|
69
|
-
varName: string;
|
|
70
|
-
defaultValue: string | undefined;
|
|
71
|
-
index: number;
|
|
72
|
-
}> = [];
|
|
73
|
-
|
|
74
|
-
let match;
|
|
75
|
-
while ((match = ENV_VAR_PATTERN.exec(value)) !== null) {
|
|
76
|
-
matches.push({
|
|
77
|
-
fullMatch: match[0],
|
|
78
|
-
varName: match[1],
|
|
79
|
-
defaultValue: match[2],
|
|
80
|
-
index: match.index,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// If no matches, return original string
|
|
85
|
-
if (matches.length === 0) {
|
|
86
|
-
return value;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Replace all matches
|
|
90
|
-
let result = value;
|
|
91
|
-
// Process matches in reverse order to preserve indices
|
|
92
|
-
for (let i = matches.length - 1; i >= 0; i--) {
|
|
93
|
-
const { fullMatch, varName, defaultValue, index } = matches[i];
|
|
94
|
-
const envValue = env[varName];
|
|
95
|
-
|
|
96
|
-
let replacement: string;
|
|
97
|
-
if (envValue !== undefined) {
|
|
98
|
-
replacement = envValue;
|
|
99
|
-
} else if (defaultValue !== undefined) {
|
|
100
|
-
replacement = defaultValue;
|
|
101
|
-
} else {
|
|
102
|
-
throw new UndefinedVariableError(varName, path);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
result =
|
|
106
|
-
result.slice(0, index) + replacement + result.slice(index + fullMatch.length);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
return result;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Recursively interpolate all string values in an object or array
|
|
114
|
-
*
|
|
115
|
-
* @param value - The value to interpolate (can be any type)
|
|
116
|
-
* @param path - The current config path for error messages
|
|
117
|
-
* @param env - Environment variables object
|
|
118
|
-
* @returns The interpolated value (same type as input for non-strings)
|
|
119
|
-
* @throws {UndefinedVariableError} If a variable is undefined and has no default
|
|
120
|
-
*/
|
|
121
|
-
export function interpolateValue(
|
|
122
|
-
value: unknown,
|
|
123
|
-
path: string = "",
|
|
124
|
-
env: Record<string, string | undefined> = process.env
|
|
125
|
-
): unknown {
|
|
126
|
-
// Handle null and undefined
|
|
127
|
-
if (value === null || value === undefined) {
|
|
128
|
-
return value;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Handle strings - perform interpolation
|
|
132
|
-
if (typeof value === "string") {
|
|
133
|
-
return interpolateString(value, path, env);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Preserve non-string primitives (numbers, booleans)
|
|
137
|
-
if (typeof value !== "object") {
|
|
138
|
-
return value;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// Handle arrays - recursively interpolate each element
|
|
142
|
-
if (Array.isArray(value)) {
|
|
143
|
-
return value.map((item, index) =>
|
|
144
|
-
interpolateValue(item, path ? `${path}[${index}]` : `[${index}]`, env)
|
|
145
|
-
);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Handle objects - recursively interpolate each property
|
|
149
|
-
const result: Record<string, unknown> = {};
|
|
150
|
-
for (const [key, val] of Object.entries(value as Record<string, unknown>)) {
|
|
151
|
-
const newPath = path ? `${path}.${key}` : key;
|
|
152
|
-
result[key] = interpolateValue(val, newPath, env);
|
|
153
|
-
}
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Interpolate environment variables in a configuration object
|
|
159
|
-
*
|
|
160
|
-
* This is the main entry point for configuration interpolation.
|
|
161
|
-
* It recursively processes all string values in the config, replacing
|
|
162
|
-
* ${VAR} patterns with environment variable values.
|
|
163
|
-
*
|
|
164
|
-
* @param config - The configuration object to interpolate
|
|
165
|
-
* @param options - Interpolation options
|
|
166
|
-
* @returns A new object with all string values interpolated
|
|
167
|
-
* @throws {UndefinedVariableError} If a variable is undefined and has no default
|
|
168
|
-
*
|
|
169
|
-
* @example
|
|
170
|
-
* ```typescript
|
|
171
|
-
* const config = {
|
|
172
|
-
* database: {
|
|
173
|
-
* host: "${DB_HOST:-localhost}",
|
|
174
|
-
* password: "${DB_PASSWORD}"
|
|
175
|
-
* }
|
|
176
|
-
* };
|
|
177
|
-
*
|
|
178
|
-
* // With DB_HOST unset and DB_PASSWORD=secret
|
|
179
|
-
* const result = interpolateConfig(config);
|
|
180
|
-
* // result = { database: { host: "localhost", password: "secret" } }
|
|
181
|
-
* ```
|
|
182
|
-
*/
|
|
183
|
-
export function interpolateConfig<T>(
|
|
184
|
-
config: T,
|
|
185
|
-
options: InterpolateOptions = {}
|
|
186
|
-
): T {
|
|
187
|
-
const env = options.env ?? process.env;
|
|
188
|
-
return interpolateValue(config, "", env) as T;
|
|
189
|
-
}
|