funifier-mcp 0.3.18 → 0.3.20
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/.cursor/rules/funifier.mdc +2 -1
- package/.github/copilot-instructions.md +2 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +78 -0
- package/README.md +1 -1
- package/datasource-funifier-docs/.coverage.json +4 -1
- package/datasource-funifier-docs/.search-index.json +949 -605
- package/datasource-funifier-docs/.skills-map.json +5 -0
- package/datasource-funifier-docs/.validation.json +12 -7
- package/datasource-funifier-docs/knowledge/guides/aggregates.md +13 -6
- package/datasource-funifier-docs/knowledge/guides/trigger-examples.md +6 -6
- package/datasource-funifier-docs/knowledge/guides/triggers-guide.md +74 -11
- package/datasource-funifier-docs/knowledge/index.md +2 -2
- package/datasource-funifier-docs/knowledge/modules/trigger.md +29 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +3 -1
- package/dist/cli/init.js.map +1 -1
- package/dist/core/api-client.d.ts +2 -0
- package/dist/core/api-client.d.ts.map +1 -1
- package/dist/core/api-client.js +98 -47
- package/dist/core/api-client.js.map +1 -1
- package/dist/core/api-client.test.js +27 -0
- package/dist/core/api-client.test.js.map +1 -1
- package/dist/core/constants.d.ts +4 -0
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +8 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/logger.d.ts +9 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +50 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/mcp/api-holder.test.d.ts +2 -0
- package/dist/mcp/api-holder.test.d.ts.map +1 -0
- package/dist/mcp/api-holder.test.js +45 -0
- package/dist/mcp/api-holder.test.js.map +1 -0
- package/dist/mcp/bundle.js +114 -111
- package/dist/mcp/check-update.d.ts +9 -0
- package/dist/mcp/check-update.d.ts.map +1 -1
- package/dist/mcp/check-update.js +35 -9
- package/dist/mcp/check-update.js.map +1 -1
- package/dist/mcp/check-update.test.js +36 -6
- package/dist/mcp/check-update.test.js.map +1 -1
- package/dist/mcp/doc-path.d.ts +11 -0
- package/dist/mcp/doc-path.d.ts.map +1 -0
- package/dist/mcp/doc-path.js +66 -0
- package/dist/mcp/doc-path.js.map +1 -0
- package/dist/mcp/doc-path.test.d.ts +2 -0
- package/dist/mcp/doc-path.test.d.ts.map +1 -0
- package/dist/mcp/doc-path.test.js +77 -0
- package/dist/mcp/doc-path.test.js.map +1 -0
- package/dist/mcp/index.js +19 -0
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/resources/documentation.d.ts.map +1 -1
- package/dist/mcp/resources/documentation.js +7 -3
- package/dist/mcp/resources/documentation.js.map +1 -1
- package/dist/mcp/tools/_backup.d.ts.map +1 -1
- package/dist/mcp/tools/_backup.js +5 -3
- package/dist/mcp/tools/_backup.js.map +1 -1
- package/dist/mcp/tools/_char-guard.d.ts +2 -1
- package/dist/mcp/tools/_char-guard.d.ts.map +1 -1
- package/dist/mcp/tools/_char-guard.js +10 -3
- package/dist/mcp/tools/_char-guard.js.map +1 -1
- package/dist/mcp/tools/_fetch-current.d.ts +2 -1
- package/dist/mcp/tools/_fetch-current.d.ts.map +1 -1
- package/dist/mcp/tools/_fetch-current.js +2 -74
- package/dist/mcp/tools/_fetch-current.js.map +1 -1
- package/dist/mcp/tools/_registry.d.ts +183 -0
- package/dist/mcp/tools/_registry.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.js +88 -0
- package/dist/mcp/tools/_registry.js.map +1 -0
- package/dist/mcp/tools/_registry.test.d.ts +2 -0
- package/dist/mcp/tools/_registry.test.d.ts.map +1 -0
- package/dist/mcp/tools/_registry.test.js +103 -0
- package/dist/mcp/tools/_registry.test.js.map +1 -0
- package/dist/mcp/tools/database.d.ts +4 -0
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +23 -4
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +19 -0
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/delete.d.ts.map +1 -1
- package/dist/mcp/tools/delete.js +3 -98
- package/dist/mcp/tools/delete.js.map +1 -1
- package/dist/mcp/tools/execute.d.ts.map +1 -1
- package/dist/mcp/tools/execute.js +36 -4
- package/dist/mcp/tools/execute.js.map +1 -1
- package/dist/mcp/tools/execute.test.d.ts +2 -0
- package/dist/mcp/tools/execute.test.d.ts.map +1 -0
- package/dist/mcp/tools/execute.test.js +87 -0
- package/dist/mcp/tools/execute.test.js.map +1 -0
- package/dist/mcp/tools/get.d.ts.map +1 -1
- package/dist/mcp/tools/get.js +4 -93
- package/dist/mcp/tools/get.js.map +1 -1
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +42 -1
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/list.d.ts.map +1 -1
- package/dist/mcp/tools/list.js +3 -91
- package/dist/mcp/tools/list.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +5 -3
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/read-doc.d.ts.map +1 -1
- package/dist/mcp/tools/read-doc.js +10 -28
- package/dist/mcp/tools/read-doc.js.map +1 -1
- package/dist/mcp/tools/save.d.ts.map +1 -1
- package/dist/mcp/tools/save.js +4 -81
- package/dist/mcp/tools/save.js.map +1 -1
- package/package.json +3 -2
- package/skills/funifier/SKILL.md +2 -1
- package/skills/funifier/references/audit-permissions.md +8 -0
- package/skills/funifier/references/configure-security.md +6 -0
- package/skills/funifier/references/create-action.md +7 -0
- package/skills/funifier/references/create-aggregate.md +99 -79
- package/skills/funifier/references/create-audit.md +8 -0
- package/skills/funifier/references/create-challenge.md +7 -0
- package/skills/funifier/references/create-competition.md +7 -0
- package/skills/funifier/references/create-crossword.md +6 -0
- package/skills/funifier/references/create-custom-object.md +6 -0
- package/skills/funifier/references/create-custom-page.md +6 -0
- package/skills/funifier/references/create-folder.md +7 -0
- package/skills/funifier/references/create-lastmile.md +6 -0
- package/skills/funifier/references/create-leaderboard.md +6 -0
- package/skills/funifier/references/create-level.md +7 -0
- package/skills/funifier/references/create-lottery.md +7 -0
- package/skills/funifier/references/create-mystery.md +6 -0
- package/skills/funifier/references/create-notification.md +6 -0
- package/skills/funifier/references/create-point.md +7 -0
- package/skills/funifier/references/create-quiz.md +7 -0
- package/skills/funifier/references/create-scheduler.md +6 -0
- package/skills/funifier/references/create-story.md +6 -0
- package/skills/funifier/references/create-swap.md +6 -0
- package/skills/funifier/references/create-trigger.md +28 -8
- package/skills/funifier/references/create-virtual-good.md +6 -0
- package/skills/funifier/references/create-webhook.md +6 -0
- package/skills/funifier/references/create-websocket.md +6 -0
- package/skills/funifier/references/create-widget.md +6 -0
- package/skills/funifier/references/date-handling.md +6 -0
- package/skills/funifier/references/help.md +6 -0
- package/skills/funifier/references/implement-frontend.md +7 -0
- package/skills/funifier/references/import-csv.md +6 -0
- package/skills/funifier/references/manage-indexes.md +6 -0
- package/skills/funifier/references/manage-player.md +7 -0
- package/skills/funifier/references/manage-team.md +6 -0
- package/skills/funifier/references/query-aggregate.md +111 -0
- package/skills/funifier/references/upload-file.md +6 -0
|
@@ -77,6 +77,33 @@ function extractErrorMessage(e) {
|
|
|
77
77
|
(0, vitest_1.expect)(() => (0, api_client_1.serializeToFunifierQuery)({ status: ["active", "inactive"] })).toThrow('Array value for field "status" not supported in action=query');
|
|
78
78
|
});
|
|
79
79
|
});
|
|
80
|
+
(0, vitest_1.describe)("shouldRetryRequest", () => {
|
|
81
|
+
const getErr = (over = {}) => ({ config: { method: "get" }, ...over });
|
|
82
|
+
(0, vitest_1.it)("retries a GET on a network error (no response)", () => {
|
|
83
|
+
(0, vitest_1.expect)((0, api_client_1.shouldRetryRequest)(getErr(), 0)).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
(0, vitest_1.it)("retries a GET on a 5xx response", () => {
|
|
86
|
+
(0, vitest_1.expect)((0, api_client_1.shouldRetryRequest)(getErr({ response: { status: 503 } }), 0)).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
(0, vitest_1.it)("retries a GET on a timeout (ECONNABORTED)", () => {
|
|
89
|
+
(0, vitest_1.expect)((0, api_client_1.shouldRetryRequest)(getErr({ code: "ECONNABORTED", response: undefined }), 1)).toBe(true);
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.it)("does not retry a 4xx response", () => {
|
|
92
|
+
(0, vitest_1.expect)((0, api_client_1.shouldRetryRequest)(getErr({ response: { status: 404 } }), 0)).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)("never retries a non-GET (write) request", () => {
|
|
95
|
+
(0, vitest_1.expect)((0, api_client_1.shouldRetryRequest)({ config: { method: "post" } }, 0)).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
(0, vitest_1.it)("stops once the retry cap is reached", () => {
|
|
98
|
+
(0, vitest_1.expect)((0, api_client_1.shouldRetryRequest)(getErr(), 2)).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
(0, vitest_1.describe)("retryDelayMs", () => {
|
|
102
|
+
(0, vitest_1.it)("backs off exponentially from the base delay", () => {
|
|
103
|
+
(0, vitest_1.expect)((0, api_client_1.retryDelayMs)(1)).toBe(300);
|
|
104
|
+
(0, vitest_1.expect)((0, api_client_1.retryDelayMs)(2)).toBe(600);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
80
107
|
(0, vitest_1.describe)("queryCollection operator error propagation", () => {
|
|
81
108
|
(0, vitest_1.it)("propagates operator errors instead of swallowing them as []", async () => {
|
|
82
109
|
const client = (0, api_client_1.createAPIClient)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-client.test.js","sourceRoot":"","sources":["../../src/core/api-client.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"api-client.test.js","sourceRoot":"","sources":["../../src/core/api-client.test.ts"],"names":[],"mappings":"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"}
|
package/dist/core/constants.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
export declare const API: {
|
|
2
2
|
readonly RANGE_HEADER: "items=0-1000";
|
|
3
3
|
readonly BASE_PATH: "/v3";
|
|
4
|
+
readonly REQUEST_TIMEOUT_MS: 30000;
|
|
5
|
+
readonly MAX_RETRIES: 2;
|
|
6
|
+
readonly RETRY_BASE_DELAY_MS: 300;
|
|
7
|
+
readonly DEFAULT_AGGREGATE_LIMIT: 1000;
|
|
4
8
|
};
|
|
5
9
|
export declare const Endpoints: {
|
|
6
10
|
readonly TRIGGER: "/trigger";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,GAAG;;;;;;;CAWN,CAAC;AAGX,eAAO,MAAM,SAAS;;;;;;;mCAOE,MAAM;oCACL,MAAM;kCACR,MAAM;qCACH,MAAM;;;yCAGF,MAAM;;;;;;;;;;;;oCAYX,MAAM;;;;;;;;;;uCAcH,MAAM;;;;;yCAKJ,MAAM;;;;;;;;gCAQf,MAAM;;;;+BAIP,MAAM;;wCAEG,MAAM;uCACP,MAAM;;uCAEN,MAAM;;oCAET,MAAM;;;8BAKZ,MAAM;;;;;iCAOH,MAAM;yCACE,MAAM,QAAQ,MAAM;CACxC,CAAC"}
|
package/dist/core/constants.js
CHANGED
|
@@ -5,6 +5,14 @@ exports.Endpoints = exports.API = void 0;
|
|
|
5
5
|
exports.API = {
|
|
6
6
|
RANGE_HEADER: "items=0-1000",
|
|
7
7
|
BASE_PATH: "/v3",
|
|
8
|
+
// Abort any request that hangs longer than this so a stuck call never freezes a tool.
|
|
9
|
+
REQUEST_TIMEOUT_MS: 30000,
|
|
10
|
+
// Transient-failure retry policy for idempotent (GET) requests only.
|
|
11
|
+
MAX_RETRIES: 2,
|
|
12
|
+
RETRY_BASE_DELAY_MS: 300,
|
|
13
|
+
// Safety backstop appended to ad-hoc aggregate pipelines that lack an explicit
|
|
14
|
+
// $limit, so a missing limit can't pull an unbounded result set over the wire.
|
|
15
|
+
DEFAULT_AGGREGATE_LIMIT: 1000,
|
|
8
16
|
};
|
|
9
17
|
// API Endpoints
|
|
10
18
|
exports.Endpoints = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":";;;AAAA,oBAAoB;AACP,QAAA,GAAG,GAAG;IACjB,YAAY,EAAE,cAAc;IAC5B,SAAS,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
export declare function log(level: LogLevel, message: string, fields?: Record<string, unknown>): void;
|
|
3
|
+
export declare const logger: {
|
|
4
|
+
debug: (message: string, fields?: Record<string, unknown>) => void;
|
|
5
|
+
info: (message: string, fields?: Record<string, unknown>) => void;
|
|
6
|
+
warn: (message: string, fields?: Record<string, unknown>) => void;
|
|
7
|
+
error: (message: string, fields?: Record<string, unknown>) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAc3D,wBAAgB,GAAG,CACjB,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACnC,IAAI,CAgBN;AAED,eAAO,MAAM,MAAM;qBACA,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACzC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;oBACxC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;qBACvC,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1D,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Minimal structured logger emitting JSON lines to stderr.
|
|
3
|
+
//
|
|
4
|
+
// Why stderr: this package powers a stdio MCP server where stdout is reserved
|
|
5
|
+
// for the protocol. Logging to stdout would corrupt the MCP stream, so every
|
|
6
|
+
// diagnostic line goes to stderr, which MCP clients surface in their logs.
|
|
7
|
+
//
|
|
8
|
+
// Why structured: a single JSON object per line is greppable and lets clients
|
|
9
|
+
// answer "which tool failed?" / "how slow was it?" without parsing prose.
|
|
10
|
+
//
|
|
11
|
+
// Security: callers MUST pass already-sanitized values. The logger never
|
|
12
|
+
// inspects axios errors itself, so it cannot accidentally serialize an
|
|
13
|
+
// `Authorization` header or request body.
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.logger = void 0;
|
|
16
|
+
exports.log = log;
|
|
17
|
+
const LEVEL_ORDER = {
|
|
18
|
+
debug: 0,
|
|
19
|
+
info: 1,
|
|
20
|
+
warn: 2,
|
|
21
|
+
error: 3,
|
|
22
|
+
};
|
|
23
|
+
function configuredLevel() {
|
|
24
|
+
const raw = (process.env.FUNIFIER_LOG_LEVEL ?? "info").toLowerCase();
|
|
25
|
+
return raw in LEVEL_ORDER ? raw : "info";
|
|
26
|
+
}
|
|
27
|
+
function log(level, message, fields = {}) {
|
|
28
|
+
if (LEVEL_ORDER[level] < LEVEL_ORDER[configuredLevel()])
|
|
29
|
+
return;
|
|
30
|
+
const entry = {
|
|
31
|
+
ts: new Date().toISOString(),
|
|
32
|
+
level,
|
|
33
|
+
msg: message,
|
|
34
|
+
...fields,
|
|
35
|
+
};
|
|
36
|
+
// Logging must never throw — swallow serialization or write failures.
|
|
37
|
+
try {
|
|
38
|
+
process.stderr.write(`${JSON.stringify(entry)}\n`);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
/* ignore */
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.logger = {
|
|
45
|
+
debug: (message, fields) => log("debug", message, fields),
|
|
46
|
+
info: (message, fields) => log("info", message, fields),
|
|
47
|
+
warn: (message, fields) => log("warn", message, fields),
|
|
48
|
+
error: (message, fields) => log("error", message, fields),
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":";AAAA,2DAA2D;AAC3D,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,2EAA2E;AAC3E,EAAE;AACF,8EAA8E;AAC9E,0EAA0E;AAC1E,EAAE;AACF,yEAAyE;AACzE,uEAAuE;AACvE,0CAA0C;;;AAgB1C,kBAoBC;AAhCD,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACrE,OAAO,GAAG,IAAI,WAAW,CAAC,CAAC,CAAE,GAAgB,CAAC,CAAC,CAAC,MAAM,CAAC;AACzD,CAAC;AAED,SAAgB,GAAG,CACjB,KAAe,EACf,OAAe,EACf,SAAkC,EAAE;IAEpC,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;QAAE,OAAO;IAEhE,MAAM,KAAK,GAAG;QACZ,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,GAAG,EAAE,OAAO;QACZ,GAAG,MAAM;KACV,CAAC;IAEF,sEAAsE;IACtE,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAEY,QAAA,MAAM,GAAG;IACpB,KAAK,EAAE,CAAC,OAAe,EAAE,MAAgC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;IAC3F,IAAI,EAAE,CAAC,OAAe,EAAE,MAAgC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzF,IAAI,EAAE,CAAC,OAAe,EAAE,MAAgC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC;IACzF,KAAK,EAAE,CAAC,OAAe,EAAE,MAAgC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;CAC5F,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-holder.test.d.ts","sourceRoot":"","sources":["../../src/mcp/api-holder.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const vitest_1 = require("vitest");
|
|
4
|
+
const api_holder_1 = require("./api-holder");
|
|
5
|
+
const CONFIG = { apiKey: "k", secretKey: "s", serverUrl: "https://x.example" };
|
|
6
|
+
(0, vitest_1.describe)("ApiHolder", () => {
|
|
7
|
+
(0, vitest_1.it)("starts disconnected and requireClient throws a helpful error", () => {
|
|
8
|
+
const holder = new api_holder_1.ApiHolder();
|
|
9
|
+
(0, vitest_1.expect)(holder.getClient()).toBeNull();
|
|
10
|
+
(0, vitest_1.expect)(() => holder.requireClient()).toThrow(/funifier_connect/);
|
|
11
|
+
(0, vitest_1.expect)(holder.getConnectionInfo()).toEqual({ connected: false, serverUrl: null, name: null });
|
|
12
|
+
});
|
|
13
|
+
(0, vitest_1.it)("connect makes a client available and records connection info", () => {
|
|
14
|
+
const holder = new api_holder_1.ApiHolder();
|
|
15
|
+
holder.connect(CONFIG, "prod");
|
|
16
|
+
(0, vitest_1.expect)(holder.getClient()).not.toBeNull();
|
|
17
|
+
(0, vitest_1.expect)(holder.requireClient()).toBe(holder.getClient());
|
|
18
|
+
(0, vitest_1.expect)(holder.getConnectionInfo()).toEqual({
|
|
19
|
+
connected: true,
|
|
20
|
+
serverUrl: "https://x.example",
|
|
21
|
+
name: "prod",
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
(0, vitest_1.it)("defaults the connection name to the server url", () => {
|
|
25
|
+
const holder = new api_holder_1.ApiHolder();
|
|
26
|
+
holder.connect(CONFIG);
|
|
27
|
+
(0, vitest_1.expect)(holder.getConnectionInfo().name).toBe("https://x.example");
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.it)("disconnect clears all state", () => {
|
|
30
|
+
const holder = new api_holder_1.ApiHolder();
|
|
31
|
+
holder.connect(CONFIG);
|
|
32
|
+
holder.disconnect();
|
|
33
|
+
(0, vitest_1.expect)(holder.getClient()).toBeNull();
|
|
34
|
+
(0, vitest_1.expect)(holder.getConnectionInfo().connected).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.it)("switching instances replaces the active client", () => {
|
|
37
|
+
const holder = new api_holder_1.ApiHolder();
|
|
38
|
+
holder.connect(CONFIG, "a");
|
|
39
|
+
const first = holder.getClient();
|
|
40
|
+
holder.connect({ ...CONFIG, serverUrl: "https://y.example" }, "b");
|
|
41
|
+
(0, vitest_1.expect)(holder.getClient()).not.toBe(first);
|
|
42
|
+
(0, vitest_1.expect)(holder.getConnectionInfo().serverUrl).toBe("https://y.example");
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=api-holder.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-holder.test.js","sourceRoot":"","sources":["../../src/mcp/api-holder.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,6CAAyC;AAEzC,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;AAE/E,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAA,WAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,IAAI,sBAAS,EAAE,CAAC;QAC/B,IAAA,eAAM,EAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACjE,IAAA,eAAM,EAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,IAAI,sBAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAA,eAAM,EAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAA,eAAM,EAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACxD,IAAA,eAAM,EAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC;YACzC,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,mBAAmB;YAC9B,IAAI,EAAE,MAAM;SACb,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,sBAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,IAAA,eAAM,EAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,sBAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,CAAC,UAAU,EAAE,CAAC;QACpB,IAAA,eAAM,EAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAA,eAAM,EAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,sBAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QACnE,IAAA,eAAM,EAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|