callman-mcp 0.8.0 → 0.9.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/CHANGELOG.md +55 -0
- package/README.md +25 -9
- package/dist/client/api.d.ts +39 -1
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +53 -0
- package/dist/client/api.js.map +1 -1
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +28 -1
- package/dist/client/errors.js.map +1 -1
- package/dist/client/http.d.ts +2 -1
- package/dist/client/http.d.ts.map +1 -1
- package/dist/client/http.js +4 -2
- package/dist/client/http.js.map +1 -1
- package/dist/client/types.d.ts +92 -1
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js +0 -3
- package/dist/client/types.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +8 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -0
- package/dist/context.js.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/resources/docs/mocks.d.ts +1 -1
- package/dist/resources/docs/mocks.d.ts.map +1 -1
- package/dist/resources/docs/mocks.js +349 -114
- package/dist/resources/docs/mocks.js.map +1 -1
- package/dist/resources/docs/overview.d.ts +1 -1
- package/dist/resources/docs/overview.d.ts.map +1 -1
- package/dist/resources/docs/overview.js +5 -1
- package/dist/resources/docs/overview.js.map +1 -1
- package/dist/resources/generated/aiPacks.d.ts +1 -1
- package/dist/resources/generated/aiPacks.js +2 -2
- package/dist/resources/index.js +1 -1
- package/dist/resources/index.js.map +1 -1
- package/dist/server.d.ts +3 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/catalog.d.ts.map +1 -1
- package/dist/tools/catalog.js +15 -1
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/import.d.ts.map +1 -1
- package/dist/tools/import.js +7 -1
- package/dist/tools/import.js.map +1 -1
- package/dist/tools/mockData.d.ts +4 -0
- package/dist/tools/mockData.d.ts.map +1 -0
- package/dist/tools/mockData.js +384 -0
- package/dist/tools/mockData.js.map +1 -0
- package/dist/tools/mockEngine.d.ts +129 -0
- package/dist/tools/mockEngine.d.ts.map +1 -0
- package/dist/tools/mockEngine.js +225 -0
- package/dist/tools/mockEngine.js.map +1 -0
- package/dist/tools/mockImport.d.ts +5 -0
- package/dist/tools/mockImport.d.ts.map +1 -0
- package/dist/tools/mockImport.js +298 -0
- package/dist/tools/mockImport.js.map +1 -0
- package/dist/tools/mockSchemas.d.ts +12272 -0
- package/dist/tools/mockSchemas.d.ts.map +1 -0
- package/dist/tools/mockSchemas.js +247 -0
- package/dist/tools/mockSchemas.js.map +1 -0
- package/dist/tools/mockShared.d.ts +5449 -77
- package/dist/tools/mockShared.d.ts.map +1 -1
- package/dist/tools/mockShared.js +101 -43
- package/dist/tools/mockShared.js.map +1 -1
- package/dist/tools/mocks.d.ts.map +1 -1
- package/dist/tools/mocks.js +117 -35
- package/dist/tools/mocks.js.map +1 -1
- package/dist/tools/mocksLocal.d.ts +27 -3
- package/dist/tools/mocksLocal.d.ts.map +1 -1
- package/dist/tools/mocksLocal.js +118 -26
- package/dist/tools/mocksLocal.js.map +1 -1
- package/dist/tools/uiTestAdmin.d.ts.map +1 -1
- package/dist/tools/uiTestAdmin.js +3 -1
- package/dist/tools/uiTestAdmin.js.map +1 -1
- package/dist-cjs/client/api.js +53 -0
- package/dist-cjs/client/errors.js +28 -1
- package/dist-cjs/client/http.js +4 -2
- package/dist-cjs/client/types.js +0 -3
- package/dist-cjs/config.js +2 -0
- package/dist-cjs/context.js +1 -0
- package/dist-cjs/resources/docs/mocks.js +349 -114
- package/dist-cjs/resources/docs/overview.js +5 -1
- package/dist-cjs/resources/generated/aiPacks.js +2 -2
- package/dist-cjs/resources/index.js +1 -1
- package/dist-cjs/server.js +2 -0
- package/dist-cjs/tools/catalog.js +15 -1
- package/dist-cjs/tools/import.js +7 -1
- package/dist-cjs/tools/mockData.js +387 -0
- package/dist-cjs/tools/mockEngine.js +243 -0
- package/dist-cjs/tools/mockImport.js +302 -0
- package/dist-cjs/tools/mockSchemas.js +253 -0
- package/dist-cjs/tools/mockShared.js +113 -53
- package/dist-cjs/tools/mocks.js +121 -39
- package/dist-cjs/tools/mocksLocal.js +133 -35
- package/dist-cjs/tools/uiTestAdmin.js +3 -1
- package/package.json +3 -3
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { defaultUserAuth, exampleBodyForEndpoint, MOCK_RESOURCE_TEMPLATES, normalizeMockDefinition, normalizeResource, resourceEndpointRoutes, validateMockDefinition, } from "callman-core/mock-engine";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { CallmanApiError, ToolInputError } from "../client/errors.js";
|
|
4
|
+
import { assertRoutePath, curlLine, faultsView, routeEngineFeatures, toServerRoute } from "./mockShared.js";
|
|
5
|
+
import { fromAuthRequirement, toAuthRequirement, toFaultConfig } from "./mockSchemas.js";
|
|
6
|
+
const V1 = { version: 1, features: [], limits: {} };
|
|
7
|
+
// `GET /api/mocks/policy` carries `engine` from mock engine v2 on; a server
|
|
8
|
+
// without it is v1. Servers older than the lifetime policy answer the route
|
|
9
|
+
// with 404 (they read "policy" as a mock id) — v1 as well.
|
|
10
|
+
export const mockEngineOf = (ctx, wsId) => ctx.cache.getOrSet(`mock-engine:${wsId}`, async () => {
|
|
11
|
+
try {
|
|
12
|
+
const engine = (await ctx.api.getMockPolicy(wsId))?.engine;
|
|
13
|
+
return engine && typeof engine.version === "number" && engine.version >= 2 ? { version: engine.version, features: engine.features ?? [], limits: engine.limits ?? {} } : V1;
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof CallmanApiError && error.status === 404)
|
|
17
|
+
return V1;
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
const FEATURE_LABELS = {
|
|
22
|
+
resources: "resources",
|
|
23
|
+
"data-actions": "data routes",
|
|
24
|
+
"user-auth": "user sign-in",
|
|
25
|
+
faults: "faults",
|
|
26
|
+
sessions: "test sessions",
|
|
27
|
+
import: "mock import",
|
|
28
|
+
definition: "whole-mock definitions (also what a local mock beyond static routes is written with)",
|
|
29
|
+
};
|
|
30
|
+
// An older server drops the keys it does not know WITHOUT an error: the mock
|
|
31
|
+
// would be created without the resources, sign-in or faults that were asked
|
|
32
|
+
// for. So refuse before anything is written. `used` = [where, feature].
|
|
33
|
+
export const requireEngine = (engine, used) => {
|
|
34
|
+
const missing = used.filter(([, feature]) => engine.version < 2 || !engine.features.includes(feature));
|
|
35
|
+
if (missing.length === 0)
|
|
36
|
+
return;
|
|
37
|
+
const what = [...new Set(missing.map(([, feature]) => FEATURE_LABELS[feature] ?? feature))].join(", ");
|
|
38
|
+
throw new ToolInputError("MOCK_ENGINE_UNSUPPORTED", engine.version < 2
|
|
39
|
+
? `This Callman server runs mock engine v1, which has no ${what} (${missing.map(([where]) => where).join(", ")}). Nothing was created or changed.`
|
|
40
|
+
: `This Callman server's mock engine does not offer ${what} (${missing.map(([where]) => where).join(", ")}). Nothing was created or changed.`, {
|
|
41
|
+
serverEngine: engine.version,
|
|
42
|
+
unsupported: missing.map(([where, feature]) => ({ where, feature })),
|
|
43
|
+
hint: "An older server drops fields it does not know without an error, so these are refused up front. Mock engine v2 (resources, data routes, user sign-in, faults, test sessions, import) needs callman-backend built on callman-core 1.39 or later — ask the administrator to update the server. Until then, describe the API with static, template and builder routes over state (callman://docs/mocks).",
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
// The local-mock relay learnt the v2 ops (define / records / sessions) with
|
|
47
|
+
// the same server release; an older one answers them with a validation error.
|
|
48
|
+
export const requireRelayEngine = async (ctx, wsId, what) => {
|
|
49
|
+
requireEngine(await mockEngineOf(ctx, wsId), [[what, "definition"]]);
|
|
50
|
+
};
|
|
51
|
+
// ── conversion: tool input → server shapes ──────────────────────────────
|
|
52
|
+
const templateResource = (id) => {
|
|
53
|
+
const template = MOCK_RESOURCE_TEMPLATES.find((entry) => entry.id === id);
|
|
54
|
+
if (!template)
|
|
55
|
+
return {};
|
|
56
|
+
const resource = template.resource();
|
|
57
|
+
return { idField: resource.idField, idStrategy: resource.idStrategy, fields: resource.fields, ...(resource.seed ? { seed: resource.seed } : {}) };
|
|
58
|
+
};
|
|
59
|
+
const toEndpoints = (endpoints) => Object.fromEntries(Object.entries(endpoints)
|
|
60
|
+
.filter(([, value]) => value !== undefined)
|
|
61
|
+
.map(([name, value]) => {
|
|
62
|
+
if (typeof value === "boolean")
|
|
63
|
+
return [name, value];
|
|
64
|
+
const { protected: guard, faults, ...rest } = value;
|
|
65
|
+
return [name, { ...rest, ...(guard !== undefined ? { auth: toAuthRequirement(guard) } : {}), ...(faults ? { faults: toFaultConfig(faults) } : {}) }];
|
|
66
|
+
}));
|
|
67
|
+
// A resource as `POST …/resources` (and a definition's `resources[]`) takes it.
|
|
68
|
+
export const toServerResource = (input, where, options = {}) => {
|
|
69
|
+
const { template, protected: guard, endpoints, basePath, ...rest } = input;
|
|
70
|
+
const name = rest.name ?? template;
|
|
71
|
+
if (!options.partial && !name)
|
|
72
|
+
throw new ToolInputError("MOCK_RESOURCE_NAME_REQUIRED", `${where}: give the resource a name (or a template).`);
|
|
73
|
+
if (basePath !== undefined)
|
|
74
|
+
assertRoutePath(basePath, `${where}.basePath`);
|
|
75
|
+
return {
|
|
76
|
+
...(template ? templateResource(template) : {}),
|
|
77
|
+
...rest,
|
|
78
|
+
...(name ? { name } : {}),
|
|
79
|
+
...(basePath !== undefined ? { basePath } : {}),
|
|
80
|
+
...(guard !== undefined ? { auth: toAuthRequirement(guard) } : {}),
|
|
81
|
+
...(endpoints ? { endpoints: toEndpoints(endpoints) } : {}),
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
// Sign-in as the server takes it: the endpoints' paths are filled in (the
|
|
85
|
+
// server needs a path for every endpoint it is given).
|
|
86
|
+
export const toServerUserAuth = (input, where) => {
|
|
87
|
+
const { endpoints, ...rest } = input;
|
|
88
|
+
const defaults = defaultUserAuth(input.usersResource ?? "users").endpoints;
|
|
89
|
+
const filled = endpoints
|
|
90
|
+
? Object.fromEntries(["login", "register", "me"]
|
|
91
|
+
.filter((key) => endpoints[key])
|
|
92
|
+
.map((key) => {
|
|
93
|
+
const endpoint = endpoints[key] ?? {};
|
|
94
|
+
if (endpoint.path)
|
|
95
|
+
assertRoutePath(endpoint.path, `${where}.endpoints.${key}.path`);
|
|
96
|
+
return [key, { enabled: endpoint.enabled ?? true, path: endpoint.path ?? defaults[key].path }];
|
|
97
|
+
}))
|
|
98
|
+
: undefined;
|
|
99
|
+
return { ...rest, usersResource: input.usersResource ?? "users", ...(filled ? { endpoints: filled } : {}) };
|
|
100
|
+
};
|
|
101
|
+
// The engine v2 parts a create uses, as [where, feature] for requireEngine.
|
|
102
|
+
export const definitionFeatures = (input) => [
|
|
103
|
+
...(input.resources?.length ? [["resources", "resources"]] : []),
|
|
104
|
+
...(input.userAuth ? [["userAuth", "user-auth"]] : []),
|
|
105
|
+
...(input.faults ? [["faults", "faults"]] : []),
|
|
106
|
+
...(input.routes ?? []).flatMap((route, index) => routeEngineFeatures(route, `routes[${index}]`)),
|
|
107
|
+
];
|
|
108
|
+
// A whole mock as `POST /api/mocks { definition }` and the relay's `define`
|
|
109
|
+
// take it.
|
|
110
|
+
export const toServerDefinition = (input) => ({
|
|
111
|
+
routes: (input.routes ?? []).map((route, index) => toServerRoute(route, `routes[${index}]`)),
|
|
112
|
+
resources: (input.resources ?? []).map((resource, index) => toServerResource(resource, `resources[${index}]`)),
|
|
113
|
+
...(input.userAuth ? { userAuth: toServerUserAuth(input.userAuth, "userAuth") } : {}),
|
|
114
|
+
...(input.faults ? { faults: toFaultConfig(input.faults) } : {}),
|
|
115
|
+
});
|
|
116
|
+
// What the server (or the desktop) will refuse in a whole definition —
|
|
117
|
+
// callman-core's own validator, for dry runs. The writes themselves leave the
|
|
118
|
+
// verdict to the server, which answers MOCK_DEFINITION_INVALID with the same
|
|
119
|
+
// issues and writes nothing.
|
|
120
|
+
export const definitionIssues = (draft) => validateMockDefinition(normalizeMockDefinition(draft)).slice(0, 50);
|
|
121
|
+
// ── views ───────────────────────────────────────────────────────────────
|
|
122
|
+
const endpointView = (config) => {
|
|
123
|
+
const guard = fromAuthRequirement(config.auth);
|
|
124
|
+
const { enabled, auth: _auth, faults, ...rest } = config;
|
|
125
|
+
const extra = { ...rest, ...(guard !== undefined ? { protected: guard } : {}), ...faultsView(faults) };
|
|
126
|
+
return Object.keys(extra).length === 0 ? enabled : { enabled, ...extra };
|
|
127
|
+
};
|
|
128
|
+
// A resource the way add_mock_resource / update_mock_resource take it; seed
|
|
129
|
+
// records are counted, not listed (query_mock_records reads the data).
|
|
130
|
+
export const resourceView = (resource, recordCount) => {
|
|
131
|
+
const guard = fromAuthRequirement(resource.auth);
|
|
132
|
+
const seedRecords = resource.seed?.records?.length ?? 0;
|
|
133
|
+
return {
|
|
134
|
+
name: resource.name,
|
|
135
|
+
resourceId: resource.resourceId,
|
|
136
|
+
basePath: resource.basePath,
|
|
137
|
+
idField: resource.idField,
|
|
138
|
+
idStrategy: resource.idStrategy,
|
|
139
|
+
...(resource.lookupField ? { lookupField: resource.lookupField } : {}),
|
|
140
|
+
...(resource.allowClientId !== undefined ? { allowClientId: resource.allowClientId } : {}),
|
|
141
|
+
fields: resource.fields,
|
|
142
|
+
additionalFields: resource.additionalFields,
|
|
143
|
+
timestamps: resource.timestamps,
|
|
144
|
+
...(resource.ownerField ? { ownerField: resource.ownerField } : {}),
|
|
145
|
+
...(guard !== undefined ? { protected: guard } : {}),
|
|
146
|
+
endpoints: Object.fromEntries(Object.entries(resource.endpoints ?? {}).map(([name, config]) => [name, endpointView(config)])),
|
|
147
|
+
list: resource.list,
|
|
148
|
+
...(resource.seed ? { seed: { ...(seedRecords ? { records: `${seedRecords} record(s)` } : {}), ...(resource.seed.generate ? { generate: resource.seed.generate } : {}), ...(resource.seed.salt ? { salt: resource.seed.salt } : {}) } } : {}),
|
|
149
|
+
...(recordCount !== undefined ? { recordCount } : {}),
|
|
150
|
+
};
|
|
151
|
+
};
|
|
152
|
+
export const userAuthView = (userAuth) => {
|
|
153
|
+
if (!userAuth)
|
|
154
|
+
return undefined;
|
|
155
|
+
const { secret: _secret, hasSecret: _hasSecret, ...rest } = userAuth;
|
|
156
|
+
return rest;
|
|
157
|
+
};
|
|
158
|
+
// The engine v2 parts of a server mock, in the shapes the tools take.
|
|
159
|
+
export const mockEngineView = (mock) => ({
|
|
160
|
+
...(mock.resources?.length ? { resources: mock.resources.map((resource) => resourceView(resource)) } : {}),
|
|
161
|
+
...(mock.userAuth ? { userAuth: userAuthView(mock.userAuth) } : {}),
|
|
162
|
+
...faultsView(mock.faults),
|
|
163
|
+
...(mock.sessions ? { sessions: mock.sessions } : {}),
|
|
164
|
+
});
|
|
165
|
+
// Is this endpoint behind sign-in? (Its own requirement, else the resource's,
|
|
166
|
+
// else the mock-wide default `protect`.)
|
|
167
|
+
const needsUser = (resource, endpoint, userAuth) => {
|
|
168
|
+
if (!userAuth || userAuth.enabled === false)
|
|
169
|
+
return false;
|
|
170
|
+
const own = resource.endpoints[endpoint]?.auth ?? resource.auth;
|
|
171
|
+
if (own !== undefined)
|
|
172
|
+
return own !== "none";
|
|
173
|
+
return userAuth.protect === "resources" || userAuth.protect === "all";
|
|
174
|
+
};
|
|
175
|
+
// The auto CRUD endpoints of each resource (never stored as routes), with a
|
|
176
|
+
// curl line each — an example body from the fields for writes.
|
|
177
|
+
export const resourceCalls = (baseUrl, resources, userAuth, token) => resources.flatMap((draft) => {
|
|
178
|
+
const resource = normalizeResource(draft);
|
|
179
|
+
return resourceEndpointRoutes(resource)
|
|
180
|
+
.filter((entry) => resource.endpoints[entry.endpoint]?.enabled !== false)
|
|
181
|
+
.map((entry) => {
|
|
182
|
+
const body = entry.endpoint === "create" || entry.endpoint === "replace" || entry.endpoint === "patch" ? exampleBodyForEndpoint(resource, entry.endpoint, 1) : undefined;
|
|
183
|
+
const route = { method: entry.method, path: entry.path, ...(body ? { body } : {}), bearer: needsUser(resource, entry.endpoint, userAuth) };
|
|
184
|
+
return { resource: resource.name, endpoint: entry.endpoint, route: `${entry.method} ${entry.path}`, curl: curlLine(baseUrl, route, token) };
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
// A curl line per route, per resource endpoint and per sign-in endpoint.
|
|
188
|
+
export const definitionCalls = (baseUrl, definition, token) => {
|
|
189
|
+
const userAuth = definition.userAuth && definition.userAuth.enabled !== false ? definition.userAuth : null;
|
|
190
|
+
return [
|
|
191
|
+
...(definition.routes ?? []).map((route) => {
|
|
192
|
+
const bearer = Boolean(userAuth) && (route.auth !== undefined && route.auth !== null ? route.auth !== "none" : userAuth?.protect === "all");
|
|
193
|
+
return { route: `${route.method} ${route.path}`, curl: curlLine(baseUrl, { ...route, bearer }, token) };
|
|
194
|
+
}),
|
|
195
|
+
...resourceCalls(baseUrl, definition.resources ?? [], userAuth, token),
|
|
196
|
+
...userAuthCalls(baseUrl, userAuth, definition.resources ?? [], token),
|
|
197
|
+
];
|
|
198
|
+
};
|
|
199
|
+
export const MOCK_TOKEN_HEADER = "X-Mock-Token";
|
|
200
|
+
export const mockAuthArg = z.enum(["public", "token"]).describe('"public" (default): anyone with the URL can call it. "token": callers must send the X-Mock-Token header; the token is shown once, when it is generated.');
|
|
201
|
+
export const mockAuthView = (mock, token, note) => mock.auth.type === "token"
|
|
202
|
+
? { type: "token", header: MOCK_TOKEN_HEADER, ...(token ? { token } : { tokenMasked: true }), ...(note ? { note } : {}) }
|
|
203
|
+
: { type: "public" };
|
|
204
|
+
// A curl line per route (and, engine v2, per resource endpoint and sign-in endpoint).
|
|
205
|
+
export const mockCalls = (mock, token) => definitionCalls(mock.publicUrl, { routes: mock.routes ?? [], resources: mock.resources ?? [], userAuth: mock.userAuth }, mock.auth.type === "token" ? (token ?? null) : undefined);
|
|
206
|
+
// login / register / me of the mock's user sign-in (register with an example
|
|
207
|
+
// user of the users resource).
|
|
208
|
+
export const userAuthCalls = (baseUrl, userAuth, resources, token) => {
|
|
209
|
+
if (!userAuth || userAuth.enabled === false)
|
|
210
|
+
return [];
|
|
211
|
+
const endpoints = { ...defaultUserAuth(userAuth.usersResource).endpoints, ...(userAuth.endpoints ?? {}) };
|
|
212
|
+
const identity = userAuth.identityField ?? "email";
|
|
213
|
+
const password = userAuth.passwordField ?? "password";
|
|
214
|
+
const credentials = { [identity]: identity === "email" ? "ada@example.com" : "ada", [password]: "secret123" };
|
|
215
|
+
const users = resources.find((resource) => resource.name === userAuth.usersResource);
|
|
216
|
+
const newUser = { ...(users ? (exampleBodyForEndpoint(normalizeResource(users), "create", 1) ?? {}) : {}), ...credentials };
|
|
217
|
+
return ["register", "login", "me"]
|
|
218
|
+
.filter((key) => endpoints[key]?.enabled !== false)
|
|
219
|
+
.map((key) => {
|
|
220
|
+
const method = key === "me" ? "GET" : "POST";
|
|
221
|
+
const route = { method, path: endpoints[key].path, ...(key === "me" ? { bearer: true } : { body: key === "register" ? newUser : credentials }) };
|
|
222
|
+
return { signIn: key, route: `${method} ${endpoints[key].path}`, curl: curlLine(baseUrl, route, token) };
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
//# sourceMappingURL=mockEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockEngine.js","sourceRoot":"","sources":["../../src/tools/mockEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { ToolContext } from "../context.js";
|
|
3
|
+
export declare const isPrivateAddress: (raw: string) => boolean;
|
|
4
|
+
export declare const registerMockImportTool: (server: McpServer, ctx: ToolContext) => void;
|
|
5
|
+
//# sourceMappingURL=mockImport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockImport.d.ts","sourceRoot":"","sources":["../../src/tools/mockImport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AA6BjD,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,OAS9C,CAAC;AAiIF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,EAAE,KAAK,WAAW,KAAG,IA0I5E,CAAC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ToolInputError } from "../client/errors.js";
|
|
3
|
+
import { resolvedSummary } from "../domain/resolve.js";
|
|
4
|
+
import { definitionCalls, mockAuthArg, mockAuthView, mockCalls, mockEngineOf, mockEngineView, requireEngine } from "./mockEngine.js";
|
|
5
|
+
import { strictObject } from "./mockSchemas.js";
|
|
6
|
+
import { findMock, localBaseUrl, localMockView, mockDetailView, mockRefArg, requireTarget, targetArg } from "./mockShared.js";
|
|
7
|
+
import { findLocal, localDefinitionOf, relayWorkspace, runLocalMockV2 } from "./mocksLocal.js";
|
|
8
|
+
import { findCollection, workspaceTag } from "./lookups.js";
|
|
9
|
+
import { dryRunArg, guarded, ok, WRITE, workspaceArg } from "./shared.js";
|
|
10
|
+
// import_mock: a mock from an OpenAPI 3.x / Swagger 2.0 document, a Postman
|
|
11
|
+
// collection (its saved examples) or a Callman collection (its newest recorded
|
|
12
|
+
// responses). The conversion runs on the server (POST /api/import/mocks), but
|
|
13
|
+
// the server never fetches anything: a URL or a file is read HERE, by this
|
|
14
|
+
// process, and sent as `content`. Files and URLs on this machine or a private
|
|
15
|
+
// network are refused unless CALLMAN_ALLOW_LOCAL_SOURCES is on — otherwise a
|
|
16
|
+
// prompt could have the model publish a local file or an intranet page as a
|
|
17
|
+
// public mock. A local mock (target "desktop") is converted the same way and
|
|
18
|
+
// written to the desktop app with the relay's `define`.
|
|
19
|
+
const DEFAULT_MAX_IMPORT_BYTES = 2 * 1024 * 1024;
|
|
20
|
+
const HARD_MAX_IMPORT_BYTES = 20 * 1024 * 1024;
|
|
21
|
+
const MAX_REDIRECTS = 5;
|
|
22
|
+
// ── local / private addresses ───────────────────────────────────────────
|
|
23
|
+
const PRIVATE_V4 = [/^127\./, /^10\./, /^192\.168\./, /^172\.(1[6-9]|2\d|3[01])\./, /^169\.254\./, /^0\./, /^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./];
|
|
24
|
+
const isIpLiteral = (host) => /^\d{1,3}(\.\d{1,3}){3}$/.test(host) || host.includes(":");
|
|
25
|
+
export const isPrivateAddress = (raw) => {
|
|
26
|
+
const address = raw.toLowerCase().replace(/^\[|\]$/g, "");
|
|
27
|
+
if (address.includes(":")) {
|
|
28
|
+
if (address === "::1" || address === "::")
|
|
29
|
+
return true;
|
|
30
|
+
const mapped = /^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/.exec(address);
|
|
31
|
+
if (mapped)
|
|
32
|
+
return isPrivateAddress(mapped[1]);
|
|
33
|
+
return /^f[cd]/.test(address) || /^fe[89ab]/.test(address);
|
|
34
|
+
}
|
|
35
|
+
return PRIVATE_V4.some((pattern) => pattern.test(address));
|
|
36
|
+
};
|
|
37
|
+
// Names that only mean something on this machine or a private network.
|
|
38
|
+
const isLocalName = (host) => host === "localhost" || !host.includes(".") || /\.(localhost|local|internal|lan|home|corp|intranet)$/.test(host);
|
|
39
|
+
const blocked = (what) => new ToolInputError("MOCK_IMPORT_SOURCE_BLOCKED", `${what} — import_mock reads local files and localhost / private-network URLs only when CALLMAN_ALLOW_LOCAL_SOURCES=1 is set for this MCP server.`, {
|
|
40
|
+
hint: "Read the document yourself and pass its text as `content`, or ask the user to set CALLMAN_ALLOW_LOCAL_SOURCES=1 in this MCP server's config and restart it.",
|
|
41
|
+
});
|
|
42
|
+
const assertReachableUrl = async (ctx, url) => {
|
|
43
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
44
|
+
throw new ToolInputError("MOCK_IMPORT_URL_INVALID", `Only http(s) URLs can be imported (got ${url.protocol}).`);
|
|
45
|
+
if (ctx.config.allowLocalSources)
|
|
46
|
+
return;
|
|
47
|
+
const host = url.hostname.toLowerCase().replace(/^\[|\]$/g, "");
|
|
48
|
+
if (isIpLiteral(host) ? isPrivateAddress(host) : isLocalName(host))
|
|
49
|
+
throw blocked(`${url.host} is on this machine or a private network`);
|
|
50
|
+
if (isIpLiteral(host) || !ctx.sources.resolveHost)
|
|
51
|
+
return;
|
|
52
|
+
let addresses = [];
|
|
53
|
+
try {
|
|
54
|
+
addresses = await ctx.sources.resolveHost(host);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return; // unresolvable: the fetch below says so
|
|
58
|
+
}
|
|
59
|
+
if (addresses.some(isPrivateAddress))
|
|
60
|
+
throw blocked(`${url.host} resolves to a private address`);
|
|
61
|
+
};
|
|
62
|
+
const tooLarge = (maxBytes) => new ToolInputError("MOCK_IMPORT_TOO_LARGE", `The document is larger than the ${Math.round(maxBytes / 1024)} KB this server imports.`, { limitBytes: maxBytes });
|
|
63
|
+
const readCapped = async (response, maxBytes) => {
|
|
64
|
+
if (!response.body)
|
|
65
|
+
return "";
|
|
66
|
+
const reader = response.body.getReader();
|
|
67
|
+
const chunks = [];
|
|
68
|
+
let total = 0;
|
|
69
|
+
for (;;) {
|
|
70
|
+
const { done, value } = await reader.read();
|
|
71
|
+
if (done)
|
|
72
|
+
break;
|
|
73
|
+
total += value.byteLength;
|
|
74
|
+
if (total > maxBytes) {
|
|
75
|
+
await reader.cancel().catch(() => undefined);
|
|
76
|
+
throw tooLarge(maxBytes);
|
|
77
|
+
}
|
|
78
|
+
chunks.push(value);
|
|
79
|
+
}
|
|
80
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
81
|
+
};
|
|
82
|
+
// Fetch a document, following redirects by hand so every hop passes the
|
|
83
|
+
// local-address check. No credentials are sent.
|
|
84
|
+
const fetchDocument = async (ctx, raw, maxBytes) => {
|
|
85
|
+
let url;
|
|
86
|
+
try {
|
|
87
|
+
url = new URL(raw);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
throw new ToolInputError("MOCK_IMPORT_URL_INVALID", `"${raw}" is not a URL.`);
|
|
91
|
+
}
|
|
92
|
+
for (let hop = 0; hop <= MAX_REDIRECTS; hop += 1) {
|
|
93
|
+
await assertReachableUrl(ctx, url);
|
|
94
|
+
let response;
|
|
95
|
+
try {
|
|
96
|
+
response = await ctx.sources.fetch(url, { redirect: "manual", headers: { Accept: "application/json, application/yaml, text/yaml, text/plain, */*" }, signal: AbortSignal.timeout(ctx.config.timeoutMs) });
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
throw new ToolInputError("MOCK_IMPORT_FETCH_FAILED", `Could not fetch ${url.href} (${error instanceof Error ? error.message : String(error)}).`);
|
|
100
|
+
}
|
|
101
|
+
const location = response.headers.get("location");
|
|
102
|
+
if (response.status >= 300 && response.status < 400 && location) {
|
|
103
|
+
url = new URL(location, url);
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (!response.ok)
|
|
107
|
+
throw new ToolInputError("MOCK_IMPORT_FETCH_FAILED", `${url.href} answered HTTP ${response.status}.`, { status: response.status });
|
|
108
|
+
const declared = Number(response.headers.get("content-length") ?? Number.NaN);
|
|
109
|
+
if (Number.isFinite(declared) && declared > maxBytes)
|
|
110
|
+
throw tooLarge(maxBytes);
|
|
111
|
+
return { text: await readCapped(response, maxBytes), url: url.href };
|
|
112
|
+
}
|
|
113
|
+
throw new ToolInputError("MOCK_IMPORT_FETCH_FAILED", `${raw} redirects more than ${MAX_REDIRECTS} times.`);
|
|
114
|
+
};
|
|
115
|
+
const readDocumentFile = async (ctx, path, maxBytes) => {
|
|
116
|
+
if (!ctx.config.allowLocalSources)
|
|
117
|
+
throw blocked(`Reading the file ${path} is off`);
|
|
118
|
+
if (!ctx.sources.readFile)
|
|
119
|
+
throw new ToolInputError("MOCK_IMPORT_SOURCE_UNAVAILABLE", "This host cannot read files — pass the document as `content`.");
|
|
120
|
+
try {
|
|
121
|
+
return await ctx.sources.readFile(path, maxBytes);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw new ToolInputError("MOCK_IMPORT_FILE_UNREADABLE", `Could not read ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
// ── views ───────────────────────────────────────────────────────────────
|
|
128
|
+
const REPORT_ITEMS = 60;
|
|
129
|
+
const reportView = (report) => report
|
|
130
|
+
? { summary: report.summary, items: report.items.slice(0, REPORT_ITEMS), ...(report.items.length > REPORT_ITEMS ? { itemsNotShown: report.items.length - REPORT_ITEMS } : {}) }
|
|
131
|
+
: undefined;
|
|
132
|
+
// What a definition holds, one line per route / resource.
|
|
133
|
+
const definitionSummary = (definition) => {
|
|
134
|
+
const routes = (definition?.routes ?? []);
|
|
135
|
+
const resources = (definition?.resources ?? []);
|
|
136
|
+
return {
|
|
137
|
+
routes: routes.slice(0, 100).map((route) => ({
|
|
138
|
+
route: `${route.method} ${route.path}`,
|
|
139
|
+
...(route.name ? { name: route.name } : {}),
|
|
140
|
+
...(route.action ? { data: `${route.action.operation} ${route.action.resource}` } : { response: `${route.response?.type ?? "static"} ${route.response?.statusCode ?? ""}`.trim() }),
|
|
141
|
+
...(route.variants?.length ? { variants: route.variants.length } : {}),
|
|
142
|
+
})),
|
|
143
|
+
...(routes.length > 100 ? { routesNotShown: routes.length - 100 } : {}),
|
|
144
|
+
resources: resources.map((resource) => ({ name: resource.name, basePath: resource.basePath ?? `/${resource.name}`, fields: resource.fields?.length ?? 0, seedRecords: resource.seed?.records?.length ?? 0, ...(resource.seed?.generate ? { generate: resource.seed.generate } : {}) })),
|
|
145
|
+
...(definition?.userAuth ? { userAuth: { usersResource: definition.userAuth.usersResource } } : {}),
|
|
146
|
+
};
|
|
147
|
+
};
|
|
148
|
+
// Merge like the server's `into: { strategy: "merge" }`: keep what the mock
|
|
149
|
+
// has, add the imported routes / resources it does not have yet.
|
|
150
|
+
const mergeDefinitions = (current, imported) => {
|
|
151
|
+
const routeKey = (route) => `${route.method} ${route.path}`;
|
|
152
|
+
const have = new Set(current.routes.map(routeKey));
|
|
153
|
+
const names = new Set(current.resources.map((resource) => resource.name));
|
|
154
|
+
return {
|
|
155
|
+
...current,
|
|
156
|
+
routes: [...current.routes, ...(imported.routes ?? []).filter((route) => !have.has(routeKey(route)))],
|
|
157
|
+
resources: [...current.resources, ...(imported.resources ?? []).filter((resource) => !names.has(String(resource.name)))],
|
|
158
|
+
userAuth: current.userAuth ?? imported.userAuth ?? null,
|
|
159
|
+
faults: current.faults ?? imported.faults ?? null,
|
|
160
|
+
};
|
|
161
|
+
};
|
|
162
|
+
const mockOf = (result) => result.mock;
|
|
163
|
+
export const registerMockImportTool = (server, ctx) => {
|
|
164
|
+
server.registerTool("import_mock", {
|
|
165
|
+
title: "Import a mock API from a spec or collection",
|
|
166
|
+
description: "Mock engine v2: build a mock from an existing API description — an OpenAPI 3.x / Swagger 2.0 document (JSON or YAML), a Postman collection (its saved examples become the answers) or a Callman collection (`collection`: its requests with their newest recorded responses, secrets redacted). CRUD groups (GET/POST /pets + GET/PUT/DELETE /pets/{id}) become resources with seed data from the examples (mode \"auto\", default); everything else becomes routes, extra responses become variants (pick one with X-Mock-Response-Code / X-Mock-Response-Name). Give exactly one source: `content` (the document — e.g. a file you read), `url` (fetched by this MCP server, never by the Callman server) or `filePath` (a file on this machine). Files, and URLs on localhost or a private network, need CALLMAN_ALLOW_LOCAL_SOURCES=1. dryRun: true shows what would be created and the report (converted / needs attention / lost) without creating anything; `into` adds to an existing mock (merge: keep what it has; replace: swap routes and resources). target \"desktop\" creates a local mock in the user's desktop app (mock engine v2).",
|
|
167
|
+
inputSchema: {
|
|
168
|
+
workspace: workspaceArg,
|
|
169
|
+
target: targetArg,
|
|
170
|
+
content: z.union([z.string().min(1).max(HARD_MAX_IMPORT_BYTES), z.record(z.unknown())]).optional().describe("The document itself: JSON or YAML text, or the parsed JSON"),
|
|
171
|
+
url: z.string().min(1).max(2000).optional().describe("http(s) URL of the document (e.g. https://petstore3.swagger.io/api/v3/openapi.json)"),
|
|
172
|
+
filePath: z.string().min(1).max(1000).optional().describe("Path of the document on the machine running this MCP server (relative to where it was started); needs CALLMAN_ALLOW_LOCAL_SOURCES=1"),
|
|
173
|
+
collection: z.string().min(1).max(200).optional().describe("A Callman collection (name or id) — the server reads its requests and recorded responses"),
|
|
174
|
+
format: z.enum(["openapi", "postman", "callman"]).optional().describe("Detected when omitted"),
|
|
175
|
+
mode: z.enum(["auto", "routes"]).optional().describe("auto (default): CRUD groups become resources; routes: one route per operation"),
|
|
176
|
+
name: z.string().trim().min(1).max(50).optional().describe("Default: the document's title"),
|
|
177
|
+
description: z.string().max(200).optional(),
|
|
178
|
+
slug: z.string().min(3).max(48).optional().describe("Server: readable URL name (see create_mock)"),
|
|
179
|
+
auth: mockAuthArg.optional(),
|
|
180
|
+
ttlHours: z.number().int().min(1).max(8_760).optional(),
|
|
181
|
+
validateRequests: z.boolean().optional().describe("OpenAPI: check request bodies against the spec's schemas (default true)"),
|
|
182
|
+
keepServerBasePath: z.boolean().optional().describe("OpenAPI: keep the server's base path (/api/v3) in the mock paths (default false: /pet/1 stays /pet/1)"),
|
|
183
|
+
into: strictObject({ mock: mockRefArg("Mock to import into"), strategy: z.enum(["merge", "replace"]).optional().describe("merge (default): keep its routes / resources, add the new ones (same method + path or resource name is skipped); replace: the imported ones replace them") }, "into").optional(),
|
|
184
|
+
port: z.number().int().min(1024).max(65_535).optional().describe("target desktop: the port on 127.0.0.1"),
|
|
185
|
+
autoStart: z.boolean().optional().describe("target desktop: start whenever the desktop app launches"),
|
|
186
|
+
start: z.boolean().optional().describe("target desktop: start it right away (default true)"),
|
|
187
|
+
dryRun: dryRunArg,
|
|
188
|
+
},
|
|
189
|
+
annotations: WRITE,
|
|
190
|
+
}, guarded(async ({ workspace, target, content, url, filePath, collection, format, mode, name, description, slug, auth, ttlHours, validateRequests, keepServerBasePath, into, port, autoStart, start, dryRun }) => {
|
|
191
|
+
const sources = [content !== undefined && "content", url !== undefined && "url", filePath !== undefined && "filePath", collection !== undefined && "collection"].filter(Boolean);
|
|
192
|
+
if (sources.length !== 1) {
|
|
193
|
+
throw new ToolInputError("MOCK_IMPORT_SOURCE_REQUIRED", sources.length === 0 ? "Give the document: content, url, filePath or collection." : `Give ONE source, not ${sources.join(" and ")}.`);
|
|
194
|
+
}
|
|
195
|
+
const desktop = target === "desktop";
|
|
196
|
+
requireTarget(target ?? "server", { slug, description, ttlHours, auth }, "server", "a local mock has a name and a port.");
|
|
197
|
+
requireTarget(target ?? "server", { port, autoStart, start }, "desktop", 'pass target: "desktop" for a mock on the user\'s computer.');
|
|
198
|
+
// The workspace: the target mock's, the collection's, or the one named
|
|
199
|
+
// (a collection must live in the workspace of the mock it goes into).
|
|
200
|
+
let ws;
|
|
201
|
+
let serverInto;
|
|
202
|
+
let localInto;
|
|
203
|
+
let collectionId;
|
|
204
|
+
if (into && !desktop) {
|
|
205
|
+
const found = await findMock(ctx, workspace, into.mock);
|
|
206
|
+
ws = found.ws;
|
|
207
|
+
serverInto = { mockId: found.value.item.id, resolved: found.value };
|
|
208
|
+
}
|
|
209
|
+
else if (into && desktop) {
|
|
210
|
+
localInto = await findLocal(ctx, workspace, into.mock);
|
|
211
|
+
ws = localInto.ws;
|
|
212
|
+
}
|
|
213
|
+
else if (collection !== undefined) {
|
|
214
|
+
ws = (await findCollection(ctx, workspace, collection)).ws;
|
|
215
|
+
}
|
|
216
|
+
else
|
|
217
|
+
ws = desktop ? await relayWorkspace(ctx, workspace) : await ctx.resolveWorkspace(workspace);
|
|
218
|
+
if (collection !== undefined)
|
|
219
|
+
collectionId = (await findCollection(ctx, ws.id, collection)).value.item.id;
|
|
220
|
+
const engine = await mockEngineOf(ctx, ws.id);
|
|
221
|
+
requireEngine(engine, [["import_mock", "import"], ...(desktop ? [["target desktop", "definition"]] : [])]);
|
|
222
|
+
const maxBytes = Math.min(engine.limits.maxImportBytes ?? DEFAULT_MAX_IMPORT_BYTES, HARD_MAX_IMPORT_BYTES);
|
|
223
|
+
let document = content;
|
|
224
|
+
let fetchedFrom;
|
|
225
|
+
if (url !== undefined) {
|
|
226
|
+
const fetched = await fetchDocument(ctx, url, maxBytes);
|
|
227
|
+
document = fetched.text;
|
|
228
|
+
fetchedFrom = fetched.url;
|
|
229
|
+
}
|
|
230
|
+
else if (filePath !== undefined)
|
|
231
|
+
document = await readDocumentFile(ctx, filePath, maxBytes);
|
|
232
|
+
if (document !== undefined) {
|
|
233
|
+
if (typeof document === "string" && document.trim() === "")
|
|
234
|
+
throw new ToolInputError("MOCK_IMPORT_EMPTY", "The document is empty.");
|
|
235
|
+
if (Buffer.byteLength(typeof document === "string" ? document : JSON.stringify(document), "utf8") > maxBytes)
|
|
236
|
+
throw tooLarge(maxBytes);
|
|
237
|
+
}
|
|
238
|
+
const body = {
|
|
239
|
+
...(document !== undefined ? { content: document } : { collectionId }),
|
|
240
|
+
...(format ? { format } : {}),
|
|
241
|
+
...(mode ? { mode } : {}),
|
|
242
|
+
...(name ? { name } : {}),
|
|
243
|
+
...(description ? { description } : {}),
|
|
244
|
+
...(slug ? { slug } : {}),
|
|
245
|
+
...(auth ? { auth: { type: auth } } : {}),
|
|
246
|
+
...(ttlHours ? { ttlHours } : {}),
|
|
247
|
+
...(validateRequests !== undefined ? { validateRequests } : {}),
|
|
248
|
+
...(keepServerBasePath !== undefined ? { keepServerBasePath } : {}),
|
|
249
|
+
// A local mock: the server only converts; the desktop gets the result.
|
|
250
|
+
dryRun: desktop || Boolean(dryRun),
|
|
251
|
+
...(serverInto ? { into: { mockId: serverInto.mockId, strategy: into?.strategy ?? "merge" } } : {}),
|
|
252
|
+
};
|
|
253
|
+
const result = await ctx.api.importMock(ws.id, body);
|
|
254
|
+
const source = { format: result.format, ...(fetchedFrom ? { fetchedFrom } : {}), ...(filePath ? { filePath } : {}), ...(collection ? { collection } : {}) };
|
|
255
|
+
const report = reportView(result.report);
|
|
256
|
+
if (desktop) {
|
|
257
|
+
const imported = (result.definition ?? {});
|
|
258
|
+
const definition = localInto && (into?.strategy ?? "merge") === "merge" ? mergeDefinitions(localDefinitionOf(localInto.record), imported) : { ...imported };
|
|
259
|
+
if (dryRun)
|
|
260
|
+
return ok({ target: "desktop", dryRun: true, ...source, ...(localInto ? { into: { id: localInto.record.id, name: localInto.record.name, strategy: into?.strategy ?? "merge" } } : {}), preview: definitionSummary(definition), report, stats: result.stats });
|
|
261
|
+
const payload = localInto
|
|
262
|
+
? { mockId: localInto.record.id, definition, ...(localInto.record.definitionRev !== undefined ? { expectedRev: localInto.record.definitionRev } : {}) }
|
|
263
|
+
: { name: (name ?? result.name ?? "Imported mock").slice(0, 50), ...(port !== undefined ? { port } : {}), ...(autoStart !== undefined ? { autoStart } : {}), start: start ?? true, definition };
|
|
264
|
+
const mock = mockOf(await runLocalMockV2(ctx, ws, "define", payload, "import_mock"));
|
|
265
|
+
return ok({
|
|
266
|
+
target: "desktop",
|
|
267
|
+
...source,
|
|
268
|
+
mock: localMockView(mock),
|
|
269
|
+
baseUrl: localBaseUrl(mock),
|
|
270
|
+
calls: mock.definition ? definitionCalls(localBaseUrl(mock), mock.definition, undefined).slice(0, 100) : [],
|
|
271
|
+
report,
|
|
272
|
+
stats: result.stats,
|
|
273
|
+
...(localInto ? { resolved: [resolvedSummary(into?.mock ?? "", localInto.resolved)] } : {}),
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
if (result.dryRun) {
|
|
277
|
+
return ok({ dryRun: true, ...source, ...(result.name ? { name: result.name } : {}), ...(serverInto ? { into: { mockId: serverInto.mockId, strategy: into?.strategy ?? "merge" } } : {}), preview: definitionSummary(result.definition), report, stats: result.stats, workspace: workspaceTag(ws) });
|
|
278
|
+
}
|
|
279
|
+
ctx.invalidate("mocks");
|
|
280
|
+
// A new mock comes back whole (its access token shown once); an import
|
|
281
|
+
// into a mock returns its definition — read the mock for the view.
|
|
282
|
+
const created = result.mock;
|
|
283
|
+
const mock = created ?? (await ctx.api.getMock(ws.id, serverInto?.mockId ?? result.mockId ?? ""));
|
|
284
|
+
const token = created?.auth.type === "token" ? (created.auth.token ?? null) : null;
|
|
285
|
+
return ok({
|
|
286
|
+
...source,
|
|
287
|
+
mock: mockDetailView(mock, ctx.config.apiUrl, mockAuthView(mock, token, token ? "Shown once: only a user with environments:reveal can read it again." : undefined), mockEngineView(mock)),
|
|
288
|
+
publicUrl: result.publicUrl ?? mock.publicUrl,
|
|
289
|
+
calls: mockCalls(mock, token).slice(0, 100),
|
|
290
|
+
report,
|
|
291
|
+
stats: result.stats,
|
|
292
|
+
workspace: workspaceTag(ws),
|
|
293
|
+
...(serverInto ? { resolved: [resolvedSummary(into?.mock ?? "", serverInto.resolved)] } : {}),
|
|
294
|
+
note: report && report.summary.lost > 0 ? `${report.summary.lost} part(s) of the document could not be converted — see report.items with severity "lost".` : `Live now at ${result.publicUrl ?? mock.publicUrl}.`,
|
|
295
|
+
});
|
|
296
|
+
}));
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=mockImport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockImport.js","sourceRoot":"","sources":["../../src/tools/mockImport.ts"],"names":[],"mappings":"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"}
|