gql-to-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +131 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +135 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/config-loader.d.ts +5 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +78 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/config-schema.d.ts +1007 -0
- package/dist/config/config-schema.d.ts.map +1 -0
- package/dist/config/config-schema.js +130 -0
- package/dist/config/config-schema.js.map +1 -0
- package/dist/gql-client.d.ts +23 -0
- package/dist/gql-client.d.ts.map +1 -0
- package/dist/gql-client.js +129 -0
- package/dist/gql-client.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/logger/index.d.ts +11 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +76 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/mcp-server.d.ts +45 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +284 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/operation-loader.d.ts +17 -0
- package/dist/operation-loader.d.ts.map +1 -0
- package/dist/operation-loader.js +332 -0
- package/dist/operation-loader.js.map +1 -0
- package/dist/registry/index.d.ts +7 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +13 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/prompt-registry.d.ts +49 -0
- package/dist/registry/prompt-registry.d.ts.map +1 -0
- package/dist/registry/prompt-registry.js +84 -0
- package/dist/registry/prompt-registry.js.map +1 -0
- package/dist/registry/resource-registry.d.ts +39 -0
- package/dist/registry/resource-registry.d.ts.map +1 -0
- package/dist/registry/resource-registry.js +69 -0
- package/dist/registry/resource-registry.js.map +1 -0
- package/dist/registry/tool-registry.d.ts +30 -0
- package/dist/registry/tool-registry.d.ts.map +1 -0
- package/dist/registry/tool-registry.js +108 -0
- package/dist/registry/tool-registry.js.map +1 -0
- package/dist/schema-loader.d.ts +14 -0
- package/dist/schema-loader.d.ts.map +1 -0
- package/dist/schema-loader.js +52 -0
- package/dist/schema-loader.js.map +1 -0
- package/dist/telemetry/index.d.ts +19 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +88 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/transport/http.d.ts +16 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +146 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/transport/index.d.ts +5 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +8 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/stdio.d.ts +6 -0
- package/dist/transport/stdio.d.ts.map +1 -0
- package/dist/transport/stdio.js +14 -0
- package/dist/transport/stdio.js.map +1 -0
- package/dist/types/config.d.ts +104 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +45 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +80 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/gql.d.ts +10 -0
- package/dist/types/gql.d.ts.map +1 -0
- package/dist/types/gql.js +3 -0
- package/dist/types/gql.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +17 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/request.d.ts +25 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +23 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/server.d.ts +12 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/server.js +3 -0
- package/dist/types/server.js.map +1 -0
- package/dist/types/tool.d.ts +47 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +3 -0
- package/dist/types/tool.js.map +1 -0
- package/package.json +108 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# gql-mcp
|
|
2
|
+
|
|
3
|
+
> Convert GraphQL operations into MCP tools with support for custom multi-step workflows
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`gql-mcp` is a TypeScript library that turns your GraphQL operations into MCP (Model Context Protocol) tools. It auto-discovers `.graphql` files and exposes them as tools, with support for custom tools that chain multiple GraphQL calls.
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install gql-to-mcp
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { createMcpServer } from 'gql-to-mcp';
|
|
19
|
+
|
|
20
|
+
const server = createMcpServer({
|
|
21
|
+
config: './mcp-config.yaml',
|
|
22
|
+
tools: [], // optional custom tools
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
await server.start();
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Configuration
|
|
29
|
+
|
|
30
|
+
Create a `mcp-config.yaml` file:
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
server_info:
|
|
34
|
+
name: my-mcp-server
|
|
35
|
+
version: 1.0.0
|
|
36
|
+
|
|
37
|
+
endpoint: 'https://api.example.com/graphql'
|
|
38
|
+
|
|
39
|
+
headers:
|
|
40
|
+
x-client-name: my-app
|
|
41
|
+
|
|
42
|
+
# Optional: Auto-discover GraphQL operations
|
|
43
|
+
schema:
|
|
44
|
+
source: local
|
|
45
|
+
path: ./schema.graphql
|
|
46
|
+
|
|
47
|
+
operations:
|
|
48
|
+
dirs:
|
|
49
|
+
- ./operations
|
|
50
|
+
|
|
51
|
+
# Optional: Logging
|
|
52
|
+
logging:
|
|
53
|
+
level: info # debug | info | warn | error
|
|
54
|
+
format: json # json | pretty
|
|
55
|
+
redact:
|
|
56
|
+
- headers.authorization
|
|
57
|
+
- jwt.sub
|
|
58
|
+
|
|
59
|
+
# Optional: Telemetry (New Relic, Splunk, etc)
|
|
60
|
+
telemetry:
|
|
61
|
+
enabled: true
|
|
62
|
+
service_name: my-service
|
|
63
|
+
exporters:
|
|
64
|
+
tracing:
|
|
65
|
+
otlp:
|
|
66
|
+
endpoint: ${env.OTLP_ENDPOINT}
|
|
67
|
+
headers:
|
|
68
|
+
api-key: ${env.LICENSE_KEY}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Custom Tools
|
|
72
|
+
|
|
73
|
+
Create multi-step tools that chain GraphQL operations:
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
import { CustomTool } from 'gql-to-mcp';
|
|
77
|
+
|
|
78
|
+
const myTool: CustomTool = {
|
|
79
|
+
name: 'my_custom_tool',
|
|
80
|
+
description: 'Does something complex',
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
properties: {
|
|
84
|
+
id: { type: 'string' },
|
|
85
|
+
},
|
|
86
|
+
required: ['id'],
|
|
87
|
+
},
|
|
88
|
+
execute: async (args, ctx) => {
|
|
89
|
+
// Call GraphQL
|
|
90
|
+
const result = await ctx.gql(
|
|
91
|
+
`
|
|
92
|
+
query GetData($id: ID!) {
|
|
93
|
+
item(id: $id) { id name }
|
|
94
|
+
}
|
|
95
|
+
`,
|
|
96
|
+
{ id: args.id }
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
return result.data;
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export default myTool;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Features
|
|
107
|
+
|
|
108
|
+
- ✅ Auto-converts `.graphql` files to MCP tools
|
|
109
|
+
- ✅ Schema validation at startup
|
|
110
|
+
- ✅ Custom multi-step tools
|
|
111
|
+
- ✅ Auth header forwarding
|
|
112
|
+
- ✅ Structured logging (Pino)
|
|
113
|
+
- ✅ OpenTelemetry tracing
|
|
114
|
+
- ✅ TypeScript support
|
|
115
|
+
|
|
116
|
+
## Development
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
# Build
|
|
120
|
+
npm run build
|
|
121
|
+
|
|
122
|
+
# Type check
|
|
123
|
+
npm run type-check
|
|
124
|
+
|
|
125
|
+
# Lint
|
|
126
|
+
npm run lint
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## License
|
|
130
|
+
|
|
131
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
const index_js_1 = require("./index.js");
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const HELP = `
|
|
41
|
+
gql-mcp — GraphQL MCP Server
|
|
42
|
+
|
|
43
|
+
Usage:
|
|
44
|
+
gql-mcp <config-file> [options]
|
|
45
|
+
|
|
46
|
+
Arguments:
|
|
47
|
+
<config-file> Path to YAML configuration file
|
|
48
|
+
|
|
49
|
+
Options:
|
|
50
|
+
--help, -h Show this help message
|
|
51
|
+
--version, -v Show version
|
|
52
|
+
|
|
53
|
+
Examples:
|
|
54
|
+
gql-mcp ./mcp-config.yaml
|
|
55
|
+
gql-mcp /etc/gql-mcp/config.yaml
|
|
56
|
+
|
|
57
|
+
Config file structure:
|
|
58
|
+
server_info: Server name, version
|
|
59
|
+
endpoint: GraphQL endpoint URL
|
|
60
|
+
schema: Schema source (local file or introspection)
|
|
61
|
+
operations: Directory containing .graphql operation files
|
|
62
|
+
transport: Transport type (streamable_http | stdio) and options
|
|
63
|
+
headers: Static headers forwarded to every GraphQL request
|
|
64
|
+
forward_headers: Inbound MCP headers to forward to GraphQL endpoint
|
|
65
|
+
overrides: Mutation mode, tool description overrides
|
|
66
|
+
custom_scalars: JSON Schema mappings for custom GraphQL scalars
|
|
67
|
+
logging: Log level and format
|
|
68
|
+
telemetry: OTLP tracing and metrics exporters
|
|
69
|
+
|
|
70
|
+
Docs: https://github.com/your-org/gql-mcp
|
|
71
|
+
`;
|
|
72
|
+
async function main() {
|
|
73
|
+
const args = process.argv.slice(2);
|
|
74
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
75
|
+
console.log(HELP);
|
|
76
|
+
process.exit(args.length === 0 ? 1 : 0);
|
|
77
|
+
}
|
|
78
|
+
if (args.includes('--version') || args.includes('-v')) {
|
|
79
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '../../package.json'), 'utf-8'));
|
|
80
|
+
console.log(pkg.version);
|
|
81
|
+
process.exit(0);
|
|
82
|
+
}
|
|
83
|
+
const configArg = args.find((a) => !a.startsWith('--'));
|
|
84
|
+
if (!configArg) {
|
|
85
|
+
console.error('❌ Error: No config file specified');
|
|
86
|
+
console.error(' Run gql-mcp --help for usage');
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
const configPath = path.isAbsolute(configArg)
|
|
90
|
+
? configArg
|
|
91
|
+
: path.resolve(process.cwd(), configArg);
|
|
92
|
+
if (!fs.existsSync(configPath)) {
|
|
93
|
+
console.error(`❌ Error: Config file not found: ${configPath}`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const server = (0, index_js_1.createMcpServer)({ config: configPath });
|
|
98
|
+
await server.start();
|
|
99
|
+
const shutdown = (signal) => {
|
|
100
|
+
console.error(`\n⏹ Received ${signal}, shutting down...`);
|
|
101
|
+
server
|
|
102
|
+
.stop()
|
|
103
|
+
.then(() => {
|
|
104
|
+
console.error('✓ Shutdown complete');
|
|
105
|
+
process.exit(0);
|
|
106
|
+
})
|
|
107
|
+
.catch((err) => {
|
|
108
|
+
console.error('⚠ Error during shutdown:', err instanceof Error ? err.message : err);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
113
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
114
|
+
if (process.stdin.isTTY === false) {
|
|
115
|
+
process.stdin.resume();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (err instanceof Error) {
|
|
120
|
+
console.error(`❌ ${err.message}`);
|
|
121
|
+
if (process.env['DEBUG']) {
|
|
122
|
+
console.error(err.stack);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.error('❌ Unknown error during startup');
|
|
127
|
+
}
|
|
128
|
+
process.exit(1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
main().catch((err) => {
|
|
132
|
+
console.error('❌ Fatal:', err instanceof Error ? err.message : err);
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpConfig } from '../types/index.js';
|
|
2
|
+
export declare function resolveConfig(input: string | McpConfig): McpConfig;
|
|
3
|
+
export declare function loadConfig(configPath: string): McpConfig;
|
|
4
|
+
export declare function interpolateEnvVars(obj: unknown): unknown;
|
|
5
|
+
//# sourceMappingURL=config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAwBnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAKlE;AAMD,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAExD;AA+ED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CA4BxD"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveConfig = resolveConfig;
|
|
4
|
+
exports.loadConfig = loadConfig;
|
|
5
|
+
exports.interpolateEnvVars = interpolateEnvVars;
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
const js_yaml_1 = require("js-yaml");
|
|
8
|
+
const index_js_1 = require("../types/index.js");
|
|
9
|
+
const config_schema_js_1 = require("./config-schema.js");
|
|
10
|
+
function resolveConfig(input) {
|
|
11
|
+
if (typeof input === 'string') {
|
|
12
|
+
return loadFromFile(input);
|
|
13
|
+
}
|
|
14
|
+
return validateObject(input);
|
|
15
|
+
}
|
|
16
|
+
function loadConfig(configPath) {
|
|
17
|
+
return resolveConfig(configPath);
|
|
18
|
+
}
|
|
19
|
+
function loadFromFile(configPath) {
|
|
20
|
+
const raw = readFile(configPath);
|
|
21
|
+
const parsed = parseYaml(raw, configPath);
|
|
22
|
+
const interpolated = interpolateEnvVars(parsed);
|
|
23
|
+
return validate(interpolated, `config file "${configPath}"`);
|
|
24
|
+
}
|
|
25
|
+
function readFile(configPath) {
|
|
26
|
+
try {
|
|
27
|
+
return (0, fs_1.readFileSync)(configPath, 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
throw new index_js_1.ConfigError(`Failed to read config file at "${configPath}": ${err instanceof Error ? err.message : String(err)}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function parseYaml(raw, configPath) {
|
|
34
|
+
try {
|
|
35
|
+
return (0, js_yaml_1.load)(raw);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
throw new index_js_1.ConfigError(`Failed to parse YAML in "${configPath}": ${err instanceof Error ? err.message : String(err)}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function validateObject(config) {
|
|
42
|
+
return validate(config, 'programmatic config');
|
|
43
|
+
}
|
|
44
|
+
function validate(input, source) {
|
|
45
|
+
const result = config_schema_js_1.McpConfigSchema.safeParse(input);
|
|
46
|
+
if (!result.success) {
|
|
47
|
+
const errors = result.error.issues
|
|
48
|
+
.map((e) => {
|
|
49
|
+
const path = e.path.length > 0 ? e.path.join('.') : '(root)';
|
|
50
|
+
return ` - ${path}: ${e.message}`;
|
|
51
|
+
})
|
|
52
|
+
.join('\n');
|
|
53
|
+
throw new index_js_1.ConfigError(`Config validation failed (${source}):\n${errors}`);
|
|
54
|
+
}
|
|
55
|
+
return result.data;
|
|
56
|
+
}
|
|
57
|
+
function interpolateEnvVars(obj) {
|
|
58
|
+
if (typeof obj === 'string') {
|
|
59
|
+
return obj.replace(/\$\{env\.([A-Z_][A-Z0-9_]*)\}/g, (match, varName) => {
|
|
60
|
+
const value = process.env[varName];
|
|
61
|
+
if (value === undefined) {
|
|
62
|
+
throw new index_js_1.ConfigError(`Environment variable "${varName}" is not set (referenced as "${match}" in config)`);
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
if (Array.isArray(obj)) {
|
|
68
|
+
return obj.map(interpolateEnvVars);
|
|
69
|
+
}
|
|
70
|
+
if (obj !== null && typeof obj === 'object') {
|
|
71
|
+
return Object.fromEntries(Object.entries(obj).map(([key, value]) => [
|
|
72
|
+
key,
|
|
73
|
+
interpolateEnvVars(value),
|
|
74
|
+
]));
|
|
75
|
+
}
|
|
76
|
+
return obj;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"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"}
|