@eamonboyle/mssql-mcp 1.2.0 → 1.3.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.
Files changed (118) hide show
  1. package/README.md +42 -7
  2. package/dist/config.d.ts +8 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +40 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/db.d.ts +1 -0
  7. package/dist/db.d.ts.map +1 -1
  8. package/dist/db.js +1 -1
  9. package/dist/db.js.map +1 -1
  10. package/dist/index.js +356 -44
  11. package/dist/index.js.map +1 -1
  12. package/dist/mcpResults.d.ts +49 -0
  13. package/dist/mcpResults.d.ts.map +1 -0
  14. package/dist/mcpResults.js +246 -0
  15. package/dist/mcpResults.js.map +1 -0
  16. package/dist/promptRegistry.d.ts.map +1 -1
  17. package/dist/promptRegistry.js +6 -1
  18. package/dist/promptRegistry.js.map +1 -1
  19. package/dist/resourceRegistry.d.ts +2 -0
  20. package/dist/resourceRegistry.d.ts.map +1 -1
  21. package/dist/resourceRegistry.js +149 -10
  22. package/dist/resourceRegistry.js.map +1 -1
  23. package/dist/schema.d.ts +16 -0
  24. package/dist/schema.d.ts.map +1 -1
  25. package/dist/schema.js +180 -1
  26. package/dist/schema.js.map +1 -1
  27. package/dist/serverState.d.ts +28 -0
  28. package/dist/serverState.d.ts.map +1 -0
  29. package/dist/serverState.js +99 -0
  30. package/dist/serverState.js.map +1 -0
  31. package/dist/toolRegistry.d.ts +4 -0
  32. package/dist/toolRegistry.d.ts.map +1 -1
  33. package/dist/toolRegistry.js +210 -64
  34. package/dist/toolRegistry.js.map +1 -1
  35. package/dist/tools/AnalyzeTableTool.d.ts +37 -0
  36. package/dist/tools/AnalyzeTableTool.d.ts.map +1 -0
  37. package/dist/tools/AnalyzeTableTool.js +81 -0
  38. package/dist/tools/AnalyzeTableTool.js.map +1 -0
  39. package/dist/tools/DeleteDataTool.d.ts.map +1 -1
  40. package/dist/tools/DeleteDataTool.js +4 -1
  41. package/dist/tools/DeleteDataTool.js.map +1 -1
  42. package/dist/tools/DescribeRelationshipsTool.d.ts +20 -0
  43. package/dist/tools/DescribeRelationshipsTool.d.ts.map +1 -0
  44. package/dist/tools/DescribeRelationshipsTool.js +24 -0
  45. package/dist/tools/DescribeRelationshipsTool.js.map +1 -0
  46. package/dist/tools/ListDatabasesTool.d.ts +16 -0
  47. package/dist/tools/ListDatabasesTool.d.ts.map +1 -0
  48. package/dist/tools/ListDatabasesTool.js +26 -0
  49. package/dist/tools/ListDatabasesTool.js.map +1 -0
  50. package/dist/tools/ListForeignKeysTool.d.ts +19 -0
  51. package/dist/tools/ListForeignKeysTool.d.ts.map +1 -0
  52. package/dist/tools/ListForeignKeysTool.js +24 -0
  53. package/dist/tools/ListForeignKeysTool.js.map +1 -0
  54. package/dist/tools/PreviewDeleteTool.d.ts +28 -0
  55. package/dist/tools/PreviewDeleteTool.d.ts.map +1 -0
  56. package/dist/tools/PreviewDeleteTool.js +31 -0
  57. package/dist/tools/PreviewDeleteTool.js.map +1 -0
  58. package/dist/tools/PreviewUpdateTool.d.ts +30 -0
  59. package/dist/tools/PreviewUpdateTool.d.ts.map +1 -0
  60. package/dist/tools/PreviewUpdateTool.js +34 -0
  61. package/dist/tools/PreviewUpdateTool.js.map +1 -0
  62. package/dist/tools/UpdateDataTool.d.ts +1 -0
  63. package/dist/tools/UpdateDataTool.d.ts.map +1 -1
  64. package/dist/tools/UpdateDataTool.js +6 -3
  65. package/dist/tools/UpdateDataTool.js.map +1 -1
  66. package/dist/writePreview.d.ts +20 -0
  67. package/dist/writePreview.d.ts.map +1 -0
  68. package/dist/writePreview.js +27 -0
  69. package/dist/writePreview.js.map +1 -0
  70. package/dist/writePreviewGrant.d.ts +18 -0
  71. package/dist/writePreviewGrant.d.ts.map +1 -0
  72. package/dist/writePreviewGrant.js +71 -0
  73. package/dist/writePreviewGrant.js.map +1 -0
  74. package/dist/writePreviewGrantStore.d.ts +10 -0
  75. package/dist/writePreviewGrantStore.d.ts.map +1 -0
  76. package/dist/writePreviewGrantStore.js +47 -0
  77. package/dist/writePreviewGrantStore.js.map +1 -0
  78. package/package.json +2 -2
  79. package/dist/__tests__/ExplainQueryTool.test.d.ts +0 -2
  80. package/dist/__tests__/ExplainQueryTool.test.d.ts.map +0 -1
  81. package/dist/__tests__/ExplainQueryTool.test.js +0 -96
  82. package/dist/__tests__/ExplainQueryTool.test.js.map +0 -1
  83. package/dist/__tests__/config.test.d.ts +0 -2
  84. package/dist/__tests__/config.test.d.ts.map +0 -1
  85. package/dist/__tests__/config.test.js +0 -29
  86. package/dist/__tests__/config.test.js.map +0 -1
  87. package/dist/__tests__/db.test.d.ts +0 -2
  88. package/dist/__tests__/db.test.d.ts.map +0 -1
  89. package/dist/__tests__/db.test.js +0 -204
  90. package/dist/__tests__/db.test.js.map +0 -1
  91. package/dist/__tests__/promptRegistry.test.d.ts +0 -2
  92. package/dist/__tests__/promptRegistry.test.d.ts.map +0 -1
  93. package/dist/__tests__/promptRegistry.test.js +0 -40
  94. package/dist/__tests__/promptRegistry.test.js.map +0 -1
  95. package/dist/__tests__/resourceRegistry.test.d.ts +0 -2
  96. package/dist/__tests__/resourceRegistry.test.d.ts.map +0 -1
  97. package/dist/__tests__/resourceRegistry.test.js +0 -40
  98. package/dist/__tests__/resourceRegistry.test.js.map +0 -1
  99. package/dist/__tests__/schema.test.d.ts +0 -2
  100. package/dist/__tests__/schema.test.d.ts.map +0 -1
  101. package/dist/__tests__/schema.test.js +0 -130
  102. package/dist/__tests__/schema.test.js.map +0 -1
  103. package/dist/__tests__/sql.test.d.ts +0 -2
  104. package/dist/__tests__/sql.test.d.ts.map +0 -1
  105. package/dist/__tests__/sql.test.js +0 -35
  106. package/dist/__tests__/sql.test.js.map +0 -1
  107. package/dist/__tests__/toolRegistry.test.d.ts +0 -2
  108. package/dist/__tests__/toolRegistry.test.d.ts.map +0 -1
  109. package/dist/__tests__/toolRegistry.test.js +0 -47
  110. package/dist/__tests__/toolRegistry.test.js.map +0 -1
  111. package/dist/__tests__/validation.test.d.ts +0 -2
  112. package/dist/__tests__/validation.test.d.ts.map +0 -1
  113. package/dist/__tests__/validation.test.js +0 -111
  114. package/dist/__tests__/validation.test.js.map +0 -1
  115. package/dist/__tests__/writeTools.test.d.ts +0 -2
  116. package/dist/__tests__/writeTools.test.d.ts.map +0 -1
  117. package/dist/__tests__/writeTools.test.js +0 -115
  118. package/dist/__tests__/writeTools.test.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePreviewGrant.js","sourceRoot":"","sources":["../src/writePreviewGrant.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACvC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAoB;IAC5C,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;KAC7C,CAAC,CAAC;SACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgC;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAMtC;IACC,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,QAAiB;QACvB,QAAQ,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QAC/B,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;QACzC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1C,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAKtC;IACC,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,QAAiB;QACvB,QAAQ,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACnC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE;QAC/B,KAAK,EAAE,MAAM,CAAC,SAAS;QACvB,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1C,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAQD,MAAM,UAAU,uBAAuB,CACrC,QAA4B,EAC5B,WAAoC;IAEpC,MAAM,OAAO,GAAI,WAAW,CAAC,OAAuB,IAAI,EAAE,CAAC;IAC3D,MAAM,YAAY,GAChB,OAAO,WAAW,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IACtF,MAAM,UAAU,GACd,OAAO,WAAW,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,QAAQ,KAAK,gBAAgB,IAAI,QAAQ,KAAK,aAAa,EAAE,CAAC;QAChE,OAAO,sBAAsB,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,sBAAsB,CAAC;QAC5B,YAAY;QACZ,UAAU;QACV,SAAS;QACT,OAAO;QACP,OAAO,EAAG,WAAW,CAAC,OAAmC,IAAI,EAAE;KAChE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { WriteDataToolName } from "./writePreviewGrant.js";
