mcp-quickbase 2.0.1

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 (135) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/LICENSE +21 -0
  3. package/README.md +301 -0
  4. package/dist/client/quickbase.d.ts +28 -0
  5. package/dist/client/quickbase.js +235 -0
  6. package/dist/client/quickbase.js.map +1 -0
  7. package/dist/mcp/index.d.ts +4 -0
  8. package/dist/mcp/index.js +21 -0
  9. package/dist/mcp/index.js.map +1 -0
  10. package/dist/mcp/server.d.ts +19 -0
  11. package/dist/mcp/server.js +102 -0
  12. package/dist/mcp/server.js.map +1 -0
  13. package/dist/mcp-stdio-server.d.ts +2 -0
  14. package/dist/mcp-stdio-server.js +168 -0
  15. package/dist/mcp-stdio-server.js.map +1 -0
  16. package/dist/server.d.ts +2 -0
  17. package/dist/server.js +318 -0
  18. package/dist/server.js.map +1 -0
  19. package/dist/tools/apps/create_app.d.ts +87 -0
  20. package/dist/tools/apps/create_app.js +87 -0
  21. package/dist/tools/apps/create_app.js.map +1 -0
  22. package/dist/tools/apps/index.d.ts +9 -0
  23. package/dist/tools/apps/index.js +40 -0
  24. package/dist/tools/apps/index.js.map +1 -0
  25. package/dist/tools/apps/list_tables.d.ts +108 -0
  26. package/dist/tools/apps/list_tables.js +100 -0
  27. package/dist/tools/apps/list_tables.js.map +1 -0
  28. package/dist/tools/apps/update_app.d.ts +91 -0
  29. package/dist/tools/apps/update_app.js +99 -0
  30. package/dist/tools/apps/update_app.js.map +1 -0
  31. package/dist/tools/base.d.ts +47 -0
  32. package/dist/tools/base.js +63 -0
  33. package/dist/tools/base.js.map +1 -0
  34. package/dist/tools/configure_cache.d.ts +81 -0
  35. package/dist/tools/configure_cache.js +77 -0
  36. package/dist/tools/configure_cache.js.map +1 -0
  37. package/dist/tools/fields/create_field.d.ts +121 -0
  38. package/dist/tools/fields/create_field.js +102 -0
  39. package/dist/tools/fields/create_field.js.map +1 -0
  40. package/dist/tools/fields/index.d.ts +8 -0
  41. package/dist/tools/fields/index.js +37 -0
  42. package/dist/tools/fields/index.js.map +1 -0
  43. package/dist/tools/fields/update_field.d.ts +112 -0
  44. package/dist/tools/fields/update_field.js +114 -0
  45. package/dist/tools/fields/update_field.js.map +1 -0
  46. package/dist/tools/files/download_file.d.ts +111 -0
  47. package/dist/tools/files/download_file.js +173 -0
  48. package/dist/tools/files/download_file.js.map +1 -0
  49. package/dist/tools/files/index.d.ts +8 -0
  50. package/dist/tools/files/index.js +37 -0
  51. package/dist/tools/files/index.js.map +1 -0
  52. package/dist/tools/files/upload_file.d.ts +107 -0
  53. package/dist/tools/files/upload_file.js +211 -0
  54. package/dist/tools/files/upload_file.js.map +1 -0
  55. package/dist/tools/index.d.ts +18 -0
  56. package/dist/tools/index.js +65 -0
  57. package/dist/tools/index.js.map +1 -0
  58. package/dist/tools/records/bulk_create_records.d.ts +75 -0
  59. package/dist/tools/records/bulk_create_records.js +104 -0
  60. package/dist/tools/records/bulk_create_records.js.map +1 -0
  61. package/dist/tools/records/bulk_update_records.d.ts +77 -0
  62. package/dist/tools/records/bulk_update_records.js +102 -0
  63. package/dist/tools/records/bulk_update_records.js.map +1 -0
  64. package/dist/tools/records/create_record.d.ts +68 -0
  65. package/dist/tools/records/create_record.js +123 -0
  66. package/dist/tools/records/create_record.js.map +1 -0
  67. package/dist/tools/records/index.d.ts +11 -0
  68. package/dist/tools/records/index.js +46 -0
  69. package/dist/tools/records/index.js.map +1 -0
  70. package/dist/tools/records/query_records.d.ts +164 -0
  71. package/dist/tools/records/query_records.js +261 -0
  72. package/dist/tools/records/query_records.js.map +1 -0
  73. package/dist/tools/records/update_record.d.ts +81 -0
  74. package/dist/tools/records/update_record.js +99 -0
  75. package/dist/tools/records/update_record.js.map +1 -0
  76. package/dist/tools/registry.d.ts +41 -0
  77. package/dist/tools/registry.js +66 -0
  78. package/dist/tools/registry.js.map +1 -0
  79. package/dist/tools/reports/index.d.ts +6 -0
  80. package/dist/tools/reports/index.js +31 -0
  81. package/dist/tools/reports/index.js.map +1 -0
  82. package/dist/tools/reports/run_report.d.ts +70 -0
  83. package/dist/tools/reports/run_report.js +72 -0
  84. package/dist/tools/reports/run_report.js.map +1 -0
  85. package/dist/tools/tables/create_table.d.ts +142 -0
  86. package/dist/tools/tables/create_table.js +119 -0
  87. package/dist/tools/tables/create_table.js.map +1 -0
  88. package/dist/tools/tables/get_table_fields.d.ts +108 -0
  89. package/dist/tools/tables/get_table_fields.js +96 -0
  90. package/dist/tools/tables/get_table_fields.js.map +1 -0
  91. package/dist/tools/tables/index.d.ts +9 -0
  92. package/dist/tools/tables/index.js +40 -0
  93. package/dist/tools/tables/index.js.map +1 -0
  94. package/dist/tools/tables/update_table.d.ts +91 -0
  95. package/dist/tools/tables/update_table.js +99 -0
  96. package/dist/tools/tables/update_table.js.map +1 -0
  97. package/dist/tools/test_connection.d.ts +51 -0
  98. package/dist/tools/test_connection.js +101 -0
  99. package/dist/tools/test_connection.js.map +1 -0
  100. package/dist/types/api.d.ts +70 -0
  101. package/dist/types/api.js +6 -0
  102. package/dist/types/api.js.map +1 -0
  103. package/dist/types/config.d.ts +49 -0
  104. package/dist/types/config.js +3 -0
  105. package/dist/types/config.js.map +1 -0
  106. package/dist/types/mcp.d.ts +55 -0
  107. package/dist/types/mcp.js +3 -0
  108. package/dist/types/mcp.js.map +1 -0
  109. package/dist/utils/cache.d.ts +87 -0
  110. package/dist/utils/cache.js +211 -0
  111. package/dist/utils/cache.js.map +1 -0
  112. package/dist/utils/file.d.ts +40 -0
  113. package/dist/utils/file.js +167 -0
  114. package/dist/utils/file.js.map +1 -0
  115. package/dist/utils/logger.d.ts +37 -0
  116. package/dist/utils/logger.js +144 -0
  117. package/dist/utils/logger.js.map +1 -0
  118. package/dist/utils/retry.d.ts +39 -0
  119. package/dist/utils/retry.js +88 -0
  120. package/dist/utils/retry.js.map +1 -0
  121. package/dist/utils/validation.d.ts +32 -0
  122. package/dist/utils/validation.js +227 -0
  123. package/dist/utils/validation.js.map +1 -0
  124. package/docs/README.md +41 -0
  125. package/docs/architecture.md +94 -0
  126. package/docs/claude-prompts.md +218 -0
  127. package/docs/deployment.md +244 -0
  128. package/docs/developer-guide.md +537 -0
  129. package/docs/final-qa-report.md +243 -0
  130. package/docs/performance-benchmarks.md +306 -0
  131. package/docs/quick-reference.md +109 -0
  132. package/docs/quickstart.md +183 -0
  133. package/docs/security-review.md +263 -0
  134. package/docs/tools.md +269 -0
  135. package/package.json +68 -0
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CacheService = void 0;
7
+ const node_cache_1 = __importDefault(require("node-cache"));
8
+ const logger_1 = require("./logger");
9
+ const logger = (0, logger_1.createLogger)('cache');
10
+ /**
11
+ * Cache service for API responses
12
+ */
13
+ class CacheService {
14
+ /**
15
+ * Creates a new cache service
16
+ * @param ttl Default TTL in seconds (default: 3600)
17
+ * @param enabled Whether caching is enabled (default: true)
18
+ */
19
+ constructor(ttl = 3600, enabled = true) {
20
+ this.operationLock = Promise.resolve();
21
+ this.cache = new node_cache_1.default({ stdTTL: ttl, checkperiod: ttl * 0.2 });
22
+ this.enabled = enabled;
23
+ // Register this instance for cleanup
24
+ CacheService.instances.add(this);
25
+ // Install cleanup handlers once
26
+ if (!CacheService.cleanupHandlerInstalled) {
27
+ CacheService.installCleanupHandlers();
28
+ CacheService.cleanupHandlerInstalled = true;
29
+ }
30
+ logger.info(`Cache initialized with TTL of ${ttl} seconds, enabled: ${enabled}`);
31
+ }
32
+ /**
33
+ * Gets a value from the cache
34
+ * @param key Cache key
35
+ * @returns The cached value or undefined if not found
36
+ */
37
+ get(key) {
38
+ if (!this.enabled) {
39
+ return undefined;
40
+ }
41
+ const value = this.cache.get(key);
42
+ if (value) {
43
+ logger.debug(`Cache hit for key: ${key}`);
44
+ }
45
+ else {
46
+ logger.debug(`Cache miss for key: ${key}`);
47
+ }
48
+ return value;
49
+ }
50
+ /**
51
+ * Sets a value in the cache
52
+ * @param key Cache key
53
+ * @param value Value to cache
54
+ * @param ttl TTL in seconds (optional, uses default if not specified)
55
+ */
56
+ set(key, value, ttl) {
57
+ if (!this.enabled) {
58
+ return;
59
+ }
60
+ if (typeof ttl === 'number') {
61
+ this.cache.set(key, value, ttl);
62
+ }
63
+ else {
64
+ this.cache.set(key, value);
65
+ }
66
+ logger.debug(`Cache set for key: ${key}`);
67
+ }
68
+ /**
69
+ * Removes a value from the cache
70
+ * @param key Cache key
71
+ */
72
+ del(key) {
73
+ this.cache.del(key);
74
+ logger.debug(`Cache entry deleted for key: ${key}`);
75
+ }
76
+ /**
77
+ * Clears all cache entries
78
+ */
79
+ clear() {
80
+ this.cache.flushAll();
81
+ logger.info('Cache cleared');
82
+ }
83
+ /**
84
+ * Enables or disables the cache
85
+ * @param enabled Whether the cache should be enabled
86
+ */
87
+ setEnabled(enabled) {
88
+ this.enabled = enabled;
89
+ logger.info(`Cache ${enabled ? 'enabled' : 'disabled'}`);
90
+ if (!enabled) {
91
+ this.clear();
92
+ }
93
+ }
94
+ /**
95
+ * Returns whether the cache is enabled
96
+ */
97
+ isEnabled() {
98
+ return this.enabled;
99
+ }
100
+ /**
101
+ * Checks if a key exists in the cache
102
+ * @param key Cache key
103
+ * @returns True if the key exists, false otherwise
104
+ */
105
+ has(key) {
106
+ if (!this.enabled) {
107
+ return false;
108
+ }
109
+ return this.cache.has(key);
110
+ }
111
+ /**
112
+ * Removes a value from the cache (alias for del)
113
+ * @param key Cache key
114
+ */
115
+ delete(key) {
116
+ this.del(key);
117
+ }
118
+ /**
119
+ * Gets cache statistics
120
+ * @returns Cache statistics
121
+ */
122
+ getStats() {
123
+ const stats = this.cache.getStats();
124
+ return {
125
+ hits: stats.hits,
126
+ misses: stats.misses,
127
+ keys: this.cache.keys().length
128
+ };
129
+ }
130
+ /**
131
+ * Sets a new default TTL
132
+ * @param ttl New TTL in seconds
133
+ */
134
+ setTtl(ttl) {
135
+ // Serialize TTL changes to prevent corruption
136
+ this.operationLock = this.operationLock.then(async () => {
137
+ await this.safeTtlUpdate(ttl);
138
+ });
139
+ }
140
+ async safeTtlUpdate(ttl) {
141
+ // Wait a brief moment to allow in-flight operations to complete
142
+ await new Promise(resolve => setTimeout(resolve, 100));
143
+ const oldCache = this.cache;
144
+ // Create new cache with updated TTL
145
+ const newCache = new node_cache_1.default({ stdTTL: ttl, checkperiod: ttl * 0.2 });
146
+ // Migrate existing data to new cache (if any)
147
+ try {
148
+ const keys = oldCache.keys();
149
+ for (const key of keys) {
150
+ const value = oldCache.get(key);
151
+ if (value !== undefined) {
152
+ newCache.set(key, value);
153
+ }
154
+ }
155
+ }
156
+ catch (error) {
157
+ logger.warn('Error migrating cache data during TTL update', { error });
158
+ }
159
+ // Replace the cache atomically
160
+ this.cache = newCache;
161
+ // Clean up old cache
162
+ try {
163
+ oldCache.flushAll();
164
+ oldCache.close();
165
+ }
166
+ catch (error) {
167
+ logger.warn('Error closing old cache instance', { error });
168
+ }
169
+ logger.info(`Cache TTL updated to ${ttl} seconds`);
170
+ }
171
+ /**
172
+ * Cleanup this cache instance
173
+ */
174
+ cleanup() {
175
+ try {
176
+ this.cache.flushAll();
177
+ this.cache.close();
178
+ logger.debug('Cache instance cleaned up');
179
+ }
180
+ catch (error) {
181
+ logger.error('Error cleaning up cache', { error });
182
+ }
183
+ }
184
+ /**
185
+ * Install process cleanup handlers (called once)
186
+ */
187
+ static installCleanupHandlers() {
188
+ const cleanup = () => {
189
+ logger.info('Cleaning up all cache instances');
190
+ for (const instance of CacheService.instances) {
191
+ instance.cleanup();
192
+ }
193
+ CacheService.instances.clear();
194
+ };
195
+ process.on('exit', cleanup);
196
+ process.on('SIGTERM', cleanup);
197
+ process.on('SIGINT', cleanup);
198
+ process.on('uncaughtException', cleanup);
199
+ process.on('unhandledRejection', cleanup);
200
+ }
201
+ /**
202
+ * Get cleanup statistics
203
+ */
204
+ static getStats() {
205
+ return { instances: CacheService.instances.size };
206
+ }
207
+ }
208
+ exports.CacheService = CacheService;
209
+ CacheService.instances = new Set();
210
+ CacheService.cleanupHandlerInstalled = false;
211
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Utility functions for file operations
3
+ */
4
+ /**
5
+ * Check if a file exists
6
+ * @param filePath File path to check
7
+ * @returns True if the file exists
8
+ */
9
+ export declare function fileExists(filePath: string): boolean;
10
+ /**
11
+ * Ensure a directory exists, creating it if necessary
12
+ * @param dirPath Directory path to ensure
13
+ * @returns True if the directory exists or was created
14
+ */
15
+ export declare function ensureDirectoryExists(dirPath: string): boolean;
16
+ /**
17
+ * Get information about a file
18
+ * @param filePath File path
19
+ * @returns File information or null if the file doesn't exist
20
+ */
21
+ export declare function getFileInfo(filePath: string): {
22
+ name: string;
23
+ size: number;
24
+ extension: string;
25
+ mimeType: string;
26
+ lastModified: Date;
27
+ } | null;
28
+ /**
29
+ * Read a file as a Buffer
30
+ * @param filePath File path
31
+ * @returns File contents as Buffer or null if an error occurs
32
+ */
33
+ export declare function readFileAsBuffer(filePath: string): Buffer | null;
34
+ /**
35
+ * Write data to a file
36
+ * @param filePath File path to write to
37
+ * @param data Data to write
38
+ * @returns True if the file was written successfully
39
+ */
40
+ export declare function writeFile(filePath: string, data: Buffer | string): boolean;
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.fileExists = fileExists;
37
+ exports.ensureDirectoryExists = ensureDirectoryExists;
38
+ exports.getFileInfo = getFileInfo;
39
+ exports.readFileAsBuffer = readFileAsBuffer;
40
+ exports.writeFile = writeFile;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const logger_1 = require("./logger");
44
+ const logger = (0, logger_1.createLogger)('FileUtil');
45
+ /**
46
+ * Utility functions for file operations
47
+ */
48
+ /**
49
+ * Check if a file exists
50
+ * @param filePath File path to check
51
+ * @returns True if the file exists
52
+ */
53
+ function fileExists(filePath) {
54
+ try {
55
+ return fs.existsSync(filePath) && fs.statSync(filePath).isFile();
56
+ }
57
+ catch (error) {
58
+ logger.error('Error checking if file exists', { filePath, error });
59
+ return false;
60
+ }
61
+ }
62
+ /**
63
+ * Ensure a directory exists, creating it if necessary
64
+ * @param dirPath Directory path to ensure
65
+ * @returns True if the directory exists or was created
66
+ */
67
+ function ensureDirectoryExists(dirPath) {
68
+ try {
69
+ if (fs.existsSync(dirPath)) {
70
+ return fs.statSync(dirPath).isDirectory();
71
+ }
72
+ // Create the directory
73
+ fs.mkdirSync(dirPath, { recursive: true });
74
+ return true;
75
+ }
76
+ catch (error) {
77
+ logger.error('Error ensuring directory exists', { dirPath, error });
78
+ return false;
79
+ }
80
+ }
81
+ /**
82
+ * Get information about a file
83
+ * @param filePath File path
84
+ * @returns File information or null if the file doesn't exist
85
+ */
86
+ function getFileInfo(filePath) {
87
+ try {
88
+ if (!fileExists(filePath)) {
89
+ return null;
90
+ }
91
+ const stats = fs.statSync(filePath);
92
+ const ext = path.extname(filePath).toLowerCase();
93
+ // Simple mime type mapping
94
+ const mimeTypes = {
95
+ '.txt': 'text/plain',
96
+ '.html': 'text/html',
97
+ '.css': 'text/css',
98
+ '.js': 'application/javascript',
99
+ '.json': 'application/json',
100
+ '.xml': 'application/xml',
101
+ '.pdf': 'application/pdf',
102
+ '.zip': 'application/zip',
103
+ '.png': 'image/png',
104
+ '.jpg': 'image/jpeg',
105
+ '.jpeg': 'image/jpeg',
106
+ '.gif': 'image/gif',
107
+ '.svg': 'image/svg+xml',
108
+ '.doc': 'application/msword',
109
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
110
+ '.xls': 'application/vnd.ms-excel',
111
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
112
+ '.ppt': 'application/vnd.ms-powerpoint',
113
+ '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
114
+ };
115
+ return {
116
+ name: path.basename(filePath),
117
+ size: stats.size,
118
+ extension: ext,
119
+ mimeType: mimeTypes[ext] || 'application/octet-stream',
120
+ lastModified: stats.mtime
121
+ };
122
+ }
123
+ catch (error) {
124
+ logger.error('Error getting file info', { filePath, error });
125
+ return null;
126
+ }
127
+ }
128
+ /**
129
+ * Read a file as a Buffer
130
+ * @param filePath File path
131
+ * @returns File contents as Buffer or null if an error occurs
132
+ */
133
+ function readFileAsBuffer(filePath) {
134
+ try {
135
+ if (!fileExists(filePath)) {
136
+ logger.error('File does not exist', { filePath });
137
+ return null;
138
+ }
139
+ return fs.readFileSync(filePath);
140
+ }
141
+ catch (error) {
142
+ logger.error('Error reading file', { filePath, error });
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Write data to a file
148
+ * @param filePath File path to write to
149
+ * @param data Data to write
150
+ * @returns True if the file was written successfully
151
+ */
152
+ function writeFile(filePath, data) {
153
+ try {
154
+ const dirPath = path.dirname(filePath);
155
+ if (!ensureDirectoryExists(dirPath)) {
156
+ logger.error('Could not create directory for file', { dirPath });
157
+ return false;
158
+ }
159
+ fs.writeFileSync(filePath, data);
160
+ return true;
161
+ }
162
+ catch (error) {
163
+ logger.error('Error writing file', { filePath, error });
164
+ return false;
165
+ }
166
+ }
167
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/utils/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Logger utility for the Quickbase connector
3
+ */
4
+ /**
5
+ * Log levels
6
+ */
7
+ export declare enum LogLevel {
8
+ ERROR = 0,
9
+ WARN = 1,
10
+ INFO = 2,
11
+ DEBUG = 3
12
+ }
13
+ /**
14
+ * Logger interface
15
+ */
16
+ export interface Logger {
17
+ error(message: string, data?: unknown): void;
18
+ warn(message: string, data?: unknown): void;
19
+ info(message: string, data?: unknown): void;
20
+ debug(message: string, data?: unknown): void;
21
+ }
22
+ /**
23
+ * Set the global log level
24
+ * @param level New log level
25
+ */
26
+ export declare function setLogLevel(level: LogLevel | string): void;
27
+ /**
28
+ * Get the current global log level
29
+ * @returns Current log level
30
+ */
31
+ export declare function getLogLevel(): string;
32
+ /**
33
+ * Creates a logger with the specified name
34
+ * @param name Logger name
35
+ * @returns Logger instance
36
+ */
37
+ export declare function createLogger(name: string): Logger;
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ /**
3
+ * Logger utility for the Quickbase connector
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LogLevel = void 0;
7
+ exports.setLogLevel = setLogLevel;
8
+ exports.getLogLevel = getLogLevel;
9
+ exports.createLogger = createLogger;
10
+ /**
11
+ * Log levels
12
+ */
13
+ var LogLevel;
14
+ (function (LogLevel) {
15
+ LogLevel[LogLevel["ERROR"] = 0] = "ERROR";
16
+ LogLevel[LogLevel["WARN"] = 1] = "WARN";
17
+ LogLevel[LogLevel["INFO"] = 2] = "INFO";
18
+ LogLevel[LogLevel["DEBUG"] = 3] = "DEBUG";
19
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
20
+ // Global log level (can be set via environment variable)
21
+ let globalLogLevel = process.env.LOG_LEVEL
22
+ ? (LogLevel[process.env.LOG_LEVEL.toUpperCase()] || LogLevel.INFO)
23
+ : LogLevel.INFO;
24
+ /**
25
+ * Set the global log level
26
+ * @param level New log level
27
+ */
28
+ function setLogLevel(level) {
29
+ if (typeof level === 'string') {
30
+ globalLogLevel = LogLevel[level.toUpperCase()] || LogLevel.INFO;
31
+ }
32
+ else {
33
+ globalLogLevel = level;
34
+ }
35
+ }
36
+ /**
37
+ * Get the current global log level
38
+ * @returns Current log level
39
+ */
40
+ function getLogLevel() {
41
+ return LogLevel[globalLogLevel] || 'INFO';
42
+ }
43
+ /**
44
+ * Creates a logger with the specified name
45
+ * @param name Logger name
46
+ * @returns Logger instance
47
+ */
48
+ function createLogger(name) {
49
+ const formatData = (data) => {
50
+ if (data === undefined)
51
+ return '';
52
+ try {
53
+ return JSON.stringify(redactSensitiveData(data));
54
+ }
55
+ catch (error) {
56
+ // Safe error message formatting to prevent nested serialization issues
57
+ const errorMessage = error instanceof Error ? error.message : String(error);
58
+ return `[Unserializable data: ${errorMessage}]`;
59
+ }
60
+ };
61
+ return {
62
+ error(message, data) {
63
+ if (globalLogLevel >= LogLevel.ERROR) {
64
+ // Use stderr to avoid interfering with JSON responses on stdout
65
+ process.stderr.write(`[ERROR] ${name}: ${message} ${data ? formatData(data) : ''}\n`);
66
+ }
67
+ },
68
+ warn(message, data) {
69
+ if (globalLogLevel >= LogLevel.WARN) {
70
+ // Use stderr to avoid interfering with JSON responses on stdout
71
+ process.stderr.write(`[WARN] ${name}: ${message} ${data ? formatData(data) : ''}\n`);
72
+ }
73
+ },
74
+ info(message, data) {
75
+ if (globalLogLevel >= LogLevel.INFO) {
76
+ // Use stderr to avoid interfering with JSON responses on stdout
77
+ process.stderr.write(`[INFO] ${name}: ${message} ${data ? formatData(data) : ''}\n`);
78
+ }
79
+ },
80
+ debug(message, data) {
81
+ if (globalLogLevel >= LogLevel.DEBUG) {
82
+ // Use stderr to avoid interfering with JSON responses on stdout
83
+ process.stderr.write(`[DEBUG] ${name}: ${message} ${data ? formatData(data) : ''}\n`);
84
+ }
85
+ }
86
+ };
87
+ }
88
+ /**
89
+ * Sensitive keys that should be redacted
90
+ */
91
+ const SENSITIVE_KEYS = [
92
+ 'token',
93
+ 'password',
94
+ 'secret',
95
+ 'auth',
96
+ 'key',
97
+ 'credential',
98
+ 'Authorization',
99
+ 'QB-USER-TOKEN',
100
+ 'userToken',
101
+ 'QUICKBASE_USER_TOKEN'
102
+ ];
103
+ /**
104
+ * Redacts sensitive data in objects with circular reference protection
105
+ * @param data Object to redact
106
+ * @returns Redacted object
107
+ */
108
+ function redactSensitiveData(data) {
109
+ const visited = new WeakSet();
110
+ function redactRecursive(obj) {
111
+ if (!obj || typeof obj !== 'object') {
112
+ return obj;
113
+ }
114
+ // Circular reference protection
115
+ if (visited.has(obj)) {
116
+ return '[Circular Reference]';
117
+ }
118
+ visited.add(obj);
119
+ if (Array.isArray(obj)) {
120
+ return obj.map(item => redactRecursive(item));
121
+ }
122
+ const result = {};
123
+ try {
124
+ for (const [key, value] of Object.entries(obj)) {
125
+ if (typeof value === 'object' && value !== null) {
126
+ result[key] = redactRecursive(value);
127
+ }
128
+ else if (typeof value === 'string' &&
129
+ SENSITIVE_KEYS.some(k => key.toLowerCase().includes(k.toLowerCase()))) {
130
+ result[key] = '***REDACTED***';
131
+ }
132
+ else {
133
+ result[key] = value;
134
+ }
135
+ }
136
+ }
137
+ catch (error) {
138
+ return '[Unserializable Object]';
139
+ }
140
+ return result;
141
+ }
142
+ return redactRecursive(data);
143
+ }
144
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Options for configuring retry behavior
3
+ */
4
+ export interface RetryOptions {
5
+ /**
6
+ * Maximum number of retry attempts
7
+ */
8
+ maxRetries: number;
9
+ /**
10
+ * Base delay in milliseconds between retries
11
+ */
12
+ baseDelay: number;
13
+ /**
14
+ * Maximum delay in milliseconds between retries
15
+ */
16
+ maxDelay?: number;
17
+ /**
18
+ * Factor to multiply delay by after each retry attempt
19
+ */
20
+ backoffFactor?: number;
21
+ /**
22
+ * Function that determines if an error is retryable
23
+ */
24
+ isRetryable?: (error: unknown) => boolean;
25
+ }
26
+ /**
27
+ * Calculates the delay time for a retry attempt with exponential backoff
28
+ * @param attempt Retry attempt number (0-based)
29
+ * @param options Retry options
30
+ * @returns Delay time in milliseconds
31
+ */
32
+ export declare function calculateBackoff(attempt: number, options: RetryOptions): number;
33
+ /**
34
+ * Wrapper function that adds retry logic to any async function
35
+ * @param fn Function to add retry logic to
36
+ * @param options Retry options
37
+ * @returns Function with retry logic
38
+ */
39
+ export declare function withRetry<T, Args extends unknown[]>(fn: (...args: Args) => Promise<T>, options?: Partial<RetryOptions>): (...args: Args) => Promise<T>;