@pipeline-builder/pipeline-data 3.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.
- package/LICENSE +202 -0
- package/README.md +34 -0
- package/drizzle.config.ts +17 -0
- package/lib/api/access-control-builder.d.ts +109 -0
- package/lib/api/access-control-builder.js +181 -0
- package/lib/api/crud-service.d.ts +170 -0
- package/lib/api/crud-service.js +387 -0
- package/lib/api/query-builders.d.ts +74 -0
- package/lib/api/query-builders.js +336 -0
- package/lib/api/reporting-service.d.ts +131 -0
- package/lib/api/reporting-service.js +248 -0
- package/lib/core/query-filters.d.ts +235 -0
- package/lib/core/query-filters.js +23 -0
- package/lib/database/drizzle-schema.d.ts +10043 -0
- package/lib/database/drizzle-schema.js +715 -0
- package/lib/database/index.d.ts +3 -0
- package/lib/database/index.js +22 -0
- package/lib/database/postgres-connection.d.ts +232 -0
- package/lib/database/postgres-connection.js +456 -0
- package/lib/database/retry-strategy.d.ts +68 -0
- package/lib/database/retry-strategy.js +126 -0
- package/lib/index.d.ts +30 -0
- package/lib/index.js +52 -0
- package/package.json +125 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.ConnectionRetryStrategy = void 0;
|
|
6
|
+
const api_core_1 = require("@pipeline-builder/api-core");
|
|
7
|
+
const logger = (0, api_core_1.createLogger)('RetryStrategy');
|
|
8
|
+
/**
|
|
9
|
+
* Implements exponential backoff retry strategy for database connections.
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Exponential backoff with configurable base delay
|
|
13
|
+
* - Attempt tracking and logging
|
|
14
|
+
* - Graceful failure after max retries
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const strategy = new ConnectionRetryStrategy({ maxRetries: 3, baseDelay: 1000 });
|
|
19
|
+
*
|
|
20
|
+
* const result = await strategy.execute(async () => {
|
|
21
|
+
* return await db.query('SELECT 1');
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
class ConnectionRetryStrategy {
|
|
26
|
+
config;
|
|
27
|
+
attempts = 0;
|
|
28
|
+
constructor(config) {
|
|
29
|
+
this.config = config;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Executes an operation with retry logic
|
|
33
|
+
*
|
|
34
|
+
* @param operation - Async function to execute with retries
|
|
35
|
+
* @returns Promise resolving to operation result
|
|
36
|
+
* @throws Error if all retry attempts fail
|
|
37
|
+
*/
|
|
38
|
+
async execute(operation) {
|
|
39
|
+
this.attempts = 0;
|
|
40
|
+
while (this.attempts < this.config.maxRetries) {
|
|
41
|
+
try {
|
|
42
|
+
const result = await operation();
|
|
43
|
+
if (this.attempts > 0) {
|
|
44
|
+
logger.info('Operation succeeded after retry');
|
|
45
|
+
}
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
this.attempts++;
|
|
50
|
+
if (this.attempts >= this.config.maxRetries) {
|
|
51
|
+
logger.error(`Max retry attempts (${this.config.maxRetries}) reached`);
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
const delay = this.calculateBackoff(this.attempts);
|
|
55
|
+
logger.warn(`Operation failed (attempt ${this.attempts}/${this.config.maxRetries}), retrying in ${delay}ms...`, { error: error instanceof Error ? error.message : String(error) });
|
|
56
|
+
await this.sleep(delay);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
throw new Error('Retry logic failed unexpectedly');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Handles connection errors with retry tracking
|
|
63
|
+
*
|
|
64
|
+
* @param error - Error that occurred
|
|
65
|
+
* @param testConnection - Function to test if connection is restored
|
|
66
|
+
*/
|
|
67
|
+
async handleConnectionError(error, testConnection) {
|
|
68
|
+
this.attempts++;
|
|
69
|
+
logger.error(`Connection error (attempt ${this.attempts}/${this.config.maxRetries}):`, error.message);
|
|
70
|
+
if (this.attempts < this.config.maxRetries) {
|
|
71
|
+
const delay = this.calculateBackoff(this.attempts);
|
|
72
|
+
logger.info(`Retrying connection in ${delay}ms...`);
|
|
73
|
+
await this.sleep(delay);
|
|
74
|
+
try {
|
|
75
|
+
const isHealthy = await testConnection();
|
|
76
|
+
if (isHealthy) {
|
|
77
|
+
logger.info('Connection restored');
|
|
78
|
+
this.attempts = 0; // Reset on successful connection
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
logger.error('Connection test failed after retry');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (retryError) {
|
|
85
|
+
logger.error('Retry failed:', retryError);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger.error('Max connection retry attempts reached');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Resets the attempt counter
|
|
94
|
+
* Call this after a successful operation
|
|
95
|
+
*/
|
|
96
|
+
reset() {
|
|
97
|
+
this.attempts = 0;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Gets the current attempt count
|
|
101
|
+
*/
|
|
102
|
+
getAttempts() {
|
|
103
|
+
return this.attempts;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Calculates exponential backoff delay
|
|
107
|
+
*
|
|
108
|
+
* @param attempt - Current attempt number (1-indexed)
|
|
109
|
+
* @returns Delay in milliseconds
|
|
110
|
+
*/
|
|
111
|
+
calculateBackoff(attempt) {
|
|
112
|
+
const base = this.config.baseDelay * Math.pow(2, attempt - 1);
|
|
113
|
+
const jitter = Math.random() * 0.1 * base;
|
|
114
|
+
return base + jitter;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Sleeps for the specified duration
|
|
118
|
+
*
|
|
119
|
+
* @param ms - Milliseconds to sleep
|
|
120
|
+
*/
|
|
121
|
+
sleep(ms) {
|
|
122
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.ConnectionRetryStrategy = ConnectionRetryStrategy;
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0Qyx5REFBMEQ7QUFFMUQsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBWSxFQUFDLGVBQWUsQ0FBQyxDQUFDO0FBWTdDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBYSx1QkFBdUI7SUFHTDtJQUZyQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXJCLFlBQTZCLE1BQW1CO1FBQW5CLFdBQU0sR0FBTixNQUFNLENBQWE7SUFBRyxDQUFDO0lBRXBEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUksU0FBMkI7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxXQUFXLENBQUMsQ0FBQztvQkFDdkUsTUFBTSxLQUFLLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUNULDZCQUE2QixJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxrQkFBa0IsS0FBSyxPQUFPLEVBQ2xHLEVBQUUsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNsRSxDQUFDO2dCQUVGLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQUMsS0FBWSxFQUFFLGNBQXNDO1FBQzlFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVoQixNQUFNLENBQUMsS0FBSyxDQUNWLDZCQUE2QixJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLEVBQ3hFLEtBQUssQ0FBQyxPQUFPLENBQ2QsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUVwRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sU0FBUyxHQUFHLE1BQU0sY0FBYyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO29CQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLGlDQUFpQztnQkFDdEQsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE1BQU0sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDckQsQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxnQkFBZ0IsQ0FBQyxPQUFlO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQztRQUMxQyxPQUFPLElBQUksR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsRUFBVTtRQUN0QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7Q0FDRjtBQWxIRCwwREFrSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ1JldHJ5U3RyYXRlZ3knKTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW9uIHJldHJ5IHN0cmF0ZWd5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlDb25maWcge1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgKi9cbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzICovXG4gIGJhc2VEZWxheTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgZXhwb25lbnRpYWwgYmFja29mZiByZXRyeSBzdHJhdGVneSBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbnMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBjb25maWd1cmFibGUgYmFzZSBkZWxheVxuICogLSBBdHRlbXB0IHRyYWNraW5nIGFuZCBsb2dnaW5nXG4gKiAtIEdyYWNlZnVsIGZhaWx1cmUgYWZ0ZXIgbWF4IHJldHJpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3RyYXRlZ3kgPSBuZXcgQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3koeyBtYXhSZXRyaWVzOiAzLCBiYXNlRGVsYXk6IDEwMDAgfSk7XG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kuZXhlY3V0ZShhc3luYyAoKSA9PiB7XG4gKiAgIHJldHVybiBhd2FpdCBkYi5xdWVyeSgnU0VMRUNUIDEnKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSB7XG4gIHByaXZhdGUgYXR0ZW1wdHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBSZXRyeUNvbmZpZykge31cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gb3BlcmF0aW9uIHdpdGggcmV0cnkgbG9naWNcbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2l0aCByZXRyaWVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbiByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBhbGwgcmV0cnkgYXR0ZW1wdHMgZmFpbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZTxUPihvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcblxuICAgIHdoaWxlICh0aGlzLmF0dGVtcHRzIDwgdGhpcy5jb25maWcubWF4UmV0cmllcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BlcmF0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmF0dGVtcHRzID4gMCkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdPcGVyYXRpb24gc3VjY2VlZGVkIGFmdGVyIHJldHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuYXR0ZW1wdHMrKztcblxuICAgICAgICBpZiAodGhpcy5hdHRlbXB0cyA+PSB0aGlzLmNvbmZpZy5tYXhSZXRyaWVzKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBNYXggcmV0cnkgYXR0ZW1wdHMgKCR7dGhpcy5jb25maWcubWF4UmV0cmllc30pIHJlYWNoZWRgKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKHRoaXMuYXR0ZW1wdHMpO1xuICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICBgT3BlcmF0aW9uIGZhaWxlZCAoYXR0ZW1wdCAke3RoaXMuYXR0ZW1wdHN9LyR7dGhpcy5jb25maWcubWF4UmV0cmllc30pLCByZXRyeWluZyBpbiAke2RlbGF5fW1zLi4uYCxcbiAgICAgICAgICB7IGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JldHJ5IGxvZ2ljIGZhaWxlZCB1bmV4cGVjdGVkbHknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNvbm5lY3Rpb24gZXJyb3JzIHdpdGggcmV0cnkgdHJhY2tpbmdcbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gRXJyb3IgdGhhdCBvY2N1cnJlZFxuICAgKiBAcGFyYW0gdGVzdENvbm5lY3Rpb24gLSBGdW5jdGlvbiB0byB0ZXN0IGlmIGNvbm5lY3Rpb24gaXMgcmVzdG9yZWRcbiAgICovXG4gIGFzeW5jIGhhbmRsZUNvbm5lY3Rpb25FcnJvcihlcnJvcjogRXJyb3IsIHRlc3RDb25uZWN0aW9uOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hdHRlbXB0cysrO1xuXG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYENvbm5lY3Rpb24gZXJyb3IgKGF0dGVtcHQgJHt0aGlzLmF0dGVtcHRzfS8ke3RoaXMuY29uZmlnLm1heFJldHJpZXN9KTpgLFxuICAgICAgZXJyb3IubWVzc2FnZSxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuYXR0ZW1wdHMgPCB0aGlzLmNvbmZpZy5tYXhSZXRyaWVzKSB7XG4gICAgICBjb25zdCBkZWxheSA9IHRoaXMuY2FsY3VsYXRlQmFja29mZih0aGlzLmF0dGVtcHRzKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBSZXRyeWluZyBjb25uZWN0aW9uIGluICR7ZGVsYXl9bXMuLi5gKTtcblxuICAgICAgYXdhaXQgdGhpcy5zbGVlcChkZWxheSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGlzSGVhbHRoeSA9IGF3YWl0IHRlc3RDb25uZWN0aW9uKCk7XG4gICAgICAgIGlmIChpc0hlYWx0aHkpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnQ29ubmVjdGlvbiByZXN0b3JlZCcpO1xuICAgICAgICAgIHRoaXMuYXR0ZW1wdHMgPSAwOyAvLyBSZXNldCBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb25cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Nvbm5lY3Rpb24gdGVzdCBmYWlsZWQgYWZ0ZXIgcmV0cnknKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1JldHJ5IGZhaWxlZDonLCByZXRyeUVycm9yKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmVycm9yKCdNYXggY29ubmVjdGlvbiByZXRyeSBhdHRlbXB0cyByZWFjaGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgYXR0ZW1wdCBjb3VudGVyXG4gICAqIENhbGwgdGhpcyBhZnRlciBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uXG4gICAqL1xuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGVtcHRzID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IGF0dGVtcHQgY291bnRcbiAgICovXG4gIGdldEF0dGVtcHRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYXR0ZW1wdHM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBleHBvbmVudGlhbCBiYWNrb2ZmIGRlbGF5XG4gICAqXG4gICAqIEBwYXJhbSBhdHRlbXB0IC0gQ3VycmVudCBhdHRlbXB0IG51bWJlciAoMS1pbmRleGVkKVxuICAgKiBAcmV0dXJucyBEZWxheSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlQmFja29mZihhdHRlbXB0OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmNvbmZpZy5iYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0IC0gMSk7XG4gICAgY29uc3Qgaml0dGVyID0gTWF0aC5yYW5kb20oKSAqIDAuMSAqIGJhc2U7XG4gICAgcmV0dXJuIGJhc2UgKyBqaXR0ZXI7XG4gIH1cblxuICAvKipcbiAgICogU2xlZXBzIGZvciB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtcyAtIE1pbGxpc2Vjb25kcyB0byBzbGVlcFxuICAgKi9cbiAgcHJpdmF0ZSBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuICB9XG59XG4iXX0=
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @pipeline-builder/pipeline-data
|
|
3
|
+
*
|
|
4
|
+
* Database layer: Drizzle ORM schemas, connection management, and query infrastructure.
|
|
5
|
+
*
|
|
6
|
+
* **Database**
|
|
7
|
+
* - db — shared Drizzle database instance
|
|
8
|
+
* - getConnection, closeConnection — PostgreSQL connection lifecycle with retry logic
|
|
9
|
+
* - schema — Drizzle table definitions (plugins, pipelines, messages, compliance, etc.)
|
|
10
|
+
*
|
|
11
|
+
* **Services**
|
|
12
|
+
* - CrudService — generic base class for multi-tenant CRUD with access control and pagination
|
|
13
|
+
* - ReportingService — aggregate query and reporting base class
|
|
14
|
+
*
|
|
15
|
+
* **Query Builders**
|
|
16
|
+
* - buildPluginConditions, buildPipelineConditions, buildMessageConditions — filter-to-SQL condition builders
|
|
17
|
+
* - buildCompliancePolicyConditions, buildComplianceRuleConditions, etc. — compliance query builders
|
|
18
|
+
* - AccessControlBuilder — row-level access control condition builder
|
|
19
|
+
*
|
|
20
|
+
* **Filters**
|
|
21
|
+
* - PluginFilter, PipelineFilter, MessageFilter — typed filter interfaces
|
|
22
|
+
* - CompliancePolicyFilter, ComplianceRuleFilter, etc. — compliance filter interfaces
|
|
23
|
+
* - drizzleRows, drizzleCount — Drizzle result type helpers
|
|
24
|
+
*/
|
|
25
|
+
export * from './database';
|
|
26
|
+
export * from './api/query-builders';
|
|
27
|
+
export * from './api/access-control-builder';
|
|
28
|
+
export * from './api/crud-service';
|
|
29
|
+
export * from './api/reporting-service';
|
|
30
|
+
export * from './core/query-filters';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
16
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
/**
|
|
20
|
+
* @module @pipeline-builder/pipeline-data
|
|
21
|
+
*
|
|
22
|
+
* Database layer: Drizzle ORM schemas, connection management, and query infrastructure.
|
|
23
|
+
*
|
|
24
|
+
* **Database**
|
|
25
|
+
* - db — shared Drizzle database instance
|
|
26
|
+
* - getConnection, closeConnection — PostgreSQL connection lifecycle with retry logic
|
|
27
|
+
* - schema — Drizzle table definitions (plugins, pipelines, messages, compliance, etc.)
|
|
28
|
+
*
|
|
29
|
+
* **Services**
|
|
30
|
+
* - CrudService — generic base class for multi-tenant CRUD with access control and pagination
|
|
31
|
+
* - ReportingService — aggregate query and reporting base class
|
|
32
|
+
*
|
|
33
|
+
* **Query Builders**
|
|
34
|
+
* - buildPluginConditions, buildPipelineConditions, buildMessageConditions — filter-to-SQL condition builders
|
|
35
|
+
* - buildCompliancePolicyConditions, buildComplianceRuleConditions, etc. — compliance query builders
|
|
36
|
+
* - AccessControlBuilder — row-level access control condition builder
|
|
37
|
+
*
|
|
38
|
+
* **Filters**
|
|
39
|
+
* - PluginFilter, PipelineFilter, MessageFilter — typed filter interfaces
|
|
40
|
+
* - CompliancePolicyFilter, ComplianceRuleFilter, etc. — compliance filter interfaces
|
|
41
|
+
* - drizzleRows, drizzleCount — Drizzle result type helpers
|
|
42
|
+
*/
|
|
43
|
+
// Database
|
|
44
|
+
__exportStar(require("./database"), exports);
|
|
45
|
+
// Query builders and services
|
|
46
|
+
__exportStar(require("./api/query-builders"), exports);
|
|
47
|
+
__exportStar(require("./api/access-control-builder"), exports);
|
|
48
|
+
__exportStar(require("./api/crud-service"), exports);
|
|
49
|
+
__exportStar(require("./api/reporting-service"), exports);
|
|
50
|
+
// Filters
|
|
51
|
+
__exportStar(require("./core/query-filters"), exports);
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBRUgsV0FBVztBQUNYLDZDQUEyQjtBQUUzQiw4QkFBOEI7QUFDOUIsdURBQXFDO0FBQ3JDLCtEQUE2QztBQUM3QyxxREFBbUM7QUFDbkMsMERBQXdDO0FBRXhDLFVBQVU7QUFDVix1REFBcUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBAbW9kdWxlIEBwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGFcbiAqXG4gKiBEYXRhYmFzZSBsYXllcjogRHJpenpsZSBPUk0gc2NoZW1hcywgY29ubmVjdGlvbiBtYW5hZ2VtZW50LCBhbmQgcXVlcnkgaW5mcmFzdHJ1Y3R1cmUuXG4gKlxuICogKipEYXRhYmFzZSoqXG4gKiAtIGRiIOKAlCBzaGFyZWQgRHJpenpsZSBkYXRhYmFzZSBpbnN0YW5jZVxuICogLSBnZXRDb25uZWN0aW9uLCBjbG9zZUNvbm5lY3Rpb24g4oCUIFBvc3RncmVTUUwgY29ubmVjdGlvbiBsaWZlY3ljbGUgd2l0aCByZXRyeSBsb2dpY1xuICogLSBzY2hlbWEg4oCUIERyaXp6bGUgdGFibGUgZGVmaW5pdGlvbnMgKHBsdWdpbnMsIHBpcGVsaW5lcywgbWVzc2FnZXMsIGNvbXBsaWFuY2UsIGV0Yy4pXG4gKlxuICogKipTZXJ2aWNlcyoqXG4gKiAtIENydWRTZXJ2aWNlIOKAlCBnZW5lcmljIGJhc2UgY2xhc3MgZm9yIG11bHRpLXRlbmFudCBDUlVEIHdpdGggYWNjZXNzIGNvbnRyb2wgYW5kIHBhZ2luYXRpb25cbiAqIC0gUmVwb3J0aW5nU2VydmljZSDigJQgYWdncmVnYXRlIHF1ZXJ5IGFuZCByZXBvcnRpbmcgYmFzZSBjbGFzc1xuICpcbiAqICoqUXVlcnkgQnVpbGRlcnMqKlxuICogLSBidWlsZFBsdWdpbkNvbmRpdGlvbnMsIGJ1aWxkUGlwZWxpbmVDb25kaXRpb25zLCBidWlsZE1lc3NhZ2VDb25kaXRpb25zIOKAlCBmaWx0ZXItdG8tU1FMIGNvbmRpdGlvbiBidWlsZGVyc1xuICogLSBidWlsZENvbXBsaWFuY2VQb2xpY3lDb25kaXRpb25zLCBidWlsZENvbXBsaWFuY2VSdWxlQ29uZGl0aW9ucywgZXRjLiDigJQgY29tcGxpYW5jZSBxdWVyeSBidWlsZGVyc1xuICogLSBBY2Nlc3NDb250cm9sQnVpbGRlciDigJQgcm93LWxldmVsIGFjY2VzcyBjb250cm9sIGNvbmRpdGlvbiBidWlsZGVyXG4gKlxuICogKipGaWx0ZXJzKipcbiAqIC0gUGx1Z2luRmlsdGVyLCBQaXBlbGluZUZpbHRlciwgTWVzc2FnZUZpbHRlciDigJQgdHlwZWQgZmlsdGVyIGludGVyZmFjZXNcbiAqIC0gQ29tcGxpYW5jZVBvbGljeUZpbHRlciwgQ29tcGxpYW5jZVJ1bGVGaWx0ZXIsIGV0Yy4g4oCUIGNvbXBsaWFuY2UgZmlsdGVyIGludGVyZmFjZXNcbiAqIC0gZHJpenpsZVJvd3MsIGRyaXp6bGVDb3VudCDigJQgRHJpenpsZSByZXN1bHQgdHlwZSBoZWxwZXJzXG4gKi9cblxuLy8gRGF0YWJhc2VcbmV4cG9ydCAqIGZyb20gJy4vZGF0YWJhc2UnO1xuXG4vLyBRdWVyeSBidWlsZGVycyBhbmQgc2VydmljZXNcbmV4cG9ydCAqIGZyb20gJy4vYXBpL3F1ZXJ5LWJ1aWxkZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL2FjY2Vzcy1jb250cm9sLWJ1aWxkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9hcGkvY3J1ZC1zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vYXBpL3JlcG9ydGluZy1zZXJ2aWNlJztcblxuLy8gRmlsdGVyc1xuZXhwb3J0ICogZnJvbSAnLi9jb3JlL3F1ZXJ5LWZpbHRlcnMnO1xuIl19
|
package/package.json
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pipeline-builder/pipeline-data",
|
|
3
|
+
"description": "Database layer for Pipeline Builder: Drizzle ORM schemas, connection management, query builders, and the generic CrudService base class with multi-tenant access control.",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/mwashburn160/pipeline-builder.git"
|
|
7
|
+
},
|
|
8
|
+
"devDependencies": {
|
|
9
|
+
"@stylistic/eslint-plugin": "^2",
|
|
10
|
+
"@types/jest": "^30.0.0",
|
|
11
|
+
"@types/node": "25.3.0",
|
|
12
|
+
"@types/pg": "8.16.0",
|
|
13
|
+
"@typescript-eslint/eslint-plugin": "^8",
|
|
14
|
+
"@typescript-eslint/parser": "^8",
|
|
15
|
+
"drizzle-kit": "0.31.9",
|
|
16
|
+
"eslint": "^9",
|
|
17
|
+
"eslint-import-resolver-typescript": "^4.4.4",
|
|
18
|
+
"eslint-plugin-import": "^2.32.0",
|
|
19
|
+
"jest": "^30.2.0",
|
|
20
|
+
"jest-junit": "^16",
|
|
21
|
+
"ts-jest": "^29.4.6",
|
|
22
|
+
"typescript": "5.9.3"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"drizzle-orm": "0.45.1",
|
|
26
|
+
"pg": "8.18.0",
|
|
27
|
+
"@pipeline-builder/api-core": "3.1.0"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"aws",
|
|
31
|
+
"codepipeline",
|
|
32
|
+
"codebuild",
|
|
33
|
+
"cicd",
|
|
34
|
+
"ci-cd",
|
|
35
|
+
"devops",
|
|
36
|
+
"cdk",
|
|
37
|
+
"aws-cdk",
|
|
38
|
+
"cloudformation",
|
|
39
|
+
"pipeline",
|
|
40
|
+
"pipeline-as-code",
|
|
41
|
+
"containerized",
|
|
42
|
+
"docker",
|
|
43
|
+
"kubernetes",
|
|
44
|
+
"plugins",
|
|
45
|
+
"typescript",
|
|
46
|
+
"self-service",
|
|
47
|
+
"multi-tenant",
|
|
48
|
+
"compliance",
|
|
49
|
+
"automation",
|
|
50
|
+
"infrastructure-as-code",
|
|
51
|
+
"iac",
|
|
52
|
+
"cli"
|
|
53
|
+
],
|
|
54
|
+
"engines": {
|
|
55
|
+
"node": ">= 24.14.0"
|
|
56
|
+
},
|
|
57
|
+
"main": "lib/index.js",
|
|
58
|
+
"license": "Apache-2.0",
|
|
59
|
+
"homepage": "https://mwashburn160.github.io/pipeline-builder/",
|
|
60
|
+
"version": "3.1.0",
|
|
61
|
+
"bugs": {
|
|
62
|
+
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
63
|
+
},
|
|
64
|
+
"jest": {
|
|
65
|
+
"coverageProvider": "v8",
|
|
66
|
+
"testMatch": [
|
|
67
|
+
"<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
|
|
68
|
+
"<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)"
|
|
69
|
+
],
|
|
70
|
+
"clearMocks": true,
|
|
71
|
+
"collectCoverage": true,
|
|
72
|
+
"coverageReporters": [
|
|
73
|
+
"json",
|
|
74
|
+
"lcov",
|
|
75
|
+
"clover",
|
|
76
|
+
"cobertura",
|
|
77
|
+
"text"
|
|
78
|
+
],
|
|
79
|
+
"coverageDirectory": "coverage",
|
|
80
|
+
"coveragePathIgnorePatterns": [
|
|
81
|
+
"/node_modules/"
|
|
82
|
+
],
|
|
83
|
+
"testPathIgnorePatterns": [
|
|
84
|
+
"/node_modules/"
|
|
85
|
+
],
|
|
86
|
+
"watchPathIgnorePatterns": [
|
|
87
|
+
"/node_modules/"
|
|
88
|
+
],
|
|
89
|
+
"reporters": [
|
|
90
|
+
"default",
|
|
91
|
+
[
|
|
92
|
+
"jest-junit",
|
|
93
|
+
{
|
|
94
|
+
"outputDirectory": "test-reports"
|
|
95
|
+
}
|
|
96
|
+
]
|
|
97
|
+
],
|
|
98
|
+
"transform": {
|
|
99
|
+
"^.+\\.[t]sx?$": [
|
|
100
|
+
"ts-jest",
|
|
101
|
+
{
|
|
102
|
+
"tsconfig": "tsconfig.dev.json"
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
},
|
|
106
|
+
"moduleNameMapper": {
|
|
107
|
+
"^uuid$": "<rootDir>/../../jest-uuid-stub.js"
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"types": "lib/index.d.ts",
|
|
111
|
+
"//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm dlx projen\".",
|
|
112
|
+
"scripts": {
|
|
113
|
+
"build": "pnpm dlx projen build",
|
|
114
|
+
"compile": "pnpm dlx projen compile",
|
|
115
|
+
"default": "pnpm dlx projen default",
|
|
116
|
+
"eslint": "pnpm dlx projen eslint",
|
|
117
|
+
"package": "pnpm dlx projen package",
|
|
118
|
+
"post-compile": "pnpm dlx projen post-compile",
|
|
119
|
+
"pre-compile": "pnpm dlx projen pre-compile",
|
|
120
|
+
"test": "pnpm dlx projen test",
|
|
121
|
+
"test:watch": "pnpm dlx projen test:watch",
|
|
122
|
+
"watch": "pnpm dlx projen watch",
|
|
123
|
+
"projen": "pnpm dlx projen"
|
|
124
|
+
}
|
|
125
|
+
}
|