@qase/mcp-server 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +151 -2
  3. package/build/client/index.d.ts +50 -6
  4. package/build/client/index.d.ts.map +1 -1
  5. package/build/client/index.js +114 -18
  6. package/build/client/index.js.map +1 -1
  7. package/build/index.d.ts +1 -1
  8. package/build/index.d.ts.map +1 -1
  9. package/build/index.js +170 -62
  10. package/build/index.js.map +1 -1
  11. package/build/operations/attachments.js +35 -16
  12. package/build/operations/attachments.js.map +1 -1
  13. package/build/operations/authors.js +4 -4
  14. package/build/operations/authors.js.map +1 -1
  15. package/build/operations/cases.js +75 -34
  16. package/build/operations/cases.js.map +1 -1
  17. package/build/operations/configurations.d.ts +2 -0
  18. package/build/operations/configurations.d.ts.map +1 -1
  19. package/build/operations/configurations.js +28 -8
  20. package/build/operations/configurations.js.map +1 -1
  21. package/build/operations/custom-fields.js +7 -7
  22. package/build/operations/custom-fields.js.map +1 -1
  23. package/build/operations/defects.js +59 -29
  24. package/build/operations/defects.js.map +1 -1
  25. package/build/operations/environments.js +7 -7
  26. package/build/operations/environments.js.map +1 -1
  27. package/build/operations/milestones.js +6 -6
  28. package/build/operations/milestones.js.map +1 -1
  29. package/build/operations/plans.js +6 -6
  30. package/build/operations/plans.js.map +1 -1
  31. package/build/operations/projects.js +8 -8
  32. package/build/operations/projects.js.map +1 -1
  33. package/build/operations/results.js +7 -7
  34. package/build/operations/results.js.map +1 -1
  35. package/build/operations/runs.js +16 -10
  36. package/build/operations/runs.js.map +1 -1
  37. package/build/operations/search.js +10 -13
  38. package/build/operations/search.js.map +1 -1
  39. package/build/operations/shared-parameters.d.ts +2 -0
  40. package/build/operations/shared-parameters.d.ts.map +1 -1
  41. package/build/operations/shared-parameters.js +30 -78
  42. package/build/operations/shared-parameters.js.map +1 -1
  43. package/build/operations/shared-steps.js +6 -6
  44. package/build/operations/shared-steps.js.map +1 -1
  45. package/build/operations/suites.js +6 -6
  46. package/build/operations/suites.js.map +1 -1
  47. package/build/operations/system-fields.d.ts +2 -0
  48. package/build/operations/system-fields.d.ts.map +1 -1
  49. package/build/operations/system-fields.js +8 -2
  50. package/build/operations/system-fields.js.map +1 -1
  51. package/build/operations/users.d.ts +2 -0
  52. package/build/operations/users.d.ts.map +1 -1
  53. package/build/operations/users.js +19 -11
  54. package/build/operations/users.js.map +1 -1
  55. package/build/transports/sse.d.ts +10 -0
  56. package/build/transports/sse.d.ts.map +1 -0
  57. package/build/transports/sse.js +38 -0
  58. package/build/transports/sse.js.map +1 -0
  59. package/build/transports/streamableHttp.d.ts +9 -0
  60. package/build/transports/streamableHttp.d.ts.map +1 -0
  61. package/build/transports/streamableHttp.js +169 -0
  62. package/build/transports/streamableHttp.js.map +1 -0
  63. package/build/utils/auth-context.d.ts +8 -0
  64. package/build/utils/auth-context.d.ts.map +1 -0
  65. package/build/utils/auth-context.js +8 -0
  66. package/build/utils/auth-context.js.map +1 -0
  67. package/build/utils/case-enums.d.ts +6 -0
  68. package/build/utils/case-enums.d.ts.map +1 -0
  69. package/build/utils/case-enums.js +91 -0
  70. package/build/utils/case-enums.js.map +1 -0
  71. package/build/utils/errors.d.ts +25 -0
  72. package/build/utils/errors.d.ts.map +1 -1
  73. package/build/utils/errors.js +78 -0
  74. package/build/utils/errors.js.map +1 -1
  75. package/build/utils/registry.d.ts.map +1 -1
  76. package/build/utils/registry.js +4 -0
  77. package/build/utils/registry.js.map +1 -1
  78. package/build/utils/test-helpers.d.ts +2 -2
  79. package/build/utils/test-helpers.d.ts.map +1 -1
  80. package/build/utils/test-helpers.js +16 -0
  81. package/build/utils/test-helpers.js.map +1 -1
  82. package/package.json +16 -5
