@freshguard/freshguard-core 0.13.2 → 0.15.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/CHANGELOG.md +15 -1
- package/README.md +74 -1
- package/SKILL.md +229 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +74 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/connectors/azure-sql.d.ts +121 -0
- package/dist/connectors/azure-sql.d.ts.map +1 -0
- package/dist/connectors/azure-sql.js +489 -0
- package/dist/connectors/azure-sql.js.map +1 -0
- package/dist/connectors/base-connector.d.ts +139 -0
- package/dist/connectors/base-connector.d.ts.map +1 -1
- package/dist/connectors/base-connector.js +160 -3
- package/dist/connectors/base-connector.js.map +1 -1
- package/dist/connectors/bigquery.d.ts +100 -0
- package/dist/connectors/bigquery.d.ts.map +1 -1
- package/dist/connectors/bigquery.js +143 -2
- package/dist/connectors/bigquery.js.map +1 -1
- package/dist/connectors/duckdb.d.ts +96 -0
- package/dist/connectors/duckdb.d.ts.map +1 -1
- package/dist/connectors/duckdb.js +144 -7
- package/dist/connectors/duckdb.js.map +1 -1
- package/dist/connectors/index.d.ts +28 -0
- package/dist/connectors/index.d.ts.map +1 -1
- package/dist/connectors/index.js +28 -0
- package/dist/connectors/index.js.map +1 -1
- package/dist/connectors/mssql.d.ts +119 -0
- package/dist/connectors/mssql.d.ts.map +1 -0
- package/dist/connectors/mssql.js +483 -0
- package/dist/connectors/mssql.js.map +1 -0
- package/dist/connectors/mysql.d.ts +85 -0
- package/dist/connectors/mysql.d.ts.map +1 -1
- package/dist/connectors/mysql.js +118 -3
- package/dist/connectors/mysql.js.map +1 -1
- package/dist/connectors/postgres.d.ts +85 -0
- package/dist/connectors/postgres.d.ts.map +1 -1
- package/dist/connectors/postgres.js +113 -6
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/redshift.d.ts +90 -0
- package/dist/connectors/redshift.d.ts.map +1 -1
- package/dist/connectors/redshift.js +131 -7
- package/dist/connectors/redshift.js.map +1 -1
- package/dist/connectors/snowflake.d.ts +108 -0
- package/dist/connectors/snowflake.d.ts.map +1 -1
- package/dist/connectors/snowflake.js +137 -3
- package/dist/connectors/snowflake.js.map +1 -1
- package/dist/connectors/synapse.d.ts +123 -0
- package/dist/connectors/synapse.d.ts.map +1 -0
- package/dist/connectors/synapse.js +495 -0
- package/dist/connectors/synapse.js.map +1 -0
- package/dist/db/index.d.ts +25 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +23 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrate.d.ts +23 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +38 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.d.ts +11 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +70 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/errors/debug-factory.d.ts +38 -0
- package/dist/errors/debug-factory.d.ts.map +1 -1
- package/dist/errors/debug-factory.js +40 -0
- package/dist/errors/debug-factory.js.map +1 -1
- package/dist/errors/index.d.ts +59 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +110 -7
- package/dist/errors/index.js.map +1 -1
- package/dist/index.d.ts +32 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata/duckdb-storage.d.ts +3 -0
- package/dist/metadata/duckdb-storage.d.ts.map +1 -1
- package/dist/metadata/duckdb-storage.js +6 -0
- package/dist/metadata/duckdb-storage.js.map +1 -1
- package/dist/metadata/factory.d.ts +30 -0
- package/dist/metadata/factory.d.ts.map +1 -1
- package/dist/metadata/factory.js +31 -0
- package/dist/metadata/factory.js.map +1 -1
- package/dist/metadata/index.d.ts +26 -0
- package/dist/metadata/index.d.ts.map +1 -1
- package/dist/metadata/index.js +26 -0
- package/dist/metadata/index.js.map +1 -1
- package/dist/metadata/interface.d.ts +33 -0
- package/dist/metadata/interface.d.ts.map +1 -1
- package/dist/metadata/interface.js +3 -0
- package/dist/metadata/interface.js.map +1 -1
- package/dist/metadata/postgresql-storage.d.ts +3 -0
- package/dist/metadata/postgresql-storage.d.ts.map +1 -1
- package/dist/metadata/postgresql-storage.js +12 -2
- package/dist/metadata/postgresql-storage.js.map +1 -1
- package/dist/metadata/schema-config.d.ts +53 -0
- package/dist/metadata/schema-config.d.ts.map +1 -1
- package/dist/metadata/schema-config.js +64 -0
- package/dist/metadata/schema-config.js.map +1 -1
- package/dist/metadata/types.d.ts +3 -0
- package/dist/metadata/types.d.ts.map +1 -1
- package/dist/metadata/types.js +3 -0
- package/dist/metadata/types.js.map +1 -1
- package/dist/monitor/baseline-calculator.d.ts +56 -0
- package/dist/monitor/baseline-calculator.d.ts.map +1 -1
- package/dist/monitor/baseline-calculator.js +72 -0
- package/dist/monitor/baseline-calculator.js.map +1 -1
- package/dist/monitor/baseline-config.d.ts +77 -0
- package/dist/monitor/baseline-config.d.ts.map +1 -1
- package/dist/monitor/baseline-config.js +79 -1
- package/dist/monitor/baseline-config.js.map +1 -1
- package/dist/monitor/freshness.d.ts +40 -0
- package/dist/monitor/freshness.d.ts.map +1 -1
- package/dist/monitor/freshness.js +82 -3
- package/dist/monitor/freshness.js.map +1 -1
- package/dist/monitor/index.d.ts +29 -0
- package/dist/monitor/index.d.ts.map +1 -1
- package/dist/monitor/index.js +29 -0
- package/dist/monitor/index.js.map +1 -1
- package/dist/monitor/schema-baseline.d.ts +45 -0
- package/dist/monitor/schema-baseline.d.ts.map +1 -1
- package/dist/monitor/schema-baseline.js +63 -5
- package/dist/monitor/schema-baseline.js.map +1 -1
- package/dist/monitor/schema-changes.d.ts +45 -0
- package/dist/monitor/schema-changes.d.ts.map +1 -1
- package/dist/monitor/schema-changes.js +85 -0
- package/dist/monitor/schema-changes.js.map +1 -1
- package/dist/monitor/volume.d.ts +43 -0
- package/dist/monitor/volume.d.ts.map +1 -1
- package/dist/monitor/volume.js +89 -0
- package/dist/monitor/volume.js.map +1 -1
- package/dist/observability/logger.d.ts +91 -0
- package/dist/observability/logger.d.ts.map +1 -1
- package/dist/observability/logger.js +108 -0
- package/dist/observability/logger.js.map +1 -1
- package/dist/observability/metrics.d.ts +140 -0
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +184 -7
- package/dist/observability/metrics.js.map +1 -1
- package/dist/resilience/circuit-breaker.d.ts +112 -2
- package/dist/resilience/circuit-breaker.d.ts.map +1 -1
- package/dist/resilience/circuit-breaker.js +140 -6
- package/dist/resilience/circuit-breaker.js.map +1 -1
- package/dist/resilience/index.d.ts +9 -0
- package/dist/resilience/index.d.ts.map +1 -1
- package/dist/resilience/index.js +13 -0
- package/dist/resilience/index.js.map +1 -1
- package/dist/resilience/retry-policy.d.ts +105 -0
- package/dist/resilience/retry-policy.d.ts.map +1 -1
- package/dist/resilience/retry-policy.js +158 -7
- package/dist/resilience/retry-policy.js.map +1 -1
- package/dist/resilience/timeout-manager.d.ts +137 -0
- package/dist/resilience/timeout-manager.d.ts.map +1 -1
- package/dist/resilience/timeout-manager.js +151 -4
- package/dist/resilience/timeout-manager.js.map +1 -1
- package/dist/security/query-analyzer.d.ts +124 -0
- package/dist/security/query-analyzer.d.ts.map +1 -1
- package/dist/security/query-analyzer.js +150 -9
- package/dist/security/query-analyzer.js.map +1 -1
- package/dist/security/schema-cache.d.ts +152 -0
- package/dist/security/schema-cache.d.ts.map +1 -1
- package/dist/security/schema-cache.js +144 -12
- package/dist/security/schema-cache.js.map +1 -1
- package/dist/types/connector.d.ts +68 -1
- package/dist/types/connector.d.ts.map +1 -1
- package/dist/types/connector.js +38 -15
- package/dist/types/connector.js.map +1 -1
- package/dist/types/driver-results.d.ts +28 -0
- package/dist/types/driver-results.d.ts.map +1 -1
- package/dist/types/driver-results.js +12 -0
- package/dist/types/driver-results.js.map +1 -1
- package/dist/types.d.ts +113 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/dist/validation/index.d.ts +8 -0
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +12 -0
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/runtime-validator.d.ts +98 -0
- package/dist/validation/runtime-validator.d.ts.map +1 -1
- package/dist/validation/runtime-validator.js +114 -1
- package/dist/validation/runtime-validator.js.map +1 -1
- package/dist/validation/sanitizers.d.ts +59 -0
- package/dist/validation/sanitizers.d.ts.map +1 -1
- package/dist/validation/sanitizers.js +104 -20
- package/dist/validation/sanitizers.js.map +1 -1
- package/dist/validation/schemas.d.ts +73 -0
- package/dist/validation/schemas.d.ts.map +1 -1
- package/dist/validation/schemas.js +132 -5
- package/dist/validation/schemas.js.map +1 -1
- package/dist/validators/index.d.ts +54 -0
- package/dist/validators/index.d.ts.map +1 -1
- package/dist/validators/index.js +93 -2
- package/dist/validators/index.js.map +1 -1
- package/package.json +6 -2
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DuckDB implementation of metadata storage for self-hosting
|
|
3
|
+
*/
|
|
1
4
|
import { DuckDBInstance } from '@duckdb/node-api';
|
|
2
5
|
export class DuckDBMetadataStorage {
|
|
3
6
|
dbPath;
|
|
@@ -11,6 +14,7 @@ export class DuckDBMetadataStorage {
|
|
|
11
14
|
return;
|
|
12
15
|
this.instance = await DuckDBInstance.create(this.dbPath);
|
|
13
16
|
this.connection = await this.instance.connect();
|
|
17
|
+
// Create tables if they don't exist
|
|
14
18
|
await this.connection.run(`
|
|
15
19
|
CREATE TABLE IF NOT EXISTS check_executions (
|
|
16
20
|
rule_id TEXT NOT NULL,
|
|
@@ -131,6 +135,7 @@ export class DuckDBMetadataStorage {
|
|
|
131
135
|
async saveRule(rule) {
|
|
132
136
|
if (!this.connection)
|
|
133
137
|
throw new Error('DuckDB storage not initialized');
|
|
138
|
+
// For now, just store minimal fields to satisfy the interface
|
|
134
139
|
await this.connection.run(`
|
|
135
140
|
INSERT OR REPLACE INTO monitoring_rules (
|
|
136
141
|
id, source_id, name, table_name, rule_type, check_interval_minutes,
|
|
@@ -176,6 +181,7 @@ export class DuckDBMetadataStorage {
|
|
|
176
181
|
async storeSchemaBaseline(baseline, adaptationReason) {
|
|
177
182
|
if (!this.connection)
|
|
178
183
|
throw new Error('DuckDB storage not initialized');
|
|
184
|
+
// Use INSERT OR REPLACE to handle updates
|
|
179
185
|
await this.connection.run(`
|
|
180
186
|
INSERT OR REPLACE INTO schema_baselines (
|
|
181
187
|
rule_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-storage.js","sourceRoot":"","sources":["../../src/metadata/duckdb-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duckdb-storage.js","sourceRoot":"","sources":["../../src/metadata/duckdb-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating metadata storage instances
|
|
3
|
+
*/
|
|
1
4
|
import type { MetadataStorage } from './interface.js';
|
|
2
5
|
import type { MetadataStorageConfig } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create and initialize a metadata storage instance.
|
|
8
|
+
*
|
|
9
|
+
* Defaults to embedded DuckDB when called without arguments (zero-setup).
|
|
10
|
+
* Pass a config object to use PostgreSQL or customize the DuckDB path.
|
|
11
|
+
*
|
|
12
|
+
* @param config - Optional storage configuration. Omit for default DuckDB storage.
|
|
13
|
+
* @returns Initialized MetadataStorage ready for use
|
|
14
|
+
* @throws {Error} If `type` is `'postgresql'` and `url` is not provided
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Zero-setup DuckDB (default)
|
|
19
|
+
* const storage = await createMetadataStorage();
|
|
20
|
+
*
|
|
21
|
+
* // Custom DuckDB path
|
|
22
|
+
* const storage = await createMetadataStorage({ type: 'duckdb', path: './data/meta.db' });
|
|
23
|
+
*
|
|
24
|
+
* // PostgreSQL
|
|
25
|
+
* const storage = await createMetadataStorage({
|
|
26
|
+
* type: 'postgresql',
|
|
27
|
+
* url: 'postgresql://user:pass@host:5432/freshguard_metadata',
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @since 0.6.0
|
|
32
|
+
*/
|
|
3
33
|
export declare function createMetadataStorage(config?: MetadataStorageConfig): Promise<MetadataStorage>;
|
|
4
34
|
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/metadata/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/metadata/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAIxD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAoB1B"}
|
package/dist/metadata/factory.js
CHANGED
|
@@ -1,8 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory for creating metadata storage instances
|
|
3
|
+
*/
|
|
1
4
|
import { DuckDBMetadataStorage } from './duckdb-storage.js';
|
|
2
5
|
import { PostgreSQLMetadataStorage } from './postgresql-storage.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create and initialize a metadata storage instance.
|
|
8
|
+
*
|
|
9
|
+
* Defaults to embedded DuckDB when called without arguments (zero-setup).
|
|
10
|
+
* Pass a config object to use PostgreSQL or customize the DuckDB path.
|
|
11
|
+
*
|
|
12
|
+
* @param config - Optional storage configuration. Omit for default DuckDB storage.
|
|
13
|
+
* @returns Initialized MetadataStorage ready for use
|
|
14
|
+
* @throws {Error} If `type` is `'postgresql'` and `url` is not provided
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Zero-setup DuckDB (default)
|
|
19
|
+
* const storage = await createMetadataStorage();
|
|
20
|
+
*
|
|
21
|
+
* // Custom DuckDB path
|
|
22
|
+
* const storage = await createMetadataStorage({ type: 'duckdb', path: './data/meta.db' });
|
|
23
|
+
*
|
|
24
|
+
* // PostgreSQL
|
|
25
|
+
* const storage = await createMetadataStorage({
|
|
26
|
+
* type: 'postgresql',
|
|
27
|
+
* url: 'postgresql://user:pass@host:5432/freshguard_metadata',
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @since 0.6.0
|
|
32
|
+
*/
|
|
3
33
|
export async function createMetadataStorage(config) {
|
|
4
34
|
let storage;
|
|
5
35
|
if (!config) {
|
|
36
|
+
// Default to DuckDB for simplicity
|
|
6
37
|
storage = new DuckDBMetadataStorage();
|
|
7
38
|
}
|
|
8
39
|
else if (config.type === 'duckdb') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/metadata/factory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/metadata/factory.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAA8B;IAE9B,IAAI,OAAwB,CAAC;IAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,mCAAmC;QACnC,OAAO,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACxC,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,GAAG,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;SAAM,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,IAAI,yBAAyB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,MAAM,gBAAgB,GAAU,MAAM,CAAC,IAAI,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,yBAAyB,gBAA0B,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/metadata/index.d.ts
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata storage for persisting check execution history
|
|
3
|
+
*
|
|
4
|
+
* FreshGuard uses a metadata store to record every check execution so that
|
|
5
|
+
* volume-anomaly baselines and historical trends are available across runs.
|
|
6
|
+
*
|
|
7
|
+
* Use the {@link createMetadataStorage} factory to create an instance:
|
|
8
|
+
* - **DuckDB** (default, zero-setup) — embedded file or `:memory:`
|
|
9
|
+
* - **PostgreSQL** — shared metadata across multiple workers
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { createMetadataStorage } from '@freshguard/freshguard-core';
|
|
14
|
+
*
|
|
15
|
+
* // Zero-setup embedded DuckDB (default)
|
|
16
|
+
* const storage = await createMetadataStorage();
|
|
17
|
+
*
|
|
18
|
+
* // PostgreSQL for shared deployments
|
|
19
|
+
* const pgStorage = await createMetadataStorage({
|
|
20
|
+
* type: 'postgresql',
|
|
21
|
+
* url: process.env.METADATA_DATABASE_URL!,
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @module @freshguard/freshguard-core/metadata
|
|
26
|
+
*/
|
|
1
27
|
export type { MetadataStorage } from './interface.js';
|
|
2
28
|
export type { MetadataCheckExecution, MetadataMonitoringRule, MetadataStorageConfig } from './types.js';
|
|
3
29
|
export { createMetadataStorage } from './factory.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxG,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/metadata/index.js
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata storage for persisting check execution history
|
|
3
|
+
*
|
|
4
|
+
* FreshGuard uses a metadata store to record every check execution so that
|
|
5
|
+
* volume-anomaly baselines and historical trends are available across runs.
|
|
6
|
+
*
|
|
7
|
+
* Use the {@link createMetadataStorage} factory to create an instance:
|
|
8
|
+
* - **DuckDB** (default, zero-setup) — embedded file or `:memory:`
|
|
9
|
+
* - **PostgreSQL** — shared metadata across multiple workers
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { createMetadataStorage } from '@freshguard/freshguard-core';
|
|
14
|
+
*
|
|
15
|
+
* // Zero-setup embedded DuckDB (default)
|
|
16
|
+
* const storage = await createMetadataStorage();
|
|
17
|
+
*
|
|
18
|
+
* // PostgreSQL for shared deployments
|
|
19
|
+
* const pgStorage = await createMetadataStorage({
|
|
20
|
+
* type: 'postgresql',
|
|
21
|
+
* url: process.env.METADATA_DATABASE_URL!,
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @module @freshguard/freshguard-core/metadata
|
|
26
|
+
*/
|
|
1
27
|
export { createMetadataStorage } from './factory.js';
|
|
2
28
|
export { DuckDBMetadataStorage } from './duckdb-storage.js';
|
|
3
29
|
export { PostgreSQLMetadataStorage } from './postgresql-storage.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/metadata/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core metadata storage abstraction interface
|
|
3
|
+
*/
|
|
1
4
|
import type { MonitoringRule, SchemaBaseline } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Simplified execution record for metadata storage
|
|
7
|
+
*/
|
|
2
8
|
interface MetadataExecution {
|
|
3
9
|
ruleId: string;
|
|
4
10
|
status: 'ok' | 'alert' | 'failed' | 'pending';
|
|
@@ -13,13 +19,40 @@ interface MetadataExecution {
|
|
|
13
19
|
error?: string;
|
|
14
20
|
}
|
|
15
21
|
export interface MetadataStorage {
|
|
22
|
+
/**
|
|
23
|
+
* Save execution result for historical analysis
|
|
24
|
+
*/
|
|
16
25
|
saveExecution(execution: MetadataExecution): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Get historical execution data for anomaly detection baseline
|
|
28
|
+
* @param ruleId The monitoring rule ID
|
|
29
|
+
* @param days Number of days to look back
|
|
30
|
+
* @returns Array of execution records
|
|
31
|
+
*/
|
|
17
32
|
getHistoricalData(ruleId: string, days: number): Promise<MetadataExecution[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Save monitoring rule configuration
|
|
35
|
+
*/
|
|
18
36
|
saveRule(rule: MonitoringRule): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get monitoring rule by ID
|
|
39
|
+
*/
|
|
19
40
|
getRule(ruleId: string): Promise<MonitoringRule | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Store schema baseline for comparison
|
|
43
|
+
*/
|
|
20
44
|
storeSchemaBaseline(baseline: SchemaBaseline, adaptationReason?: string): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Get schema baseline for a rule
|
|
47
|
+
*/
|
|
21
48
|
getSchemaBaseline(ruleId: string): Promise<SchemaBaseline | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Initialize storage (create tables, etc.)
|
|
51
|
+
*/
|
|
22
52
|
initialize(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Close storage connections
|
|
55
|
+
*/
|
|
23
56
|
close(): Promise<void>;
|
|
24
57
|
}
|
|
25
58
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/metadata/interface.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/metadata/interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElE;;GAEG;AACH,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;;;OAKG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE9E;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAExD;;OAEG;IACH,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExF;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAElE;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/metadata/interface.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/metadata/interface.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL implementation of metadata storage using existing Drizzle schema
|
|
3
|
+
*/
|
|
1
4
|
import type { MetadataStorage } from './interface.js';
|
|
2
5
|
import type { MetadataStorageConfig } from './types.js';
|
|
3
6
|
import type { SchemaBaseline, MonitoringRule } from '../types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-storage.d.ts","sourceRoot":"","sources":["../../src/metadata/postgresql-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"postgresql-storage.d.ts","sourceRoot":"","sources":["../../src/metadata/postgresql-storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlE,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,IAAI,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,qBAAa,yBAA0B,YAAW,eAAe;IAO7D,OAAO,CAAC,QAAQ,CAAC,aAAa;IANhC,OAAO,CAAC,MAAM,CAAC,CAAe;IAC9B,OAAO,CAAC,EAAE,CAAC,CAA6B;gBAKrB,aAAa,EAAE,MAAM,EACtC,cAAc,CAAC,EAAE,qBAAqB;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,aAAa,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB1D,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAiD7E,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC7C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA4CvD,mBAAmB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvF,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAyCjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL implementation of metadata storage using existing Drizzle schema
|
|
3
|
+
*/
|
|
1
4
|
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
2
5
|
import { sql, and, desc, gt } from 'drizzle-orm';
|
|
3
6
|
import postgres from 'postgres';
|
|
@@ -8,8 +11,13 @@ export class PostgreSQLMetadataStorage {
|
|
|
8
11
|
connectionUrl;
|
|
9
12
|
client;
|
|
10
13
|
db;
|
|
14
|
+
// Schema configuration for future use with custom table names
|
|
15
|
+
// private _schemaConfig: ResolvedSchemaConfig;
|
|
11
16
|
constructor(connectionUrl, metadataConfig) {
|
|
12
17
|
this.connectionUrl = connectionUrl;
|
|
18
|
+
// Resolve schema configuration with defaults (for validation)
|
|
19
|
+
// Schema configuration validation happens in constructor but isn't used yet
|
|
20
|
+
// TODO: Implement custom table names using resolved configuration
|
|
13
21
|
if (metadataConfig?.schema) {
|
|
14
22
|
new SchemaConfigResolver(metadataConfig);
|
|
15
23
|
}
|
|
@@ -20,6 +28,7 @@ export class PostgreSQLMetadataStorage {
|
|
|
20
28
|
try {
|
|
21
29
|
this.client = postgres(this.connectionUrl);
|
|
22
30
|
this.db = drizzle(this.client);
|
|
31
|
+
// Test connection by attempting a simple query
|
|
23
32
|
await this.db.execute(sql `SELECT 1`);
|
|
24
33
|
}
|
|
25
34
|
catch (error) {
|
|
@@ -34,7 +43,7 @@ export class PostgreSQLMetadataStorage {
|
|
|
34
43
|
try {
|
|
35
44
|
await this.db.insert(checkExecutions).values({
|
|
36
45
|
ruleId: execution.ruleId,
|
|
37
|
-
sourceId: execution.ruleId,
|
|
46
|
+
sourceId: execution.ruleId, // Use ruleId as sourceId for simplicity
|
|
38
47
|
status: execution.status,
|
|
39
48
|
rowCount: execution.rowCount,
|
|
40
49
|
lagMinutes: execution.lagMinutes,
|
|
@@ -169,6 +178,7 @@ export class PostgreSQLMetadataStorage {
|
|
|
169
178
|
throw MetadataStorageError.initializationFailed('Database not initialized');
|
|
170
179
|
}
|
|
171
180
|
try {
|
|
181
|
+
// Use Drizzle with ON CONFLICT to handle updates
|
|
172
182
|
await this.db
|
|
173
183
|
.insert(schemaBaselines)
|
|
174
184
|
.values({
|
|
@@ -221,7 +231,7 @@ export class PostgreSQLMetadataStorage {
|
|
|
221
231
|
return {
|
|
222
232
|
ruleId: row.ruleId,
|
|
223
233
|
tableName: row.tableName,
|
|
224
|
-
schema: row.schema,
|
|
234
|
+
schema: row.schema, // JSONB column
|
|
225
235
|
schemaHash: row.schemaHash,
|
|
226
236
|
capturedAt: row.capturedAt,
|
|
227
237
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgresql-storage.js","sourceRoot":"","sources":["../../src/metadata/postgresql-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"postgresql-storage.js","sourceRoot":"","sources":["../../src/metadata/postgresql-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema configuration resolver for PostgreSQL metadata storage
|
|
3
|
+
*
|
|
4
|
+
* Provides configuration resolution with sensible defaults,
|
|
5
|
+
* table prefix application, and qualified table name generation.
|
|
6
|
+
*
|
|
7
|
+
* @license MIT
|
|
8
|
+
*/
|
|
1
9
|
import type { MetadataStorageConfig } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Resolved schema configuration with applied defaults
|
|
12
|
+
*/
|
|
2
13
|
export interface ResolvedSchemaConfig {
|
|
3
14
|
schemaName: string;
|
|
4
15
|
tablePrefix: string;
|
|
@@ -11,20 +22,62 @@ export interface ResolvedSchemaConfig {
|
|
|
11
22
|
monitoringRules: string;
|
|
12
23
|
};
|
|
13
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* Schema configuration resolver
|
|
27
|
+
*
|
|
28
|
+
* Resolves metadata storage configuration with defaults and validates parameters.
|
|
29
|
+
* Provides qualified table names for PostgreSQL operations.
|
|
30
|
+
*/
|
|
14
31
|
export declare class SchemaConfigResolver {
|
|
15
32
|
private readonly config;
|
|
16
33
|
constructor(metadataConfig: MetadataStorageConfig);
|
|
34
|
+
/**
|
|
35
|
+
* Get resolved configuration
|
|
36
|
+
*/
|
|
17
37
|
getConfig(): ResolvedSchemaConfig;
|
|
38
|
+
/**
|
|
39
|
+
* Get qualified table name (schema.prefix_tableName)
|
|
40
|
+
*/
|
|
18
41
|
getQualifiedTableName(baseTableName: keyof ResolvedSchemaConfig['tables']): string;
|
|
42
|
+
/**
|
|
43
|
+
* Get schema name
|
|
44
|
+
*/
|
|
19
45
|
getSchemaName(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get table prefix
|
|
48
|
+
*/
|
|
20
49
|
getTablePrefix(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Get table name with prefix applied
|
|
52
|
+
*/
|
|
21
53
|
getTableName(baseTableName: keyof ResolvedSchemaConfig['tables']): string;
|
|
54
|
+
/**
|
|
55
|
+
* Resolve configuration with defaults
|
|
56
|
+
*/
|
|
22
57
|
private resolveConfiguration;
|
|
58
|
+
/**
|
|
59
|
+
* Apply table prefix to table name
|
|
60
|
+
*/
|
|
23
61
|
private applyTablePrefix;
|
|
62
|
+
/**
|
|
63
|
+
* Create qualified table name (schema.table)
|
|
64
|
+
*/
|
|
24
65
|
private createQualifiedName;
|
|
66
|
+
/**
|
|
67
|
+
* Validate configuration parameters
|
|
68
|
+
*/
|
|
25
69
|
private validateConfiguration;
|
|
70
|
+
/**
|
|
71
|
+
* Check if identifier is valid for PostgreSQL
|
|
72
|
+
*/
|
|
26
73
|
private isValidIdentifier;
|
|
74
|
+
/**
|
|
75
|
+
* Check if table prefix is valid
|
|
76
|
+
*/
|
|
27
77
|
private isValidTablePrefix;
|
|
78
|
+
/**
|
|
79
|
+
* Check if identifier is a PostgreSQL reserved keyword
|
|
80
|
+
*/
|
|
28
81
|
private isReservedKeyword;
|
|
29
82
|
}
|
|
30
83
|
//# sourceMappingURL=schema-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-config.d.ts","sourceRoot":"","sources":["../../src/metadata/schema-config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema-config.d.ts","sourceRoot":"","sources":["../../src/metadata/schema-config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,cAAc,EAAE;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;gBAElC,cAAc,EAAE,qBAAqB;IAKjD;;OAEG;IACH,SAAS,IAAI,oBAAoB;IAIjC;;OAEG;IACH,qBAAqB,CAAC,aAAa,EAAE,MAAM,oBAAoB,CAAC,QAAQ,CAAC,GAAG,MAAM;IAIlF;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,oBAAoB,CAAC,QAAQ,CAAC,GAAG,MAAM;IAIzE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiC5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAY1B"}
|
|
@@ -1,33 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema configuration resolver for PostgreSQL metadata storage
|
|
3
|
+
*
|
|
4
|
+
* Provides configuration resolution with sensible defaults,
|
|
5
|
+
* table prefix application, and qualified table name generation.
|
|
6
|
+
*
|
|
7
|
+
* @license MIT
|
|
8
|
+
*/
|
|
1
9
|
import { ConfigurationError } from '../errors/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Schema configuration resolver
|
|
12
|
+
*
|
|
13
|
+
* Resolves metadata storage configuration with defaults and validates parameters.
|
|
14
|
+
* Provides qualified table names for PostgreSQL operations.
|
|
15
|
+
*/
|
|
2
16
|
export class SchemaConfigResolver {
|
|
3
17
|
config;
|
|
4
18
|
constructor(metadataConfig) {
|
|
5
19
|
this.config = this.resolveConfiguration(metadataConfig);
|
|
6
20
|
this.validateConfiguration();
|
|
7
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Get resolved configuration
|
|
24
|
+
*/
|
|
8
25
|
getConfig() {
|
|
9
26
|
return this.config;
|
|
10
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Get qualified table name (schema.prefix_tableName)
|
|
30
|
+
*/
|
|
11
31
|
getQualifiedTableName(baseTableName) {
|
|
12
32
|
return this.config.qualifiedNames[baseTableName];
|
|
13
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Get schema name
|
|
36
|
+
*/
|
|
14
37
|
getSchemaName() {
|
|
15
38
|
return this.config.schemaName;
|
|
16
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Get table prefix
|
|
42
|
+
*/
|
|
17
43
|
getTablePrefix() {
|
|
18
44
|
return this.config.tablePrefix;
|
|
19
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Get table name with prefix applied
|
|
48
|
+
*/
|
|
20
49
|
getTableName(baseTableName) {
|
|
21
50
|
return this.config.tables[baseTableName];
|
|
22
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Resolve configuration with defaults
|
|
54
|
+
*/
|
|
23
55
|
resolveConfiguration(metadataConfig) {
|
|
24
56
|
const schemaConfig = metadataConfig.schema ?? {};
|
|
57
|
+
// Apply defaults
|
|
25
58
|
const schemaName = schemaConfig.name ?? 'public';
|
|
26
59
|
const tablePrefix = schemaConfig.tablePrefix ?? '';
|
|
60
|
+
// Apply table prefix to base table names
|
|
27
61
|
const tables = {
|
|
28
62
|
checkExecutions: this.applyTablePrefix(schemaConfig.tables?.checkExecutions ?? 'checkExecutions', tablePrefix),
|
|
29
63
|
monitoringRules: this.applyTablePrefix(schemaConfig.tables?.monitoringRules ?? 'monitoringRules', tablePrefix),
|
|
30
64
|
};
|
|
65
|
+
// Create qualified names (schema.tableName)
|
|
31
66
|
const qualifiedNames = {
|
|
32
67
|
checkExecutions: this.createQualifiedName(schemaName, tables.checkExecutions),
|
|
33
68
|
monitoringRules: this.createQualifiedName(schemaName, tables.monitoringRules),
|
|
@@ -39,48 +74,77 @@ export class SchemaConfigResolver {
|
|
|
39
74
|
qualifiedNames,
|
|
40
75
|
};
|
|
41
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Apply table prefix to table name
|
|
79
|
+
*/
|
|
42
80
|
applyTablePrefix(tableName, prefix) {
|
|
43
81
|
if (!prefix)
|
|
44
82
|
return tableName;
|
|
83
|
+
// Only add prefix if not already present
|
|
45
84
|
if (tableName.startsWith(prefix)) {
|
|
46
85
|
return tableName;
|
|
47
86
|
}
|
|
48
87
|
return `${prefix}${tableName}`;
|
|
49
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Create qualified table name (schema.table)
|
|
91
|
+
*/
|
|
50
92
|
createQualifiedName(schemaName, tableName) {
|
|
93
|
+
// For public schema, we can omit it in many contexts, but always include for consistency
|
|
51
94
|
return `${schemaName}.${tableName}`;
|
|
52
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Validate configuration parameters
|
|
98
|
+
*/
|
|
53
99
|
validateConfiguration() {
|
|
100
|
+
// Validate schema name
|
|
54
101
|
if (!this.isValidIdentifier(this.config.schemaName)) {
|
|
55
102
|
throw ConfigurationError.invalidValue('schema.name', this.config.schemaName, 'valid PostgreSQL schema name');
|
|
56
103
|
}
|
|
104
|
+
// Validate table prefix
|
|
57
105
|
if (this.config.tablePrefix && !this.isValidTablePrefix(this.config.tablePrefix)) {
|
|
58
106
|
throw ConfigurationError.invalidValue('schema.tablePrefix', this.config.tablePrefix, 'valid PostgreSQL table prefix');
|
|
59
107
|
}
|
|
108
|
+
// Validate table names
|
|
60
109
|
Object.entries(this.config.tables).forEach(([key, tableName]) => {
|
|
61
110
|
if (!this.isValidIdentifier(tableName)) {
|
|
62
111
|
throw ConfigurationError.invalidValue(`schema.tables.${key}`, tableName, 'valid PostgreSQL table name');
|
|
63
112
|
}
|
|
64
113
|
});
|
|
65
114
|
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if identifier is valid for PostgreSQL
|
|
117
|
+
*/
|
|
66
118
|
isValidIdentifier(identifier) {
|
|
67
119
|
if (!identifier || typeof identifier !== 'string') {
|
|
68
120
|
return false;
|
|
69
121
|
}
|
|
122
|
+
// PostgreSQL identifier rules:
|
|
123
|
+
// - Start with letter or underscore
|
|
124
|
+
// - Contain only letters, digits, underscores
|
|
125
|
+
// - Max 63 characters
|
|
70
126
|
const identifierPattern = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
71
127
|
return (identifier.length <= 63 &&
|
|
72
128
|
identifierPattern.test(identifier) &&
|
|
73
129
|
!this.isReservedKeyword(identifier.toLowerCase()));
|
|
74
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Check if table prefix is valid
|
|
133
|
+
*/
|
|
75
134
|
isValidTablePrefix(prefix) {
|
|
76
135
|
if (!prefix || typeof prefix !== 'string') {
|
|
77
136
|
return false;
|
|
78
137
|
}
|
|
138
|
+
// Table prefix should be alphanumeric with underscores, max 20 chars
|
|
79
139
|
const prefixPattern = /^[a-zA-Z0-9_]*$/;
|
|
80
140
|
return (prefix.length <= 20 &&
|
|
81
141
|
prefixPattern.test(prefix));
|
|
82
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Check if identifier is a PostgreSQL reserved keyword
|
|
145
|
+
*/
|
|
83
146
|
isReservedKeyword(identifier) {
|
|
147
|
+
// Common PostgreSQL reserved keywords that would cause issues
|
|
84
148
|
const reservedKeywords = new Set([
|
|
85
149
|
'select', 'from', 'where', 'insert', 'update', 'delete', 'create', 'drop',
|
|
86
150
|
'table', 'index', 'view', 'user', 'group', 'order', 'by', 'limit',
|