@gemini-designer/mcp-server 0.1.2 → 0.1.29
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/components/catalog.d.ts.map +1 -1
- package/dist/components/catalog.js +10 -4
- package/dist/components/catalog.js.map +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +11 -6
- package/dist/config/index.js.map +1 -1
- package/dist/context/builder.d.ts.map +1 -1
- package/dist/context/builder.js.map +1 -1
- package/dist/context/filter.d.ts.map +1 -1
- package/dist/context/filter.js +5 -1
- package/dist/context/filter.js.map +1 -1
- package/dist/context/grounding.d.ts.map +1 -1
- package/dist/context/grounding.js +7 -3
- package/dist/context/grounding.js.map +1 -1
- package/dist/context/guards.d.ts.map +1 -1
- package/dist/context/guards.js +53 -0
- package/dist/context/guards.js.map +1 -1
- package/dist/context/repo-hints.js.map +1 -1
- package/dist/context/styling-detector.d.ts +24 -0
- package/dist/context/styling-detector.d.ts.map +1 -0
- package/dist/context/styling-detector.js +337 -0
- package/dist/context/styling-detector.js.map +1 -0
- package/dist/design/principles.js.map +1 -1
- package/dist/generation/gemini-client.d.ts.map +1 -1
- package/dist/generation/gemini-client.js.map +1 -1
- package/dist/generation/litellm-client.d.ts.map +1 -1
- package/dist/generation/litellm-client.js +14 -7
- package/dist/generation/litellm-client.js.map +1 -1
- package/dist/generation/remote-client.d.ts +10 -5
- package/dist/generation/remote-client.d.ts.map +1 -1
- package/dist/generation/remote-client.js +13 -2
- package/dist/generation/remote-client.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/output/file-writer.d.ts.map +1 -1
- package/dist/output/file-writer.js +4 -4
- package/dist/output/file-writer.js.map +1 -1
- package/dist/output/formatter.d.ts.map +1 -1
- package/dist/output/formatter.js +5 -2
- package/dist/output/formatter.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/stack/detect.d.ts.map +1 -1
- package/dist/stack/detect.js +42 -9
- package/dist/stack/detect.js.map +1 -1
- package/dist/tokens/sync.d.ts.map +1 -1
- package/dist/tokens/sync.js +22 -5
- package/dist/tokens/sync.js.map +1 -1
- package/dist/tools/analyze-screenshot-ui.d.ts.map +1 -1
- package/dist/tools/analyze-screenshot-ui.js +5 -5
- package/dist/tools/analyze-screenshot-ui.js.map +1 -1
- package/dist/tools/analyze-tokens.d.ts.map +1 -1
- package/dist/tools/analyze-tokens.js +3 -1
- package/dist/tools/analyze-tokens.js.map +1 -1
- package/dist/tools/catalog-components.d.ts.map +1 -1
- package/dist/tools/catalog-components.js +1 -4
- package/dist/tools/catalog-components.js.map +1 -1
- package/dist/tools/create-ui.d.ts +3 -0
- package/dist/tools/create-ui.d.ts.map +1 -1
- package/dist/tools/create-ui.js +203 -75
- package/dist/tools/create-ui.js.map +1 -1
- package/dist/tools/detect-ui-stack.js.map +1 -1
- package/dist/tools/generate-component-variants.d.ts.map +1 -1
- package/dist/tools/generate-component-variants.js +15 -4
- package/dist/tools/generate-component-variants.js.map +1 -1
- package/dist/tools/generate-vibes.d.ts.map +1 -1
- package/dist/tools/generate-vibes.js +7 -3
- package/dist/tools/generate-vibes.js.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/modify-ui.d.ts.map +1 -1
- package/dist/tools/modify-ui.js +7 -2
- package/dist/tools/modify-ui.js.map +1 -1
- package/dist/tools/scaffold-project.d.ts.map +1 -1
- package/dist/tools/scaffold-project.js +3 -1
- package/dist/tools/scaffold-project.js.map +1 -1
- package/dist/tools/snippet-ui.d.ts +3 -1
- package/dist/tools/snippet-ui.d.ts.map +1 -1
- package/dist/tools/snippet-ui.js +219 -88
- package/dist/tools/snippet-ui.js.map +1 -1
- package/dist/tools/sync-design-tokens.d.ts.map +1 -1
- package/dist/tools/sync-design-tokens.js +26 -11
- package/dist/tools/sync-design-tokens.js.map +1 -1
- package/dist/utils/walk.d.ts.map +1 -1
- package/dist/utils/walk.js.map +1 -1
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/package.json +55 -55
- package/src/__tests__/builder.test.ts +19 -19
- package/src/__tests__/config.test.ts +63 -31
- package/src/__tests__/filter.test.ts +98 -92
- package/src/__tests__/remote-client.test.ts +179 -0
- package/src/components/catalog.ts +170 -166
- package/src/config/index.ts +185 -177
- package/src/context/builder.ts +157 -157
- package/src/context/filter.ts +110 -104
- package/src/context/grounding.ts +143 -129
- package/src/context/guards.ts +97 -38
- package/src/context/repo-hints.ts +24 -24
- package/src/context/styling-detector.ts +460 -0
- package/src/design/principles.ts +14 -14
- package/src/generation/gemini-client.ts +53 -56
- package/src/generation/litellm-client.ts +102 -86
- package/src/generation/remote-client.ts +100 -77
- package/src/index.ts +16 -16
- package/src/output/file-writer.ts +123 -123
- package/src/output/formatter.ts +139 -132
- package/src/server.ts +12 -11
- package/src/stack/detect.ts +226 -175
- package/src/tokens/sync.ts +189 -155
- package/src/tools/analyze-screenshot-ui.ts +89 -88
- package/src/tools/analyze-tokens.ts +80 -78
- package/src/tools/catalog-components.ts +68 -68
- package/src/tools/create-ui.ts +295 -142
- package/src/tools/detect-ui-stack.ts +36 -36
- package/src/tools/generate-component-variants.ts +155 -135
- package/src/tools/generate-vibes.ts +121 -117
- package/src/tools/index.ts +14 -14
- package/src/tools/modify-ui.ts +170 -165
- package/src/tools/scaffold-project.ts +68 -66
- package/src/tools/snippet-ui.ts +323 -172
- package/src/tools/sync-design-tokens.ts +217 -195
- package/src/utils/walk.ts +47 -45
- package/src/version.ts +6 -0
- package/tsconfig.json +23 -33
- package/vitest.config.ts +10 -10
- package/.prettierrc +0 -9
- package/eslint.config.js +0 -37
package/src/config/index.ts
CHANGED
|
@@ -10,55 +10,51 @@ import * as fs from 'node:fs';
|
|
|
10
10
|
import * as path from 'node:path';
|
|
11
11
|
|
|
12
12
|
const ConfigSchema = z.object({
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}),
|
|
59
|
-
|
|
60
|
-
// Debug mode
|
|
61
|
-
debug: z.boolean().default(false),
|
|
13
|
+
// Mode: 'local' uses direct Gemini API, 'remote' uses gateway
|
|
14
|
+
mode: z.enum(['local', 'remote']).default('local'),
|
|
15
|
+
|
|
16
|
+
// Local provider: direct Gemini SDK, or OpenAI-compatible proxy (e.g. LiteLLM)
|
|
17
|
+
// Default to LiteLLM because it unlocks routing, retries, caching, and load balancing.
|
|
18
|
+
// If LiteLLM is not configured, we will automatically fall back to direct Gemini.
|
|
19
|
+
localProvider: z.enum(['gemini', 'litellm']).default('litellm'),
|
|
20
|
+
|
|
21
|
+
// API key for local mode (required if mode is 'local')
|
|
22
|
+
apiKey: z.string().optional(),
|
|
23
|
+
|
|
24
|
+
// Remote gateway endpoint (required if mode is 'remote')
|
|
25
|
+
remoteEndpoint: z.string().url().optional(),
|
|
26
|
+
|
|
27
|
+
// Remote API key for gateway authentication
|
|
28
|
+
remoteApiKey: z.string().optional(),
|
|
29
|
+
|
|
30
|
+
// Workspace paths that can be accessed
|
|
31
|
+
allowedPaths: z.array(z.string()).default([process.cwd()]),
|
|
32
|
+
|
|
33
|
+
// Default framework for generated code
|
|
34
|
+
defaultFramework: z.enum(['vanilla', 'react', 'vue', 'svelte', 'nextjs']).default('react'),
|
|
35
|
+
|
|
36
|
+
// Gemini model to use (for local mode)
|
|
37
|
+
model: z.string().default('gemini-2.5-flash'),
|
|
38
|
+
|
|
39
|
+
// LiteLLM (or other OpenAI-compatible proxy) configuration for local mode
|
|
40
|
+
litellmEndpoint: z.string().url().optional(),
|
|
41
|
+
litellmApiKey: z.string().optional(),
|
|
42
|
+
litellmModel: z.string().optional(),
|
|
43
|
+
|
|
44
|
+
// Default accessibility level
|
|
45
|
+
accessibility: z.enum(['none', 'wcag-a', 'wcag-aa', 'wcag-aaa']).default('wcag-aa'),
|
|
46
|
+
|
|
47
|
+
// Responsive breakpoints
|
|
48
|
+
breakpoints: z.record(z.number()).default({
|
|
49
|
+
sm: 640,
|
|
50
|
+
md: 768,
|
|
51
|
+
lg: 1024,
|
|
52
|
+
xl: 1280,
|
|
53
|
+
'2xl': 1536,
|
|
54
|
+
}),
|
|
55
|
+
|
|
56
|
+
// Debug mode
|
|
57
|
+
debug: z.boolean().default(false),
|
|
62
58
|
});
|
|
63
59
|
|
|
64
60
|
export type Config = z.infer<typeof ConfigSchema>;
|
|
@@ -67,171 +63,183 @@ export type Config = z.infer<typeof ConfigSchema>;
|
|
|
67
63
|
* Load configuration from all sources
|
|
68
64
|
*/
|
|
69
65
|
export function loadConfig(): Config {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
cfg = { ...cfg, localProvider: 'gemini' };
|
|
103
|
-
}
|
|
66
|
+
const configFromFile = loadConfigFile();
|
|
67
|
+
const configFromEnv = loadConfigFromEnv();
|
|
68
|
+
const configFromArgs = loadConfigFromArgs();
|
|
69
|
+
|
|
70
|
+
// Merge configs with priority: args > env > file > defaults
|
|
71
|
+
const merged = {
|
|
72
|
+
...configFromFile,
|
|
73
|
+
...configFromEnv,
|
|
74
|
+
...configFromArgs,
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const result = ConfigSchema.safeParse(merged);
|
|
78
|
+
|
|
79
|
+
if (!result.success) {
|
|
80
|
+
console.error('[config] Invalid configuration:', result.error.format());
|
|
81
|
+
throw new Error('Invalid configuration');
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Apply smart defaults / fallbacks
|
|
85
|
+
// - We default to localProvider=litellm, but automatically fall back to direct Gemini
|
|
86
|
+
// when LiteLLM isn't configured.
|
|
87
|
+
let cfg: Config = result.data;
|
|
88
|
+
|
|
89
|
+
if (cfg.mode === 'local') {
|
|
90
|
+
const hasLite = Boolean(cfg.litellmEndpoint);
|
|
91
|
+
const hasGemini = Boolean(cfg.apiKey);
|
|
92
|
+
|
|
93
|
+
if (cfg.localProvider === 'litellm' && !hasLite) {
|
|
94
|
+
if (hasGemini) {
|
|
95
|
+
if (cfg.debug) {
|
|
96
|
+
console.error('[config] LITELLM_ENDPOINT missing; falling back to localProvider=gemini');
|
|
104
97
|
}
|
|
98
|
+
cfg = { ...cfg, localProvider: 'gemini' };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
105
101
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
cfg = { ...cfg, localProvider: 'litellm' };
|
|
112
|
-
}
|
|
102
|
+
if (cfg.localProvider === 'gemini' && !hasGemini) {
|
|
103
|
+
if (hasLite) {
|
|
104
|
+
if (cfg.debug) {
|
|
105
|
+
console.error('[config] GEMINI_API_KEY missing; falling back to localProvider=litellm');
|
|
113
106
|
}
|
|
107
|
+
cfg = { ...cfg, localProvider: 'litellm' };
|
|
108
|
+
}
|
|
109
|
+
}
|
|
114
110
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
111
|
+
// Validate mode-specific requirements after applying fallbacks
|
|
112
|
+
if (cfg.localProvider === 'gemini' && !cfg.apiKey) {
|
|
113
|
+
console.error('[config] Local mode (gemini) requires GEMINI_API_KEY environment variable');
|
|
114
|
+
throw new Error('Missing Gemini API key for local mode');
|
|
115
|
+
}
|
|
120
116
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
117
|
+
if (cfg.localProvider === 'litellm' && !cfg.litellmEndpoint) {
|
|
118
|
+
console.error('[config] Local mode (litellm) requires LITELLM_ENDPOINT');
|
|
119
|
+
throw new Error('Missing LiteLLM endpoint for local mode');
|
|
125
120
|
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (cfg.mode === 'remote' && !cfg.remoteEndpoint) {
|
|
124
|
+
console.error('[config] Remote mode requires GEMINI_DESIGNER_REMOTE_ENDPOINT');
|
|
125
|
+
throw new Error('Missing remote endpoint for remote mode');
|
|
126
|
+
}
|
|
126
127
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
128
|
+
// Security: avoid sending API keys over plain HTTP except for local dev.
|
|
129
|
+
if (cfg.mode === 'remote' && cfg.remoteEndpoint) {
|
|
130
|
+
const u = new URL(cfg.remoteEndpoint);
|
|
131
|
+
const isLocalhost = u.hostname === 'localhost' || u.hostname === '127.0.0.1' || u.hostname === '::1';
|
|
132
|
+
if (u.protocol !== 'https:' && !(u.protocol === 'http:' && isLocalhost)) {
|
|
133
|
+
console.error(
|
|
134
|
+
'[config] GEMINI_DESIGNER_REMOTE_ENDPOINT must be https:// (or http://localhost for local dev)'
|
|
135
|
+
);
|
|
136
|
+
throw new Error('Insecure remote endpoint (HTTP)');
|
|
130
137
|
}
|
|
138
|
+
}
|
|
131
139
|
|
|
132
|
-
|
|
140
|
+
return cfg;
|
|
133
141
|
}
|
|
134
142
|
|
|
135
143
|
/**
|
|
136
144
|
* Load from .gemini-designer.json config file
|
|
137
145
|
*/
|
|
138
146
|
function loadConfigFile(): Partial<Config> {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
147
|
+
const configPath = path.join(process.cwd(), '.gemini-designer.json');
|
|
148
|
+
|
|
149
|
+
if (!fs.existsSync(configPath)) {
|
|
150
|
+
return {};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
try {
|
|
154
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
155
|
+
return JSON.parse(content);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
console.error('[config] Error reading config file:', error);
|
|
158
|
+
return {};
|
|
159
|
+
}
|
|
152
160
|
}
|
|
153
161
|
|
|
154
162
|
/**
|
|
155
163
|
* Load from environment variables
|
|
156
164
|
*/
|
|
157
165
|
function loadConfigFromEnv(): Partial<Config> {
|
|
158
|
-
|
|
166
|
+
const config: Partial<Config> = {};
|
|
159
167
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
168
|
+
if (process.env.GEMINI_API_KEY) {
|
|
169
|
+
config.apiKey = process.env.GEMINI_API_KEY;
|
|
170
|
+
}
|
|
163
171
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
172
|
+
if (process.env.GEMINI_DESIGNER_MODE) {
|
|
173
|
+
config.mode = process.env.GEMINI_DESIGNER_MODE as 'local' | 'remote';
|
|
174
|
+
}
|
|
167
175
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
176
|
+
if (process.env.GEMINI_DESIGNER_LOCAL_PROVIDER) {
|
|
177
|
+
config.localProvider = process.env.GEMINI_DESIGNER_LOCAL_PROVIDER as Config['localProvider'];
|
|
178
|
+
}
|
|
171
179
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
180
|
+
if (process.env.GEMINI_DESIGNER_REMOTE_ENDPOINT) {
|
|
181
|
+
config.remoteEndpoint = process.env.GEMINI_DESIGNER_REMOTE_ENDPOINT;
|
|
182
|
+
}
|
|
175
183
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
184
|
+
if (process.env.GEMINI_DESIGNER_REMOTE_API_KEY) {
|
|
185
|
+
config.remoteApiKey = process.env.GEMINI_DESIGNER_REMOTE_API_KEY;
|
|
186
|
+
}
|
|
179
187
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
188
|
+
if (process.env.GEMINI_DESIGNER_DEBUG === 'true') {
|
|
189
|
+
config.debug = true;
|
|
190
|
+
}
|
|
183
191
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
192
|
+
if (process.env.GEMINI_DESIGNER_FRAMEWORK) {
|
|
193
|
+
config.defaultFramework = process.env.GEMINI_DESIGNER_FRAMEWORK as Config['defaultFramework'];
|
|
194
|
+
}
|
|
187
195
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
196
|
+
if (process.env.GEMINI_MODEL) {
|
|
197
|
+
config.model = process.env.GEMINI_MODEL;
|
|
198
|
+
}
|
|
191
199
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
200
|
+
if (process.env.LITELLM_ENDPOINT) {
|
|
201
|
+
config.litellmEndpoint = process.env.LITELLM_ENDPOINT;
|
|
202
|
+
}
|
|
195
203
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
204
|
+
if (process.env.LITELLM_API_KEY) {
|
|
205
|
+
config.litellmApiKey = process.env.LITELLM_API_KEY;
|
|
206
|
+
}
|
|
199
207
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
208
|
+
if (process.env.LITELLM_MODEL) {
|
|
209
|
+
config.litellmModel = process.env.LITELLM_MODEL;
|
|
210
|
+
}
|
|
203
211
|
|
|
204
|
-
|
|
212
|
+
return config;
|
|
205
213
|
}
|
|
206
214
|
|
|
207
215
|
/**
|
|
208
216
|
* Load from CLI arguments
|
|
209
217
|
*/
|
|
210
218
|
function loadConfigFromArgs(): Partial<Config> {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
219
|
+
const args = process.argv.slice(2);
|
|
220
|
+
const config: Partial<Config> = {};
|
|
221
|
+
|
|
222
|
+
for (let i = 0; i < args.length; i++) {
|
|
223
|
+
const arg = args[i];
|
|
224
|
+
|
|
225
|
+
if (arg === '--local') {
|
|
226
|
+
config.mode = 'local';
|
|
227
|
+
} else if (arg === '--remote') {
|
|
228
|
+
config.mode = 'remote';
|
|
229
|
+
} else if (arg === '--provider' && args[i + 1]) {
|
|
230
|
+
config.localProvider = args[++i] as Config['localProvider'];
|
|
231
|
+
} else if (arg === '--debug') {
|
|
232
|
+
config.debug = true;
|
|
233
|
+
} else if (arg === '--api-key' && args[i + 1]) {
|
|
234
|
+
config.apiKey = args[++i];
|
|
235
|
+
} else if (arg === '--litellm-endpoint' && args[i + 1]) {
|
|
236
|
+
config.litellmEndpoint = args[++i];
|
|
237
|
+
} else if (arg === '--litellm-model' && args[i + 1]) {
|
|
238
|
+
config.litellmModel = args[++i];
|
|
239
|
+
} else if (arg === '--endpoint' && args[i + 1]) {
|
|
240
|
+
config.remoteEndpoint = args[++i];
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return config;
|
|
237
245
|
}
|