package/build/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  * It exposes 90+ tools for managing projects, test cases, runs, results, defects, and more.
7
7
  *
8
8
  * Architecture:
9
- * - Uses stdio transport for communication with MCP clients
9
+ * - Supports multiple transports: stdio, sse, streamable-http
10
10
  * - Tools are registered via the global tool registry
11
11
  * - Operation modules self-register their tools on import
12
12
  * - All API errors are handled gracefully with user-friendly messages
@@ -15,7 +15,9 @@ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
15
15
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
16
16
  import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
17
17
  import { toolRegistry } from './utils/registry.js';
18
- import { formatApiError } from './utils/errors.js';
18
+ import { formatApiError, ToolExecutionError } from './utils/errors.js';
19
+ import { setupSSETransport } from './transports/sse.js';
20
+ import { setupStreamableHttpTransport } from './transports/streamableHttp.js';
19
21
  // Import operation modules - each module registers its tools on import
20
22
  import './operations/projects.js';
21
23
  import './operations/cases.js';
@@ -36,81 +38,187 @@ import './operations/configurations.js';
36
38
  import './operations/users.js';
37
39
  import './operations/search.js';
38
40
  /**
39
- * Create the MCP server instance
40
- */
41
- const server = new Server({
42
- name: 'qase-mcp-server',
43
- version: '1.0.0',
44
- }, {
45
- capabilities: {
46
- tools: {},
47
- },
48
- });
49
- /**
50
- * Handler: List all available tools
41
+ * Create and configure a new MCP Server instance.
51
42
  *
52
- * Returns all tools registered in the tool registry.
53
- * Called when the MCP client wants to discover available tools.
43
+ * Called once for stdio/SSE (single connection) and once per session for
44
+ * Streamable HTTP (multiple concurrent connections). Each session needs its
45
+ * own Server instance because the SDK enforces one transport per server.
54
46
  */
55
- server.setRequestHandler(ListToolsRequestSchema, async () => {
56
- const tools = toolRegistry.getTools();
57
- console.error(`[Server] Listing ${tools.length} tools`);
58
- return { tools };
59
- });
47
+ function createServer() {
48
+ const server = new Server({
49
+ name: 'qase-mcp-server',
50
+ version: '1.1.0',
51
+ }, {
52
+ capabilities: {
53
+ tools: {},
54
+ },
55
+ });
56
+ /**
57
+ * Handler: List all available tools
58
+ *
59
+ * Returns all tools registered in the tool registry.
60
+ * Called when the MCP client wants to discover available tools.
61
+ */
62
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
63
+ const tools = toolRegistry.getTools();
64
+ console.error(`[Server] Listing ${tools.length} tools`);
65
+ return { tools };
66
+ });
67
+ /**
68
+ * Handler: Execute a tool
69
+ *
70
+ * Executes the specified tool with provided arguments.
71
+ * Arguments are validated against the tool's schema before execution.
72
+ */
73
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
74
+ const { name, arguments: args } = request.params;
75
+ console.error(`[Server] Executing tool: ${name}`);
76
+ // Get tool handler from registry
77
+ const handler = toolRegistry.getHandler(name);
78
+ if (!handler) {
79
+ throw new Error(`Unknown tool: ${name}. Use list_tools to see available tools.`);
80
+ }
81
+ try {
82
+ // Execute the tool handler with provided arguments
83
+ const result = await handler(args || {});
84
+ // Return result in MCP format
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: JSON.stringify(result, null, 2),
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ catch (error) {
95
+ // Handle tool execution errors (expected failures like validation, API errors)
96
+ // These are returned with isError: true so the LLM can understand and recover
97
+ if (error instanceof ToolExecutionError) {
98
+ console.error(`[Server] Tool '${name}' execution error:`, error.message);
99
+ return {
100
+ content: [
101
+ {
102
+ type: 'text',
103
+ text: error.toUserMessage(),
104
+ },
105
+ ],
106
+ isError: true,
107
+ };
108
+ }
109
+ // Handle unexpected errors (protocol-level failures)
110
+ // Format error message using our error utilities
111
+ const errorMessage = formatApiError(error);
112
+ console.error(`[Server] Tool '${name}' unexpected error:`, errorMessage);
113
+ // Return as tool execution error with isError: true for better LLM recovery
114
+ return {
115
+ content: [
116
+ {
117
+ type: 'text',
118
+ text: errorMessage,
119
+ },
120
+ ],
121
+ isError: true,
122
+ };
123
+ }
124
+ });
125
+ return server;
126
+ }
60
127
  /**
61
- * Handler: Execute a tool
62
- *
63
- * Executes the specified tool with provided arguments.
64
- * Arguments are validated against the tool's schema before execution.
128
+ * Parse command line arguments
65
129
  */