2
+ /**
3
+ * Process-global store so preview tokens remain valid across HTTP round-trips
4
+ * (each request uses a fresh ServerState for query plans / results).
5
+ */
6
+ export declare const writePreviewGrantStore: {
7
+ issue(fingerprint: string, writeToolName: WriteDataToolName): string;
8
+ consume(token: string, fingerprint: string, writeToolName: WriteDataToolName): boolean;
9
+ };
10
+ //# sourceMappingURL=writePreviewGrantStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePreviewGrantStore.d.ts","sourceRoot":"","sources":["../src/writePreviewGrantStore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAoBhE;;;GAGG;AACH,eAAO,MAAM,sBAAsB;uBACd,MAAM,iBAAiB,iBAAiB,GAAG,MAAM;mBAa3D,MAAM,eACA,MAAM,iBACJ,iBAAiB,GAC/B,OAAO;CAqBX,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { randomBytes } from "node:crypto";
2
+ const WRITE_PREVIEW_GRANT_TTL_MS = 10 * 60 * 1000;
3
+ const grants = new Map();
4
+ function purgeExpiredGrants(now) {
5
+ for (const [token, grant] of grants) {
6
+ if (grant.expiresAt < now) {
7
+ grants.delete(token);
8
+ }
9
+ }
10
+ }
11
+ /**
12
+ * Process-global store so preview tokens remain valid across HTTP round-trips
13
+ * (each request uses a fresh ServerState for query plans / results).
14
+ */
15
+ export const writePreviewGrantStore = {
16
+ issue(fingerprint, writeToolName) {
17
+ const now = Date.now();
18
+ purgeExpiredGrants(now);
19
+ const token = randomBytes(24).toString("base64url");
20
+ grants.set(token, {
21
+ fingerprint,
22
+ writeToolName,
23
+ expiresAt: now + WRITE_PREVIEW_GRANT_TTL_MS,
24
+ });
25
+ return token;
26
+ },
27
+ consume(token, fingerprint, writeToolName) {
28
+ const now = Date.now();
29
+ purgeExpiredGrants(now);
30
+ if (!token) {
31
+ return false;
32
+ }
33
+ const grant = grants.get(token);
34
+ if (!grant) {
35
+ return false;
36
+ }
37
+ if (grant.expiresAt < now ||
38
+ grant.fingerprint !== fingerprint ||
39
+ grant.writeToolName !== writeToolName) {
40
+ grants.delete(token);
41
+ return false;
42
+ }
43
+ grants.delete(token);
44
+ return true;
45
+ },
46
+ };
47
+ //# sourceMappingURL=writePreviewGrantStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writePreviewGrantStore.js","sourceRoot":"","sources":["../src/writePreviewGrantStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAS1C,MAAM,0BAA0B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAElD,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;AAEpD,SAAS,kBAAkB,CAAC,GAAW;IACrC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,KAAK,CAAC,WAAmB,EAAE,aAAgC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE;YAChB,WAAW;YACX,aAAa;YACb,SAAS,EAAE,GAAG,GAAG,0BAA0B;SAC5C,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CACL,KAAa,EACb,WAAmB,EACnB,aAAgC;QAEhC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,kBAAkB,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IACE,KAAK,CAAC,SAAS,GAAG,GAAG;YACrB,KAAK,CAAC,WAAW,KAAK,WAAW;YACjC,KAAK,CAAC,aAAa,KAAK,aAAa,EACrC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eamonboyle/mssql-mcp",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "MCP server for Microsoft SQL Server - query and manage your database with natural language in Cursor, Claude, and VS Code",
5
5
  "keywords": [
6
6
  "mcp",
@@ -26,7 +26,7 @@
26
26
  "mssql-mcp": "dist/index.js"
27
27
  },
