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.
- package/CHANGELOG.md +82 -0
- package/LICENSE +21 -0
- package/README.md +301 -0
- package/dist/client/quickbase.d.ts +28 -0
- package/dist/client/quickbase.js +235 -0
- package/dist/client/quickbase.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.js +21 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +19 -0
- package/dist/mcp/server.js +102 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp-stdio-server.d.ts +2 -0
- package/dist/mcp-stdio-server.js +168 -0
- package/dist/mcp-stdio-server.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +318 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/apps/create_app.d.ts +87 -0
- package/dist/tools/apps/create_app.js +87 -0
- package/dist/tools/apps/create_app.js.map +1 -0
- package/dist/tools/apps/index.d.ts +9 -0
- package/dist/tools/apps/index.js +40 -0
- package/dist/tools/apps/index.js.map +1 -0
- package/dist/tools/apps/list_tables.d.ts +108 -0
- package/dist/tools/apps/list_tables.js +100 -0
- package/dist/tools/apps/list_tables.js.map +1 -0
- package/dist/tools/apps/update_app.d.ts +91 -0
- package/dist/tools/apps/update_app.js +99 -0
- package/dist/tools/apps/update_app.js.map +1 -0
- package/dist/tools/base.d.ts +47 -0
- package/dist/tools/base.js +63 -0
- package/dist/tools/base.js.map +1 -0
- package/dist/tools/configure_cache.d.ts +81 -0
- package/dist/tools/configure_cache.js +77 -0
- package/dist/tools/configure_cache.js.map +1 -0
- package/dist/tools/fields/create_field.d.ts +121 -0
- package/dist/tools/fields/create_field.js +102 -0
- package/dist/tools/fields/create_field.js.map +1 -0
- package/dist/tools/fields/index.d.ts +8 -0
- package/dist/tools/fields/index.js +37 -0
- package/dist/tools/fields/index.js.map +1 -0
- package/dist/tools/fields/update_field.d.ts +112 -0
- package/dist/tools/fields/update_field.js +114 -0
- package/dist/tools/fields/update_field.js.map +1 -0
- package/dist/tools/files/download_file.d.ts +111 -0
- package/dist/tools/files/download_file.js +173 -0
- package/dist/tools/files/download_file.js.map +1 -0
- package/dist/tools/files/index.d.ts +8 -0
- package/dist/tools/files/index.js +37 -0
- package/dist/tools/files/index.js.map +1 -0
- package/dist/tools/files/upload_file.d.ts +107 -0
- package/dist/tools/files/upload_file.js +211 -0
- package/dist/tools/files/upload_file.js.map +1 -0
- package/dist/tools/index.d.ts +18 -0
- package/dist/tools/index.js +65 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/records/bulk_create_records.d.ts +75 -0
- package/dist/tools/records/bulk_create_records.js +104 -0
- package/dist/tools/records/bulk_create_records.js.map +1 -0
- package/dist/tools/records/bulk_update_records.d.ts +77 -0
- package/dist/tools/records/bulk_update_records.js +102 -0
- package/dist/tools/records/bulk_update_records.js.map +1 -0
- package/dist/tools/records/create_record.d.ts +68 -0
- package/dist/tools/records/create_record.js +123 -0
- package/dist/tools/records/create_record.js.map +1 -0
- package/dist/tools/records/index.d.ts +11 -0
- package/dist/tools/records/index.js +46 -0
- package/dist/tools/records/index.js.map +1 -0
- package/dist/tools/records/query_records.d.ts +164 -0
- package/dist/tools/records/query_records.js +261 -0
- package/dist/tools/records/query_records.js.map +1 -0
- package/dist/tools/records/update_record.d.ts +81 -0
- package/dist/tools/records/update_record.js +99 -0
- package/dist/tools/records/update_record.js.map +1 -0
- package/dist/tools/registry.d.ts +41 -0
- package/dist/tools/registry.js +66 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/reports/index.d.ts +6 -0
- package/dist/tools/reports/index.js +31 -0
- package/dist/tools/reports/index.js.map +1 -0
- package/dist/tools/reports/run_report.d.ts +70 -0
- package/dist/tools/reports/run_report.js +72 -0
- package/dist/tools/reports/run_report.js.map +1 -0
- package/dist/tools/tables/create_table.d.ts +142 -0
- package/dist/tools/tables/create_table.js +119 -0
- package/dist/tools/tables/create_table.js.map +1 -0
- package/dist/tools/tables/get_table_fields.d.ts +108 -0
- package/dist/tools/tables/get_table_fields.js +96 -0
- package/dist/tools/tables/get_table_fields.js.map +1 -0
- package/dist/tools/tables/index.d.ts +9 -0
- package/dist/tools/tables/index.js +40 -0
- package/dist/tools/tables/index.js.map +1 -0
- package/dist/tools/tables/update_table.d.ts +91 -0
- package/dist/tools/tables/update_table.js +99 -0
- package/dist/tools/tables/update_table.js.map +1 -0
- package/dist/tools/test_connection.d.ts +51 -0
- package/dist/tools/test_connection.js +101 -0
- package/dist/tools/test_connection.js.map +1 -0
- package/dist/types/api.d.ts +70 -0
- package/dist/types/api.js +6 -0
- package/dist/types/api.js.map +1 -0
- package/dist/types/config.d.ts +49 -0
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/mcp.d.ts +55 -0
- package/dist/types/mcp.js +3 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/utils/cache.d.ts +87 -0
- package/dist/utils/cache.js +211 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/file.d.ts +40 -0
- package/dist/utils/file.js +167 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.d.ts +37 -0
- package/dist/utils/logger.js +144 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/retry.d.ts +39 -0
- package/dist/utils/retry.js +88 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/validation.d.ts +32 -0
- package/dist/utils/validation.js +227 -0
- package/dist/utils/validation.js.map +1 -0
- package/docs/README.md +41 -0
- package/docs/architecture.md +94 -0
- package/docs/claude-prompts.md +218 -0
- package/docs/deployment.md +244 -0
- package/docs/developer-guide.md +537 -0
- package/docs/final-qa-report.md +243 -0
- package/docs/performance-benchmarks.md +306 -0
- package/docs/quick-reference.md +109 -0
- package/docs/quickstart.md +183 -0
- package/docs/security-review.md +263 -0
- package/docs/tools.md +269 -0
- 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,gCAOC;AAOD,sDAaC;AAOD,kCAiDC;AAOD,4CAYC;AAQD,8BAcC;AA3ID,uCAAyB;AACzB,2CAA6B;AAC7B,qCAAwC;AAExC,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,UAAU,CAAC,CAAC;AAExC;;GAEG;AAEH;;;;GAIG;AACH,SAAgB,UAAU,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;QAED,uBAAuB;QACvB,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,WAAW,CAAC,QAAgB;IAO1C,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAEjD,2BAA2B;QAC3B,MAAM,SAAS,GAA2B;YACxC,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,UAAU;YAClB,KAAK,EAAE,wBAAwB;YAC/B,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,iBAAiB;YACzB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,yEAAyE;YAClF,MAAM,EAAE,0BAA0B;YAClC,OAAO,EAAE,mEAAmE;YAC5E,MAAM,EAAE,+BAA+B;YACvC,OAAO,EAAE,2EAA2E;SACrF,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,0BAA0B;YACtD,YAAY,EAAE,KAAK,CAAC,KAAK;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,SAAS,CAAC,QAAgB,EAAE,IAAqB;IAC/D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -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>;
|