66
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
67
- const { name, arguments: args } = request.params;
68
- console.error(`[Server] Executing tool: ${name}`);
69
- // Get tool handler from registry
70
- const handler = toolRegistry.getHandler(name);
71
- if (!handler) {
72
- throw new Error(`Unknown tool: ${name}. Use list_tools to see available tools.`);
130
+ function parseArgs() {
131
+ const args = process.argv.slice(2);
132
+ // Default values
133
+ let transport = 'stdio';
134
+ let port = 3000;
135
+ let host = '0.0.0.0';
136
+ // Parse --transport
137
+ const transportIndex = args.indexOf('--transport');
138
+ if (transportIndex !== -1 && transportIndex + 1 < args.length) {
139
+ transport = args[transportIndex + 1];
73
140
  }
74
- try {
75
- // Execute the tool handler with provided arguments
76
- const result = await handler(args || {});
77
- // Return result in MCP format
78
- return {
79
- content: [
80
- {
81
- type: 'text',
82
- text: JSON.stringify(result, null, 2),
83
- },
84
- ],
85
- };
141
+ // Parse --port
142
+ const portIndex = args.indexOf('--port');
143
+ if (portIndex !== -1 && portIndex + 1 < args.length) {
144
+ const parsedPort = parseInt(args[portIndex + 1], 10);
145
+ if (!isNaN(parsedPort)) {
146
+ port = parsedPort;
147
+ }
86
148
  }
87
- catch (error) {
88
- // Format error message using our error utilities
89
- const errorMessage = formatApiError(error);
90
- console.error(`[Server] Tool '${name}' failed:`, errorMessage);
91
- throw new Error(`Tool '${name}' execution failed: ${errorMessage}`);
149
+ // Parse --host
150
+ const hostIndex = args.indexOf('--host');
151
+ if (hostIndex !== -1 && hostIndex + 1 < args.length) {
152
+ host = args[hostIndex + 1];
92
153
  }
93
- });
154
+ return { transport, port, host };
155
+ }
94
156
  /**
95
157
  * Main function - Start the MCP server
96
158
  */
97
159
  async function main() {
98
- // Create stdio transport for communication
99
- const transport = new StdioServerTransport();
100
- // Connect server to transport
101
- await server.connect(transport);
160
+ const { transport, port, host } = parseArgs();
102
161
  // Log server information to stderr (stdout is used for MCP protocol)
103
- console.error('╔════════════════════════════════════════════════════════════════╗');
104
- console.error('║ Qase MCP Server v1.0.0 ║');
105
- console.error('╚════════════════════════════════════════════════════════════════╝');
162
+ console.error('╔══════════════════════════════════════════════════════════════╗');
163
+ console.error('║ Qase MCP Server v1.1.0 ║');
164
+ console.error('╚══════════════════════════════════════════════════════════════╝');
106
165
  console.error('');
107
- console.error(`✓ Server started successfully`);
108
166
  console.error(`✓ Registered ${toolRegistry.getToolCount()} tools`);
109
- console.error(`✓ Ready to receive requests`);
110
- console.error('');
111
- console.error('Note: This server uses stdio transport for communication.');
112
- console.error(' It is designed to be run by MCP clients (Claude, Cursor, etc.)');
113
167
  console.error('');
168
+ try {
169
+ switch (transport) {
170
+ case 'stdio': {
171
+ // Create stdio transport for communication
172
+ const stdioTransport = new StdioServerTransport();
173
+ // Connect server to transport
174
+ await createServer().connect(stdioTransport);
175
+ console.error(`✓ Server started successfully`);
176
+ console.error(`✓ Transport: stdio`);
177
+ console.error(`✓ Ready to receive requests`);
178
+ console.error('');
179
+ console.error('Note: This server uses stdio transport for communication.');
180
+ console.error(' It is designed to be run by MCP clients (Claude, Cursor, etc.)');
181
+ console.error('');
182
+ break;
183
+ }
184
+ case 'sse': {
185
+ console.error(`✓ Starting server with SSE transport on http://${host}:${port}/sse`);
186
+ setupSSETransport(createServer(), {
187
+ port,
188
+ host,
189
+ sseEndpoint: '/sse',
190
+ messagesEndpoint: '/messages',
191
+ });
192
+ console.error(`✓ Server started successfully`);
193
+ console.error(`✓ Transport: SSE (Server-Sent Events)`);
194
+ console.error(`✓ Ready to receive requests`);
195
+ console.error('');
196
+ break;
197
+ }
198
+ case 'streamable-http': {
199
+ console.error(`✓ Starting server with Streamable HTTP transport on http://${host}:${port}/mcp`);
200
+ setupStreamableHttpTransport(createServer, {
201
+ port,
202
+ host,
203
+ endpoint: '/mcp',
204
+ });
205
+ console.error(`✓ Server started successfully`);
206
+ console.error(`✓ Transport: Streamable HTTP`);
207
+ console.error(`✓ Ready to receive requests`);
208
+ console.error('');
209
+ break;
210
+ }
211
+ default:
212
+ throw new Error(`Unsupported transport type: ${transport}. Supported types: stdio, sse, streamable-http`);
213
+ }
214
+ }
215
+ catch (error) {
216
+ console.error('═══════════════════════════════════════════════════════════════');
217
+ console.error('FATAL ERROR: Server failed to start');
218
+ console.error('═══════════════════════════════════════════════════════════════');
219
+ console.error(error);
220
+ process.exit(1);
221
+ }
114
222
  }
115
223
  /**
116
224
  * Run the server and handle errors
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,10 @@
5
5
  * Attachments are files associated with test cases, steps, and results.
6
6
  */
7
7
  import { z } from 'zod';
8
+ import { createReadStream, existsSync } from 'fs';
8
9
  import { getApiClient } from '../client/index.js';
9
10
  import { toolRegistry } from '../utils/registry.js';
10
- import { toResultAsync } from '../utils/errors.js';
11
+ import { toResultAsync, createToolError } from '../utils/errors.js';
11
12
  import { ProjectCodeSchema, HashSchema } from '../utils/validation.js';
12
13
  // ============================================================================
13
14
  // SCHEMAS
@@ -16,7 +17,14 @@ import { ProjectCodeSchema, HashSchema } from '../utils/validation.js';
16
17
  * Schema for listing attachments
17
18
  */
18
19
  const ListAttachmentsSchema = z.object({
19
- limit: z.number().int().positive().max(100).optional().describe('Maximum number of items'),
20
+ limit: z
21
+ .number()
22
+ .int()
23
+ .positive()
24
+ .max(100)
25
+ .optional()
26
+ .default(10)
27
+ .describe('Maximum number of items (default: 10, max: 100)'),
20
28
  offset: z.number().int().nonnegative().optional().describe('Number of items to skip'),
21
29
  });
22
30
  /**
@@ -29,8 +37,8 @@ const GetAttachmentSchema = z.object({
29
37
  * Schema for uploading an attachment
30
38
  */
31
39
  const UploadAttachmentSchema = z.object({
32
- code: ProjectCodeSchema.optional().describe('Project code (optional, for project-specific attachments)'),
33
- file: z.string().describe('File content as base64 encoded string or file path'),
40
+ code: ProjectCodeSchema.describe('Project code'),
41
+ file: z.string().describe('File content as base64 encoded string or absolute file path'),
34
42
  filename: z.string().describe('Original filename with extension'),
35
43
  });
36
44
  /**
@@ -50,7 +58,7 @@ async function listAttachments(args) {
50
58
  const { limit, offset } = args;
51
59
  const result = await toResultAsync(client.attachments.getAttachments(limit, offset));
52
60
  return result.match((response) => response.data.result, (error) => {
53
- throw new Error(error);
61
+ throw createToolError(error, 'attachment operation');
54
62
  });
55
63
  }
56
64
  /**
@@ -61,25 +69,36 @@ async function getAttachment(args) {
61
69
  const { hash } = args;
62
70
  const result = await toResultAsync(client.attachments.getAttachment(hash));
63
71
  return result.match((response) => response.data.result, (error) => {
64
- throw new Error(error);
72
+ throw createToolError(error, 'attachment operation');
65
73
  });
66
74
  }
75
+ /**
76
+ * Prepare file data for upload.
77
+ * Accepts a base64-encoded string or an absolute file path.
78
+ * Returns an object compatible with the SDK's FormData append: { name, value }.
79
+ */
80
+ function prepareFileData(file, filename) {
81
+ // If the string looks like a file path and exists on disk, stream it
82
+ if (file.startsWith('/') && existsSync(file)) {
83
+ return { name: filename, value: createReadStream(file) };
84
+ }
85
+ // Otherwise treat it as base64 content
86
+ const isBase64 = /^[A-Za-z0-9+/=\s]+$/.test(file);
87
+ return {
88
+ name: filename,
89
+ value: Buffer.from(file, isBase64 ? 'base64' : undefined),
90
+ };
91
+ }
67
92
  /**
68
93
  * Upload a new attachment
69
94
  */
70
95
  async function uploadAttachment(args) {
71
96
  const client = getApiClient();
72
97
  const { code, file, filename } = args;
73
- // Create upload data with file content
74
- const uploadData = {
75
- file,
76
- filename,
77
- };
78
- const result = await toResultAsync(code
79
- ? client.attachments.uploadAttachment(code, uploadData)
80
- : client.attachments.uploadAttachment(uploadData));
98
+ const fileData = prepareFileData(file, filename);
99
+ const result = await toResultAsync(client.attachments.uploadAttachment(code, [fileData]));
81
100
  return result.match((response) => response.data.result, (error) => {
82
- throw new Error(error);
101
+ throw createToolError(error, 'attachment operation');
83
102
  });
84
103
  }
85
104
  /**
@@ -90,7 +109,7 @@ async function deleteAttachment(args) {
90
109
  const { hash } = args;
91
110
  const result = await toResultAsync(client.attachments.deleteAttachment(hash));
92
111
  return result.match((_response) => ({ success: true, hash }), (error) => {
93
- throw new Error(error);
112
+ throw createToolError(error, 'attachment operation');
94
113
  });
95
114
  }
96
115
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/operations/attachments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/operations/attachments.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  import { z } from 'zod';
8
8
  import { getApiClient } from '../client/index.js';
9
9
  import { toolRegistry } from '../utils/registry.js';
10
- import { toResultAsync } from '../utils/errors.js';
10
+ import { toResultAsync, createToolError } from '../utils/errors.js';
11
11
  import { IdSchema } from '../utils/validation.js';
12
12
  // ============================================================================
13
13
  // SCHEMAS
@@ -34,9 +34,9 @@ const GetAuthorSchema = z.object({
34
34
  async function listAuthors(args) {
35
35
  const client = getApiClient();
36
36
  const { limit, offset } = args;
37
- const result = await toResultAsync(client.authors.getAuthors(limit, offset));
37
+ const result = await toResultAsync(client.authors.getAuthors(undefined, undefined, limit, offset));
38
38
  return result.match((response) => response.data.result, (error) => {
39
- throw new Error(error);
39
+ throw createToolError(error, 'author operation');
40
40
  });
41
41
  }
42
42
  /**
@@ -47,7 +47,7 @@ async function getAuthor(args) {
47
47
  const { id } = args;
48
48
  const result = await toResultAsync(client.authors.getAuthor(id));
49
49
  return result.match((response) => response.data.result, (error) => {
50
- throw new Error(error);
50
+ throw createToolError(error, 'author operation');
51
51
  });
52
52
  }
53
53
  // ============================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"authors.js","sourceRoot":"","sources":["../../src/operations/authors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACtF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,QAAQ;CACb,CAAC,CAAC;AAEH,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAuC;IAChE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAY,EAAE,MAAa,CAAC,CAAC,CAAC;IAE3F,OAAO,MAAM,CAAC,KAAK,CACjB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAClC,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,IAAqC;IAC5D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAEpB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO,MAAM,CAAC,KAAK,CACjB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAClC,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,YAAY,CAAC,QAAQ,CAAC;IACpB,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oDAAoD;IACjE,MAAM,EAAE,iBAAiB;IACzB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC;AAEH,YAAY,CAAC,QAAQ,CAAC;IACpB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,6BAA6B;IAC1C,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC"}
1
+ {"version":3,"file":"authors.js","sourceRoot":"","sources":["../../src/operations/authors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;IAC1F,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;CACtF,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,QAAQ;CACb,CAAC,CAAC;AAEH,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,IAAuC;IAChE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,CAC/D,CAAC;IAEF,OAAO,MAAM,CAAC,KAAK,CACjB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAClC,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACnD,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,SAAS,CAAC,IAAqC;IAC5D,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAEpB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO,MAAM,CAAC,KAAK,CACjB,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAClC,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACnD,CAAC,CACF,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,YAAY,CAAC,QAAQ,CAAC;IACpB,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,oDAAoD;IACjE,MAAM,EAAE,iBAAiB;IACzB,OAAO,EAAE,WAAW;CACrB,CAAC,CAAC;AAEH,YAAY,CAAC,QAAQ,CAAC;IACpB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,6BAA6B;IAC1C,MAAM,EAAE,eAAe;IACvB,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC"}