@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.
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvcmV0cnktc3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUV0Qyx5REFBMEQ7QUFFMUQsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBWSxFQUFDLGVBQWUsQ0FBQyxDQUFDO0FBWTdDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBYSx1QkFBdUI7SUFHTDtJQUZyQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXJCLFlBQTZCLE1BQW1CO1FBQW5CLFdBQU0sR0FBTixNQUFNLENBQWE7SUFBRyxDQUFDO0lBRXBEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUksU0FBMkI7UUFDMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFFbEIsT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO2dCQUNELE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFaEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxXQUFXLENBQUMsQ0FBQztvQkFDdkUsTUFB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QUM7Q0FDRjtBQWxIRCwwREFrSEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ1JldHJ5U3RyYXRlZ3knKTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBjb25uZWN0aW9uIHJldHJ5IHN0cmF0ZWd5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlDb25maWcge1xuICAvKiogTWF4aW11bSBudW1iZXIgb2YgcmV0cnkgYXR0ZW1wdHMgKi9cbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICAvKiogQmFzZSBkZWxheSBiZXR3ZWVuIHJldHJpZXMgaW4gbWlsbGlzZWNvbmRzICovXG4gIGJhc2VEZWxheTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgZXhwb25lbnRpYWwgYmFja29mZiByZXRyeSBzdHJhdGVneSBmb3IgZGF0YWJhc2UgY29ubmVjdGlvbnMuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIEV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aCBjb25maWd1cmFibGUgYmFzZSBkZWxheVxuICogLSBBdHRlbXB0IHRyYWNraW5nIGFuZCBsb2dnaW5nXG4gKiAtIEdyYWNlZnVsIGZhaWx1cmUgYWZ0ZXIgbWF4IHJldHJpZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3RyYXRlZ3kgPSBuZXcgQ29ubmVjdGlvblJldHJ5U3RyYXRlZ3koeyBtYXhSZXRyaWVzOiAzLCBiYXNlRGVsYXk6IDEwMDAgfSk7XG4gKlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RyYXRlZ3kuZXhlY3V0ZShhc3luYyAoKSA9PiB7XG4gKiAgIHJldHVybiBhd2FpdCBkYi5xdWVyeSgnU0VMRUNUIDEnKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uUmV0cnlTdHJhdGVneSB7XG4gIHByaXZhdGUgYXR0ZW1wdHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBSZXRyeUNvbmZpZykge31cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYW4gb3BlcmF0aW9uIHdpdGggcmV0cnkgbG9naWNcbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2l0aCByZXRyaWVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIG9wZXJhdGlvbiByZXN1bHRcbiAgICogQHRocm93cyBFcnJvciBpZiBhbGwgcmV0cnkgYXR0ZW1wdHMgZmFpbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZTxUPihvcGVyYXRpb246ICgpID0+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
+ }