28
28
  "scripts": {
29
- "build": "tsc && shx chmod +x dist/*.js",
29
+ "build": "shx rm -rf dist && tsc && shx chmod +x dist/*.js",
30
30
  "prepare": "npm run build",
31
31
  "watch": "tsc --watch",
32
32
  "start": "node dist/index.js",
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ExplainQueryTool.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExplainQueryTool.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ExplainQueryTool.test.ts"],"names":[],"mappings":""}
@@ -1,96 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- const explainMockState = vi.hoisted(() => ({
3
- closeCalls: 0,
4
- statements: [],
5
- failOnQuery: false,
6
- }));
7
- const mockRequestModule = vi.hoisted(() => {
8
- class MockRequest {
9
- async query(statement) {
10
- return this.run(statement);
11
- }
12
- async batch(statement) {
13
- return this.run(statement);
14
- }
15
- async run(statement) {
16
- explainMockState.statements.push(statement);
17
- if (statement === "SET SHOWPLAN_XML ON") {
18
- return { recordsets: [] };
19
- }
20
- if (statement === "SET SHOWPLAN_XML OFF") {
21
- return { recordsets: [] };
22
- }
23
- if (explainMockState.failOnQuery) {
24
- throw new Error("query failed");
25
- }
26
- return {
27
- recordsets: [[{ planXml: "<ShowPlanXML />" }]],
28
- };
29
- }
30
- }
31
- function mockPool() {
32
- return {
33
- request() {
34
- return new MockRequest();
35
- },
36
- async close() {
37
- explainMockState.closeCalls += 1;
38
- },
39
- };
40
- }
41
- return { MockRequest, mockPool };
42
- });
43
- vi.mock("mssql", () => ({
44
- default: {
45
- Request: mockRequestModule.MockRequest,
46
- },
47
- }));
48
- vi.mock("../db.js", () => ({
49
- getDedicatedSqlPool: vi.fn(async () => ({
50
- pool: mockRequestModule.mockPool(),
51
- })),
52
- }));
53
- import { ExplainQueryTool } from "../tools/ExplainQueryTool.js";
54
- describe("ExplainQueryTool", () => {
55
- beforeEach(() => {
56
- vi.spyOn(console, "error").mockImplementation(() => { });
57
- explainMockState.closeCalls = 0;
58
- explainMockState.statements.length = 0;
59
- explainMockState.failOnQuery = false;
60
- });
61
- afterEach(() => {
62
- vi.restoreAllMocks();
63
- });
64
- it("uses a dedicated pool and always disables SHOWPLAN_XML", async () => {
65
- const tool = new ExplainQueryTool();
66
- const result = await tool.run({
67
- query: "SELECT * FROM movies",
68
- });
69
- expect(result).toMatchObject({
70
- success: true,
71
- planXml: "<ShowPlanXML />",
72
- recordsets: undefined,
73
- });
74
- expect(explainMockState.statements).toEqual([
75
- "SET SHOWPLAN_XML ON",
76
- "SELECT * FROM movies",
77
- "SET SHOWPLAN_XML OFF",
78
- ]);
79
- expect(explainMockState.closeCalls).toBe(1);
80
- });
81
- it("cleans up SHOWPLAN state after failures", async () => {
82
- explainMockState.failOnQuery = true;
83
- const tool = new ExplainQueryTool();
84
- const result = await tool.run({
85
- query: "SELECT * FROM movies",
86
- });
87
- expect(result).toMatchObject({ success: false });
88
- expect(explainMockState.statements).toEqual([
89
- "SET SHOWPLAN_XML ON",
90
- "SELECT * FROM movies",
91
- "SET SHOWPLAN_XML OFF",
92
- ]);
93
- expect(explainMockState.closeCalls).toBe(1);
94
- });
95
- });
96
- //# sourceMappingURL=ExplainQueryTool.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExplainQueryTool.test.js","sourceRoot":"","sources":["../../src/__tests__/ExplainQueryTool.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -1,29 +0,0 @@
1
- import { afterEach, describe, expect, it } from "vitest";
2
- import { clampRowLimit, getDefaultSearchLimit, getMaxRows, getQueryTimeoutMs, } from "../config.js";
3
- const originalEnv = process.env;
4
- afterEach(() => {
5
- process.env = { ...originalEnv };
6
- });
7
- describe("config helpers", () => {
8
- it("uses defaults when env vars are absent", () => {
9
- delete process.env.MAX_ROWS;
10
- delete process.env.QUERY_TIMEOUT_MS;
11
- expect(getMaxRows()).toBe(10000);
12
- expect(getQueryTimeoutMs()).toBe(30000);
13
- expect(getDefaultSearchLimit()).toBe(100);
14
- });
15
- it("reads env-based limits", () => {
16
- process.env.MAX_ROWS = "250";
17
- process.env.QUERY_TIMEOUT_MS = "45000";
18
- expect(getMaxRows()).toBe(250);
19
- expect(getQueryTimeoutMs()).toBe(45000);
20
- expect(getDefaultSearchLimit()).toBe(100);
21
- });
22
- it("clamps row limits to the configured maximum", () => {
23
- process.env.MAX_ROWS = "50";
24
- expect(clampRowLimit(200)).toBe(50);
25
- expect(clampRowLimit("5")).toBe(5);
26
- expect(clampRowLimit(undefined)).toBe(50);
27
- });
28
- });
29
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC;AAEhC,SAAS,CAAC,GAAG,EAAE;IACb,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QAEpC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAEvC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QAE5B,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=db.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/db.test.ts"],"names":[],"mappings":""}
@@ -1,204 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
- const mssqlMockState = vi.hoisted(() => ({
3
- poolConfigs: [],
4
- requestObject: { kind: "mock-request" },
5
- connectCalls: vi.fn(),
6
- closeCalls: vi.fn(),
7
- requestCalls: vi.fn(),
8
- }));
9
- // Mock mssql to avoid loading native deps and transitive issues in test env
10
- vi.mock("mssql", () => {
11
- class MockConnectionPool {
12
- constructor(config) {
13
- this.config = config;
14
- this.connected = false;
15
- mssqlMockState.poolConfigs.push(config);
16
- }
17
- async connect() {
18
- this.connected = true;
19
- mssqlMockState.connectCalls(this.config);
20
- return this;
21
- }
22
- async close() {
23
- this.connected = false;
24
- mssqlMockState.closeCalls(this.config);
25
- }
26
- request() {
27
- mssqlMockState.requestCalls(this.config);
28
- return mssqlMockState.requestObject;
29
- }
30
- }
31
- return {
32
- default: {
33
- ConnectionPool: MockConnectionPool,
34
- },
35
- };
36
- });
37
- import { getAllowedDatabases, getSqlRequest, resolveDatabaseName } from "../db.js";
38
- describe("getAllowedDatabases", () => {
39
- const originalEnv = process.env;
40
- beforeEach(() => {
41
- process.env = { ...originalEnv };
42
- mssqlMockState.poolConfigs.length = 0;
43
- mssqlMockState.connectCalls.mockClear();
44
- mssqlMockState.closeCalls.mockClear();
45
- mssqlMockState.requestCalls.mockClear();
46
- });
47
- afterEach(() => {
48
- process.env = originalEnv;
49
- });
50
- it("returns DATABASE_NAME when DATABASES is not set", () => {
51
- delete process.env.DATABASES;
52
- process.env.DATABASE_NAME = "MyDb";
53
- expect(getAllowedDatabases()).toEqual(["MyDb"]);
54
- });
55
- it("returns empty array when neither DATABASES nor DATABASE_NAME is set", () => {
56
- delete process.env.DATABASES;
57
- delete process.env.DATABASE_NAME;
58
- expect(getAllowedDatabases()).toEqual([]);
59
- });
60
- it("returns empty array when DATABASE_NAME is empty string", () => {
61
- delete process.env.DATABASES;
62
- process.env.DATABASE_NAME = "";
63
- expect(getAllowedDatabases()).toEqual([]);
64
- });
65
- it("returns DATABASES split by comma when set", () => {
66
- process.env.DATABASES = "ProdDB,StagingDB,AnalyticsDB";
67
- expect(getAllowedDatabases()).toEqual([
68
- "ProdDB",
69
- "StagingDB",
70
- "AnalyticsDB",
71
- ]);
72
- });
73
- it("trims whitespace from DATABASES entries", () => {
74
- process.env.DATABASES = " ProdDB , StagingDB , AnalyticsDB ";
75
- expect(getAllowedDatabases()).toEqual([
76
- "ProdDB",
77
- "StagingDB",
78
- "AnalyticsDB",
79
- ]);
80
- });
81
- it("filters out empty entries from DATABASES", () => {
82
- process.env.DATABASES = "ProdDB,,StagingDB,";
83
- expect(getAllowedDatabases()).toEqual(["ProdDB", "StagingDB"]);
84
- });
85
- it("prefers DATABASES over DATABASE_NAME when both set", () => {
86
- process.env.DATABASES = "ProdDB,StagingDB";
87
- process.env.DATABASE_NAME = "OtherDb";
88
- expect(getAllowedDatabases()).toEqual(["ProdDB", "StagingDB"]);
89
- });
90
- });
91
- describe("resolveDatabaseName", () => {
92
- const originalEnv = process.env;
93
- beforeEach(() => {
94
- process.env = { ...originalEnv };
95
- mssqlMockState.poolConfigs.length = 0;
96
- mssqlMockState.connectCalls.mockClear();
97
- mssqlMockState.closeCalls.mockClear();
98
- mssqlMockState.requestCalls.mockClear();
99
- });
100
- afterEach(() => {
101
- process.env = originalEnv;
102
- });
103
- it("returns param when valid and in allowed list", () => {
104
- process.env.DATABASES = "ProdDB,StagingDB";
105
- expect(resolveDatabaseName("ProdDB")).toBe("ProdDB");
106
- expect(resolveDatabaseName("StagingDB")).toBe("StagingDB");
107
- });
108
- it("returns DATABASE_NAME when param omitted and DATABASES not set", () => {
109
- process.env.DATABASE_NAME = "DefaultDb";
110
- delete process.env.DATABASES;
111
- expect(resolveDatabaseName()).toBe("DefaultDb");
112
- });
113
- it("returns DATABASE_NAME when it is in DATABASES", () => {
114
- process.env.DATABASES = "ProdDB,StagingDB";
115
- process.env.DATABASE_NAME = "StagingDB";
116
- expect(resolveDatabaseName()).toBe("StagingDB");
117
- });
118
- it("returns the first DATABASES entry when DATABASE_NAME is omitted", () => {
119
- process.env.DATABASES = "ProdDB,StagingDB";
120
- delete process.env.DATABASE_NAME;
121
- expect(resolveDatabaseName()).toBe("ProdDB");
122
- });
123
- it("returns param when param provided and in allowed list", () => {
124
- process.env.DATABASES = "ProdDB,StagingDB";
125
- process.env.DATABASE_NAME = "ProdDB";
126
- expect(resolveDatabaseName("StagingDB")).toBe("StagingDB");
127
- });
128
- it("falls back to the first DATABASES entry when DATABASE_NAME is not included in DATABASES", () => {
129
- process.env.DATABASES = "ProdDB,StagingDB";
130
- process.env.DATABASE_NAME = "OtherDb";
131
- expect(resolveDatabaseName()).toBe("ProdDB");
132
- });
133
- it("returns null when param not in allowed list", () => {
134
- process.env.DATABASES = "ProdDB,StagingDB";
135
- expect(resolveDatabaseName("OtherDb")).toBeNull();
136
- });
137
- it("returns null when param is empty and DATABASE_NAME not set", () => {
138
- delete process.env.DATABASE_NAME;
139
- delete process.env.DATABASES;
140
- expect(resolveDatabaseName()).toBeNull();
141
- expect(resolveDatabaseName("")).toBeNull();
142
- });
143
- it("returns resolved name when no DATABASES set (only DATABASE_NAME allowed)", () => {
144
- delete process.env.DATABASES;
145
- process.env.DATABASE_NAME = "MyDb";
146
- expect(resolveDatabaseName()).toBe("MyDb");
147
- expect(resolveDatabaseName("MyDb")).toBe("MyDb");
148
- expect(resolveDatabaseName("AnyDb")).toBeNull();
149
- });
150
- it("trims whitespace from param", () => {
151
- process.env.DATABASES = "ProdDB";
152
- expect(resolveDatabaseName(" ProdDB ")).toBe("ProdDB");
153
- });
154
- it("returns null when neither DATABASE_NAME nor DATABASES is configured", () => {
155
- delete process.env.DATABASE_NAME;
156
- delete process.env.DATABASES;
157
- expect(resolveDatabaseName()).toBeNull();
158
- });
159
- });
160
- describe("getSqlRequest", () => {
161
- const originalEnv = process.env;
162
- beforeEach(() => {
163
- process.env = { ...originalEnv };
164
- mssqlMockState.poolConfigs.length = 0;
165
- mssqlMockState.connectCalls.mockClear();
166
- mssqlMockState.closeCalls.mockClear();
167
- mssqlMockState.requestCalls.mockClear();
168
- });
169
- afterEach(() => {
170
- process.env = originalEnv;
171
- });
172
- it("returns a helpful error when no database access is configured", async () => {
173
- delete process.env.DATABASE_NAME;
174
- delete process.env.DATABASES;
175
- const result = await getSqlRequest();
176
- expect(result.error).toBe("Invalid or disallowed database. Set DATABASE_NAME or DATABASES to configure database access. Use the databaseName parameter to target a specific configured database.");
177
- });
178
- it("returns allowed databases in the error when a disallowed database is requested", async () => {
179
- process.env.DATABASES = "ProdDB,StagingDB";
180
- const result = await getSqlRequest("OtherDb");
181
- expect(result.error).toBe("Invalid or disallowed database. Allowed: ProdDB, StagingDB. Use the databaseName parameter to target a specific configured database.");
182
- });
183
- it("returns a request using the resolved default database", async () => {
184
- process.env.DATABASES = "ProdDBDefault,StagingDB";
185
- delete process.env.DATABASE_NAME;
186
- const result = await getSqlRequest();
187
- expect(result.error).toBeUndefined();
188
- expect(result.request).toBe(mssqlMockState.requestObject);
189
- expect(mssqlMockState.poolConfigs).toContainEqual(expect.objectContaining({ database: "ProdDBDefault" }));
190
- expect(mssqlMockState.connectCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDBDefault" }));
191
- expect(mssqlMockState.requestCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDBDefault" }));
192
- });
193
- it("falls back to the first allowed database when DATABASE_NAME is disallowed", async () => {
194
- process.env.DATABASES = "ProdDB,StagingDB";
195
- process.env.DATABASE_NAME = "OtherDb";
196
- const result = await getSqlRequest();
197
- expect(result.error).toBeUndefined();
198
- expect(result.request).toBe(mssqlMockState.requestObject);
199
- expect(mssqlMockState.poolConfigs).toContainEqual(expect.objectContaining({ database: "ProdDB" }));
200
- expect(mssqlMockState.connectCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDB" }));
201
- expect(mssqlMockState.requestCalls).toHaveBeenCalledWith(expect.objectContaining({ database: "ProdDB" }));
202
- });
203
- });
204
- //# sourceMappingURL=db.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"db.test.js","sourceRoot":"","sources":["../../src/__tests__/db.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=promptRegistry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"promptRegistry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/promptRegistry.test.ts"],"names":[],"mappings":""}
@@ -1,40 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { registerPrompts } from "../promptRegistry.js";
3
- describe("promptRegistry", () => {
4
- it("registers prompt callbacks without a fallback branch", () => {
5
- const callbacks = new Map();
6
- const server = {
7
- registerPrompt(name, _meta, callback) {
8
- callbacks.set(name, callback);
9
- },
10
- };
11
- registerPrompts(server, { isReadOnly: false });
12
- const callback = callbacks.get("review_write_operation");
13
- expect(callback).toBeDefined();
14
- expect(callback?.({
15
- operation: "delete inactive users",
16
- databaseName: "AppDb",
17
- })).toMatchObject({
18
- description: "Review a proposed change and identify safety checks before running it.",
19
- });
20
- });
21
- it("review_write_operation tells the assistant not to bypass when read-only", () => {
22
- const callbacks = new Map();
23
- const server = {
24
- registerPrompt(name, _meta, callback) {
25
- callbacks.set(name, callback);
26
- },
27
- };
28
- registerPrompts(server, { isReadOnly: true });
29
- const callback = callbacks.get("review_write_operation");
30
- const result = callback({
31
- operation: "DELETE FROM dbo.Users WHERE id = 1",
32
- databaseName: "AppDb",
33
- });
34
- const text = result.messages[0].content.text;
35
- expect(text).toContain("read-only");
36
- expect(text).toMatch(/sqlcmd|SSMS/i);
37
- expect(text).toMatch(/STOP|Do not execute/i);
38
- });
39
- });
40
- //# sourceMappingURL=promptRegistry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"promptRegistry.test.js","sourceRoot":"","sources":["../../src/__tests__/promptRegistry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqD,CAAC;QAC/E,MAAM,MAAM,GAAG;YACb,cAAc,CACZ,IAAY,EACZ,KAAc,EACd,QAAmD;gBAEnD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChC,CAAC;SACF,CAAC;QAEF,eAAe,CAAC,MAAe,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,CACJ,QAAQ,EAAE,CAAC;YACT,SAAS,EAAE,uBAAuB;YAClC,YAAY,EAAE,OAAO;SACtB,CAAC,CACH,CAAC,aAAa,CAAC;YACd,WAAW,EACT,wEAAwE;SAC3E,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,SAAS,GAAG,IAAI,GAAG,EAAqD,CAAC;QAC/E,MAAM,MAAM,GAAG;YACb,cAAc,CACZ,IAAY,EACZ,KAAc,EACd,QAAmD;gBAEnD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAChC,CAAC;SACF,CAAC;QAEF,eAAe,CAAC,MAAe,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC;YACtB,SAAS,EAAE,oCAAoC;YAC/C,YAAY,EAAE,OAAO;SACtB,CAAkD,CAAC;QAEpD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=resourceRegistry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resourceRegistry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/resourceRegistry.test.ts"],"names":[],"mappings":""}
@@ -1,40 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
- const resourceRegistryMockState = vi.hoisted(() => ({
3
- listDatabaseTables: vi.fn(async () => [
4
- { schemaName: "dbo", tableName: "Users" },
5
- ]),
6
- listDatabaseObjects: vi.fn(async () => []),
7
- }));
8
- vi.mock("../schema.js", () => ({
9
- describeDatabaseObject: vi.fn(),
10
- describeTableSchema: vi.fn(),
11
- listDatabaseObjects: resourceRegistryMockState.listDatabaseObjects,
12
- listDatabaseTables: resourceRegistryMockState.listDatabaseTables,
13
- }));
14
- import { registerResources } from "../resourceRegistry.js";
15
- describe("resourceRegistry", () => {
16
- it("caches database listing reads for a short TTL", async () => {
17
- const handlers = new Map();
18
- const server = {
19
- registerResource(name, _resource, _meta, handler) {
20
- handlers.set(name, handler);
21
- },
22
- };
23
- registerResources(server, {
24
- serverName: "mssql-mcp-server",
25
- serverVersion: "1.2.0",
26
- isReadOnly: false,
27
- allowedDatabases: ["AppDb"],
28
- toolNames: [],
29
- maxRows: 100,
30
- queryTimeoutMs: 30000,
31
- });
32
- const readTables = handlers.get("AppDb_tables");
33
- expect(readTables).toBeDefined();
34
- await readTables?.(new URL("mssql://database/AppDb/tables"));
35
- await readTables?.(new URL("mssql://database/AppDb/tables"));
36
- expect(resourceRegistryMockState.listDatabaseTables).toHaveBeenCalledTimes(1);
37
- expect(resourceRegistryMockState.listDatabaseObjects).not.toHaveBeenCalled();
38
- });
39
- });
40
- //# sourceMappingURL=resourceRegistry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resourceRegistry.test.js","sourceRoot":"","sources":["../../src/__tests__/resourceRegistry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,kBAAkB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;KAC1C,CAAC;IACF,mBAAmB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;CAC3C,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,sBAAsB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC/B,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC5B,mBAAmB,EAAE,yBAAyB,CAAC,mBAAmB;IAClE,kBAAkB,EAAE,yBAAyB,CAAC,kBAAkB;CACjE,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0C,CAAC;QACnE,MAAM,MAAM,GAAG;YACb,gBAAgB,CACd,IAAY,EACZ,SAAkB,EAClB,KAAc,EACd,OAAuC;gBAEvC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC9B,CAAC;SACF,CAAC;QAEF,iBAAiB,CAAC,MAAe,EAAE;YACjC,UAAU,EAAE,kBAAkB;YAC9B,aAAa,EAAE,OAAO;YACtB,UAAU,EAAE,KAAK;YACjB,gBAAgB,EAAE,CAAC,OAAO,CAAC;YAC3B,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,GAAG;YACZ,cAAc,EAAE,KAAK;SACtB,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjC,MAAM,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAC7D,MAAM,UAAU,EAAE,CAAC,IAAI,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QAE7D,MAAM,CAAC,yBAAyB,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CACxE,CAAC,CACF,CAAC;QACF,MAAM,CACJ,yBAAyB,CAAC,mBAAmB,CAC9C,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=schema.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema.test.ts"],"names":[],"mappings":""}