forge-sql-orm 2.1.13 → 2.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +550 -21
  2. package/dist/core/ForgeSQLORM.d.ts +45 -8
  3. package/dist/core/ForgeSQLORM.d.ts.map +1 -1
  4. package/dist/core/ForgeSQLORM.js +134 -15
  5. package/dist/core/ForgeSQLORM.js.map +1 -1
  6. package/dist/core/ForgeSQLQueryBuilder.d.ts +192 -5
  7. package/dist/core/ForgeSQLQueryBuilder.d.ts.map +1 -1
  8. package/dist/core/ForgeSQLQueryBuilder.js.map +1 -1
  9. package/dist/core/Rovo.d.ts +116 -0
  10. package/dist/core/Rovo.d.ts.map +1 -0
  11. package/dist/core/Rovo.js +647 -0
  12. package/dist/core/Rovo.js.map +1 -0
  13. package/dist/utils/forgeDriver.d.ts +3 -2
  14. package/dist/utils/forgeDriver.d.ts.map +1 -1
  15. package/dist/utils/forgeDriver.js +20 -16
  16. package/dist/utils/forgeDriver.js.map +1 -1
  17. package/dist/utils/metadataContextUtils.d.ts +27 -1
  18. package/dist/utils/metadataContextUtils.d.ts.map +1 -1
  19. package/dist/utils/metadataContextUtils.js +215 -12
  20. package/dist/utils/metadataContextUtils.js.map +1 -1
  21. package/dist/webtriggers/index.d.ts +1 -0
  22. package/dist/webtriggers/index.d.ts.map +1 -1
  23. package/dist/webtriggers/index.js +1 -0
  24. package/dist/webtriggers/index.js.map +1 -1
  25. package/dist/webtriggers/topSlowestStatementLastHourTrigger.d.ts +60 -0
  26. package/dist/webtriggers/topSlowestStatementLastHourTrigger.d.ts.map +1 -0
  27. package/dist/webtriggers/topSlowestStatementLastHourTrigger.js +55 -0
  28. package/dist/webtriggers/topSlowestStatementLastHourTrigger.js.map +1 -0
  29. package/package.json +13 -11
  30. package/src/core/ForgeSQLORM.ts +142 -14
  31. package/src/core/ForgeSQLQueryBuilder.ts +213 -4
  32. package/src/core/Rovo.ts +765 -0
  33. package/src/utils/forgeDriver.ts +34 -19
  34. package/src/utils/metadataContextUtils.ts +267 -12
  35. package/src/webtriggers/index.ts +1 -0
  36. package/src/webtriggers/topSlowestStatementLastHourTrigger.ts +69 -0
@@ -50,9 +50,10 @@ export declare function isUpdateQueryResponse(obj: unknown): obj is UpdateQueryR
50
50
  /**
51
51
  * Main Forge SQL driver function for Drizzle ORM integration.
52
52
  * Handles DDL operations, execute operations (UPDATE/INSERT/DELETE), and select operations.
53
+ * Automatically saves query execution metadata to the context for performance monitoring.
53
54
  *
54
55
  * @param query - The SQL query to execute
55
- * @param params - Query parameters
56
+ * @param params - Query parameters (may be undefined or empty array)
56
57
  * @param method - Execution method ("all" for SELECT, "execute" for UPDATE/INSERT/DELETE)
57
58
  * @returns Promise with query results compatible with Drizzle ORM
58
59
  *
@@ -70,5 +71,5 @@ export declare function isUpdateQueryResponse(obj: unknown): obj is UpdateQueryR
70
71
  * await forgeDriver("UPDATE users SET name = ? WHERE id = ?", ["John", 1], "execute");
71
72
  * ```
72
73
  */
73
- export declare const forgeDriver: (query: string, params: unknown[], method: QueryMethod) => Promise<ForgeDriverResult>;
74
+ export declare const forgeDriver: (query: string, params: unknown[] | undefined, method: QueryMethod) => Promise<ForgeDriverResult>;
74
75
  //# sourceMappingURL=forgeDriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"forgeDriver.d.ts","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQtD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,mBAAmB,CAO9E;AA6FD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EACb,QAAQ,OAAO,EAAE,EACjB,QAAQ,WAAW,KAClB,OAAO,CAAC,iBAAiB,CAmB3B,CAAC"}
1
+ {"version":3,"file":"forgeDriver.d.ts","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAQtD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,EAAE,CAAC;CACL,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1D,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,SAAS,CAAC;AAE5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,mBAAmB,CAO9E;AA2GD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EACb,QAAQ,OAAO,EAAE,GAAG,SAAS,EAC7B,QAAQ,WAAW,KAClB,OAAO,CAAC,iBAAiB,CAmB3B,CAAC"}
@@ -32,14 +32,17 @@ function inlineParams(sql, params) {
32
32
  });
33
33
  }
34
34
  /**
35
- * Processes DDL query results and saves metadata.
35
+ * Processes DDL query results and saves metadata to the execution context.
36
36
  *
37
+ * @param query - The SQL query string
38
+ * @param params - Query parameters
39
+ * @param method - Execution method ("all" or "execute")
37
40
  * @param result - The DDL query result
38
41
  * @returns Processed result for Drizzle ORM
39
42
  */
40
- async function processDDLResult(method, result) {
43
+ async function processDDLResult(query, params, method, result) {
41
44
  if (result.metadata) {
42
- await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
45
+ await (0, metadataContextUtils_1.saveMetaDataToContext)(query, params, result.metadata);
43
46
  }
44
47
  if (!result?.rows) {
45
48
  return { rows: [] };
@@ -60,10 +63,10 @@ async function processDDLResult(method, result) {
60
63
  return { rows: [] };
61
64
  }
62
65
  /**
63
- * Processes execute method results (UPDATE, INSERT, DELETE).
66
+ * Processes execute method results (UPDATE, INSERT, DELETE) and saves metadata to the execution context.
64
67
  *
65
- * @param query - The SQL query
66
- * @param params - Query parameters
68
+ * @param query - The SQL query string
69
+ * @param params - Query parameters (may be undefined)
67
70
  * @returns Processed result for Drizzle ORM
68
71
  */
69
72
  async function processExecuteMethod(query, params) {
@@ -72,17 +75,17 @@ async function processExecuteMethod(query, params) {
72
75
  sqlStatement.bindParams(...params);
73
76
  }
74
77
  const result = await (0, sqlUtils_1.withTimeout)(sqlStatement.execute(), timeoutMessage, timeoutMs);
75
- await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
78
+ await (0, metadataContextUtils_1.saveMetaDataToContext)(query, params ?? [], result.metadata);
76
79
  if (!result.rows) {
77
80
  return { rows: [[]] };
78
81
  }
79
82
  return { rows: [result.rows] };
80
83
  }
81
84
  /**
82
- * Processes all method results (SELECT queries).
85
+ * Processes all method results (SELECT queries) and saves metadata to the execution context.
83
86
  *
84
- * @param query - The SQL query
85
- * @param params - Query parameters
87
+ * @param query - The SQL query string
88
+ * @param params - Query parameters (may be undefined)
86
89
  * @returns Processed result for Drizzle ORM
87
90
  */
88
91
  async function processAllMethod(query, params) {
@@ -91,7 +94,7 @@ async function processAllMethod(query, params) {
91
94
  await sqlStatement.bindParams(...params);
92
95
  }
93
96
  const result = await (0, sqlUtils_1.withTimeout)(sqlStatement.execute(), timeoutMessage, timeoutMs);
94
- await (0, metadataContextUtils_1.saveMetaDataToContext)(result.metadata);
97
+ await (0, metadataContextUtils_1.saveMetaDataToContext)(query, params ?? [], result.metadata);
95
98
  if (!result.rows) {
96
99
  return { rows: [] };
97
100
  }
@@ -101,9 +104,10 @@ async function processAllMethod(query, params) {
101
104
  /**
102
105
  * Main Forge SQL driver function for Drizzle ORM integration.
103
106
  * Handles DDL operations, execute operations (UPDATE/INSERT/DELETE), and select operations.
107
+ * Automatically saves query execution metadata to the context for performance monitoring.
104
108
  *
105
109
  * @param query - The SQL query to execute
106
- * @param params - Query parameters
110
+ * @param params - Query parameters (may be undefined or empty array)
107
111
  * @param method - Execution method ("all" for SELECT, "execute" for UPDATE/INSERT/DELETE)
108
112
  * @returns Promise with query results compatible with Drizzle ORM
109
113
  *
@@ -125,15 +129,15 @@ const forgeDriver = async (query, params, method) => {
125
129
  const operationType = await (0, requestTypeContextUtils_1.getOperationType)();
126
130
  // Handle DDL operations
127
131
  if (operationType === "DDL") {
128
- const result = await (0, sqlUtils_1.withTimeout)(sql_1.sql.executeDDL(inlineParams(query, params)), timeoutMessage, timeoutMs);
129
- return await processDDLResult(method, result);
132
+ const result = await (0, sqlUtils_1.withTimeout)(sql_1.sql.executeDDL(inlineParams(query, params ?? [])), timeoutMessage, timeoutMs);
133
+ return await processDDLResult(query, params ?? [], method, result);
130
134
  }
131
135
  // Handle execute method (UPDATE, INSERT, DELETE)
132
136
  if (method === "execute") {
133
- return await processExecuteMethod(query, params ?? []);
137
+ return await processExecuteMethod(query, params);
134
138
  }
135
139
  // Handle all method (SELECT)
136
- return await processAllMethod(query, params ?? []);
140
+ return await processAllMethod(query, params);
137
141
  };
138
142
  exports.forgeDriver = forgeDriver;
139
143
  //# sourceMappingURL=forgeDriver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forgeDriver.js","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forgeDriver.js","sourceRoot":"","sources":["../../src/utils/forgeDriver.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,40 @@
1
1
  import { AsyncLocalStorage } from "node:async_hooks";
2
2
  import { ForgeSQLMetadata } from "./forgeDriver";
3
3
  import { ForgeSqlOperation } from "../core/ForgeSQLQueryBuilder";
4
+ type Statistic = {
5
+ query: string;
6
+ params: unknown[];
7
+ metadata: ForgeSQLMetadata;
8
+ };
9
+ export type QueryPlanMode = "TopSlowest" | "SummaryTable";
10
+ export type MetadataQueryOptions = {
11
+ mode?: QueryPlanMode;
12
+ summaryTableWindowTime?: number;
13
+ topQueries?: number;
14
+ showSlowestPlans?: boolean;
15
+ normalizeQuery?: boolean;
16
+ };
4
17
  export type MetadataQueryContext = {
5
18
  totalDbExecutionTime: number;
6
19
  totalResponseSize: number;
7
20
  beginTime: Date;
21
+ options?: MetadataQueryOptions;
22
+ statistics: Statistic[];
8
23
  printQueriesWithPlan: () => Promise<void>;
9
24
  forgeSQLORM: ForgeSqlOperation;
10
25
  };
11
26
  export declare const metadataQueryContext: AsyncLocalStorage<MetadataQueryContext>;
12
- export declare function saveMetaDataToContext(metadata?: ForgeSQLMetadata): Promise<void>;
27
+ /**
28
+ * Saves query metadata to the current context and sets up the printQueriesWithPlan function.
29
+ * @param stringQuery - The SQL query string
30
+ * @param params - Query parameters
31
+ * @param metadata - Query execution metadata
32
+ */
33
+ export declare function saveMetaDataToContext(stringQuery: string, params: unknown[], metadata: ForgeSQLMetadata): Promise<void>;
34
+ /**
35
+ * Gets the latest metadata from the current context.
36
+ * @returns The current metadata context or undefined if not in a context
37
+ */
13
38
  export declare function getLastestMetadata(): Promise<MetadataQueryContext | undefined>;
39
+ export {};
14
40
  //# sourceMappingURL=metadataContextUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metadataContextUtils.d.ts","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,MAAM,oBAAoB,GAAG;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AACF,eAAO,MAAM,oBAAoB,yCAAgD,CAAC;AAElF,wBAAsB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAetF;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAEpF"}
1
+ {"version":3,"file":"metadataContextUtils.d.ts","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAOjE,KAAK,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAElF,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAC;AAE1D,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,oBAAoB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,oBAAoB,yCAAgD,CAAC;AA2MlF;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,EAAE,EACjB,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAoCf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAEpF"}
@@ -5,23 +5,226 @@ exports.saveMetaDataToContext = saveMetaDataToContext;
5
5
  exports.getLastestMetadata = getLastestMetadata;
6
6
  const node_async_hooks_1 = require("node:async_hooks");
7
7
  const sqlUtils_1 = require("./sqlUtils");
8
+ const node_sql_parser_1 = require("node-sql-parser");
9
+ const DEFAULT_WINDOW_SIZE = 15 * 1000;
8
10
  exports.metadataQueryContext = new node_async_hooks_1.AsyncLocalStorage();
9
- async function saveMetaDataToContext(metadata) {
11
+ /**
12
+ * Creates default options for metadata query context.
13
+ * @returns Default options object
14
+ */
15
+ function createDefaultOptions() {
16
+ return {
17
+ mode: "TopSlowest",
18
+ topQueries: 1,
19
+ summaryTableWindowTime: DEFAULT_WINDOW_SIZE,
20
+ showSlowestPlans: true,
21
+ normalizeQuery: true,
22
+ };
23
+ }
24
+ /**
25
+ * Merges provided options with defaults, using defaults only for undefined fields.
26
+ * @param options - Optional partial options to merge
27
+ * @returns Complete options object with all fields set
28
+ */
29
+ function mergeOptionsWithDefaults(options) {
30
+ const defaults = createDefaultOptions();
31
+ return {
32
+ mode: options?.mode ?? defaults.mode,
33
+ topQueries: options?.topQueries ?? defaults.topQueries,
34
+ summaryTableWindowTime: options?.summaryTableWindowTime ?? defaults.summaryTableWindowTime,
35
+ showSlowestPlans: options?.showSlowestPlans ?? defaults.showSlowestPlans,
36
+ normalizeQuery: options?.normalizeQuery ?? defaults.normalizeQuery,
37
+ };
38
+ }
39
+ /**
40
+ * Normalizes SQL query using regex fallback by replacing parameter values with placeholders.
41
+ * Replaces string literals, numeric values, and boolean values with '?' for logging.
42
+ *
43
+ * Note: This is a fallback function used when node-sql-parser fails.
44
+ * It uses simple, safe regex patterns to avoid ReDoS (Regular Expression Denial of Service) vulnerabilities.
45
+ * For proper handling of escaped quotes and complex SQL, use the main normalizeSqlForLogging function
46
+ * which uses node-sql-parser.
47
+ *
48
+ * @param sql - SQL query string to normalize
49
+ * @returns Normalized SQL string with parameters replaced by '?'
50
+ */
51
+ function normalizeSqlForLoggingRegex(sql) {
52
+ let normalized = sql;
53
+ // Replace string literals (single quotes) - using simple greedy match
54
+ // This avoids catastrophic backtracking by using a simple [^']* pattern
55
+ // Note: This does not handle SQL-style escaped quotes (doubled quotes: '')
56
+ // For proper handling, use the main normalizeSqlForLogging function with node-sql-parser
57
+ normalized = normalized.replace(/'[^']*'/g, "?");
58
+ // Replace string literals (double quotes) - using simple greedy match
59
+ // Same safety considerations as above
60
+ normalized = normalized.replace(/"[^"]*"/g, "?");
61
+ // Replace numeric literals - simplified pattern to avoid backtracking
62
+ // Match: optional minus, digits, optional decimal point and more digits
63
+ // Using word boundaries (\b) for safety - avoids complex lookahead/lookbehind
64
+ normalized = normalized.replace(/\b-?\d+\.?\d*\b/g, "?");
65
+ // Replace boolean literals - safe pattern with word boundaries
66
+ // Simple alternation with word boundaries - no nested quantifiers
67
+ normalized = normalized.replace(/\b(true|false)\b/gi, "?");
68
+ // Replace NULL values (but be careful not to replace in identifiers)
69
+ // Simple word boundary match - safe from backtracking
70
+ normalized = normalized.replace(/\bNULL\b/gi, "?");
71
+ return normalized;
72
+ }
73
+ /**
74
+ * Normalizes SQL query by replacing parameter values with placeholders.
75
+ * First attempts to use node-sql-parser for structure normalization, then applies regex for value replacement.
76
+ * Falls back to regex-based normalization if parsing fails.
77
+ * @param sql - SQL query string to normalize
78
+ * @returns Normalized SQL string with parameters replaced by '?'
79
+ */
80
+ function normalizeSqlForLogging(sql) {
81
+ try {
82
+ const parser = new node_sql_parser_1.Parser();
83
+ const ast = parser.astify(sql.trim());
84
+ // Convert AST back to SQL (this normalizes structure and formatting)
85
+ const normalized = parser.sqlify(Array.isArray(ast) ? ast[0] : ast);
86
+ // Apply regex-based value replacement to the normalized SQL
87
+ // This handles the case where sqlify might preserve some literal values
88
+ let result = normalizeSqlForLoggingRegex(normalized.trim());
89
+ // Remove backticks added by sqlify for cleaner logging (optional - can be removed if backticks are preferred)
90
+ result = result.replace(/`/g, "");
91
+ return result;
92
+ //eslint-disable-next-line @typescript-eslint/no-unused-vars
93
+ }
94
+ catch (e) {
95
+ // If parsing fails, fall back to regex-based normalization
96
+ return normalizeSqlForLoggingRegex(sql);
97
+ }
98
+ }
99
+ /**
100
+ * Formats an execution plan array into a readable string representation.
101
+ * @param planRows - Array of ExplainAnalyzeRow objects representing the execution plan
102
+ * @returns Formatted string representation of the execution plan
103
+ */
104
+ function formatExplainPlan(planRows) {
105
+ if (!planRows || planRows.length === 0) {
106
+ return "No execution plan available";
107
+ }
108
+ const lines = [];
109
+ for (const row of planRows) {
110
+ const parts = [];
111
+ if (row.id)
112
+ parts.push(row.id);
113
+ if (row.task)
114
+ parts.push(`task:${row.task}`);
115
+ if (row.operatorInfo)
116
+ parts.push(row.operatorInfo);
117
+ const rowInfo = [];
118
+ if (row.estRows)
119
+ rowInfo.push(`estRows:${row.estRows}`);
120
+ if (row.actRows)
121
+ rowInfo.push(`actRows:${row.actRows}`);
122
+ if (rowInfo.length > 0)
123
+ parts.push(`[${rowInfo.join(", ")}]`);
124
+ if (row.executionInfo)
125
+ parts.push(`execution info:${row.executionInfo}`);
126
+ const resourceInfo = [];
127
+ if (row.memory)
128
+ resourceInfo.push(`memory:${row.memory}`);
129
+ if (row.disk)
130
+ resourceInfo.push(`disk:${row.disk}`);
131
+ if (resourceInfo.length > 0)
132
+ parts.push(`(${resourceInfo.join(", ")})`);
133
+ if (row.accessObject)
134
+ parts.push(`access object:${row.accessObject}`);
135
+ lines.push(parts.join(" | "));
136
+ }
137
+ return lines.join("\n");
138
+ }
139
+ /**
140
+ * Prints query plans using summary tables if mode is SummaryTable and within time window.
141
+ * @param context - The metadata query context
142
+ * @param options - The merged options with defaults
143
+ * @returns Promise that resolves when plans are printed
144
+ */
145
+ async function printPlansUsingSummaryTables(context, options) {
146
+ const timeDiff = Date.now() - context.beginTime.getTime();
147
+ if (options.mode !== "SummaryTable") {
148
+ return false;
149
+ }
150
+ if (timeDiff <= options.summaryTableWindowTime) {
151
+ await new Promise((resolve) => setTimeout(resolve, 200));
152
+ const summaryTableDiffMs = Date.now() - context.beginTime.getTime();
153
+ await (0, sqlUtils_1.printQueriesWithPlan)(context.forgeSQLORM, summaryTableDiffMs);
154
+ return true;
155
+ }
156
+ // eslint-disable-next-line no-console
157
+ console.warn("Summary table window expired — showing query plans instead");
158
+ return false;
159
+ }
160
+ /**
161
+ * Prints query plans for the top slowest queries.
162
+ * @param context - The metadata query context
163
+ * @param options - The merged options with defaults
164
+ * @returns Promise that resolves when plans are printed
165
+ */
166
+ async function printTopQueriesPlans(context, options) {
167
+ const topQueries = context.statistics
168
+ .sort((a, b) => b.metadata.dbExecutionTime - a.metadata.dbExecutionTime)
169
+ .slice(0, options.topQueries);
170
+ for (const query of topQueries) {
171
+ const normalizedQuery = options.normalizeQuery
172
+ ? normalizeSqlForLogging(query.query)
173
+ : query.query;
174
+ if (options.showSlowestPlans) {
175
+ const explainAnalyzeRows = await context.forgeSQLORM
176
+ .analyze()
177
+ .explainAnalyzeRaw(query.query, query.params);
178
+ const formattedPlan = formatExplainPlan(explainAnalyzeRows);
179
+ // eslint-disable-next-line no-console
180
+ console.warn(`SQL: ${normalizedQuery} | Time: ${query.metadata.dbExecutionTime} ms\n Plan:\n${formattedPlan}`);
181
+ }
182
+ else {
183
+ // eslint-disable-next-line no-console
184
+ console.warn(`SQL: ${normalizedQuery} | Time: ${query.metadata.dbExecutionTime} ms`);
185
+ }
186
+ }
187
+ }
188
+ /**
189
+ * Saves query metadata to the current context and sets up the printQueriesWithPlan function.
190
+ * @param stringQuery - The SQL query string
191
+ * @param params - Query parameters
192
+ * @param metadata - Query execution metadata
193
+ */
194
+ async function saveMetaDataToContext(stringQuery, params, metadata) {
10
195
  const context = exports.metadataQueryContext.getStore();
11
- if (context) {
12
- context.printQueriesWithPlan = async () => {
13
- if (process.env.NODE_ENV !== "test") {
14
- await new Promise((r) => setTimeout(r, 200));
15
- }
16
- await (0, sqlUtils_1.printQueriesWithPlan)(context.forgeSQLORM, Date.now() - context.beginTime.getTime());
17
- };
18
- if (metadata) {
19
- context.totalResponseSize += metadata.responseSize;
20
- context.totalDbExecutionTime += metadata.dbExecutionTime;
196
+ if (!context) {
197
+ return;
198
+ }
199
+ // Initialize statistics array if needed
200
+ if (!context.statistics) {
201
+ context.statistics = [];
202
+ }
203
+ // Merge options with defaults
204
+ context.options = mergeOptionsWithDefaults(context.options);
205
+ // Add query statistics
206
+ context.statistics.push({ query: stringQuery, params, metadata });
207
+ // Set up printQueriesWithPlan function
208
+ context.printQueriesWithPlan = async () => {
209
+ const options = mergeOptionsWithDefaults(context.options);
210
+ // Try to use summary tables first if enabled
211
+ const usedSummaryTables = await printPlansUsingSummaryTables(context, options);
212
+ if (usedSummaryTables) {
213
+ return;
21
214
  }
22
- // Log the results to console
215
+ // Fall back to printing top queries plans
216
+ await printTopQueriesPlans(context, options);
217
+ };
218
+ // Update aggregated metrics
219
+ if (metadata) {
220
+ context.totalResponseSize += metadata.responseSize;
221
+ context.totalDbExecutionTime += metadata.dbExecutionTime;
23
222
  }
24
223
  }
224
+ /**
225
+ * Gets the latest metadata from the current context.
226
+ * @returns The current metadata context or undefined if not in a context
227
+ */
25
228
  async function getLastestMetadata() {
26
229
  return exports.metadataQueryContext.getStore();
27
230
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metadataContextUtils.js","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":";;;AAcA,sDAeC;AAED,gDAEC;AAjCD,uDAAqD;AAGrD,yCAAkD;AASrC,QAAA,oBAAoB,GAAG,IAAI,oCAAiB,EAAwB,CAAC;AAE3E,KAAK,UAAU,qBAAqB,CAAC,QAA2B;IACrE,MAAM,OAAO,GAAG,4BAAoB,CAAC,QAAQ,EAAE,CAAC;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,oBAAoB,GAAG,KAAK,IAAI,EAAE;YACxC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACpC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC;YACD,MAAM,IAAA,+BAAoB,EAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC;QACF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,iBAAiB,IAAI,QAAQ,CAAC,YAAY,CAAC;YACnD,OAAO,CAAC,oBAAoB,IAAI,QAAQ,CAAC,eAAe,CAAC;QAC3D,CAAC;QACD,6BAA6B;IAC/B,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB;IACtC,OAAO,4BAAoB,CAAC,QAAQ,EAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"metadataContextUtils.js","sourceRoot":"","sources":["../../src/utils/metadataContextUtils.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export * from "./fetchSchemaWebTrigger";
4
4
  export * from "./dropTablesMigrationWebTrigger";
5
5
  export * from "./clearCacheSchedulerTrigger";
6
6
  export * from "./slowQuerySchedulerTrigger";
7
+ export * from "./topSlowestStatementLastHourTrigger";
7
8
  export interface TriggerResponse<BODY> {
8
9
  body?: BODY;
9
10
  headers?: Record<string, string[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webtriggers/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAE5C,MAAM,WAAW,eAAe,CAAC,IAAI;IACnC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,GAAI,IAAI,EAAE,YAAY,MAAM,EAAE,MAAM,IAAI,KAAG,eAAe,CAAC,IAAI,CAc1F,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webtriggers/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sCAAsC,CAAC;AAErD,MAAM,WAAW,eAAe,CAAC,IAAI;IACnC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,GAAI,IAAI,EAAE,YAAY,MAAM,EAAE,MAAM,IAAI,KAAG,eAAe,CAAC,IAAI,CAc1F,CAAC"}
@@ -21,6 +21,7 @@ __exportStar(require("./fetchSchemaWebTrigger"), exports);
21
21
  __exportStar(require("./dropTablesMigrationWebTrigger"), exports);
22
22
  __exportStar(require("./clearCacheSchedulerTrigger"), exports);
23
23
  __exportStar(require("./slowQuerySchedulerTrigger"), exports);
24
+ __exportStar(require("./topSlowestStatementLastHourTrigger"), exports);
24
25
  const getHttpResponse = (statusCode, body) => {
25
26
  let statusText = "";
26
27
  if (statusCode === 200) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webtriggers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,8DAA4C;AAC5C,0DAAwC;AACxC,kEAAgD;AAChD,+DAA6C;AAC7C,8DAA4C;AASrC,MAAM,eAAe,GAAG,CAAO,UAAkB,EAAE,IAAU,EAAyB,EAAE;IAC7F,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,aAAa,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE;QACjD,UAAU;QACV,UAAU;QACV,IAAI;KACL,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,eAAe,mBAc1B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webtriggers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,8DAA4C;AAC5C,0DAAwC;AACxC,kEAAgD;AAChD,+DAA6C;AAC7C,8DAA4C;AAC5C,uEAAqD;AAS9C,MAAM,eAAe,GAAG,CAAO,UAAkB,EAAE,IAAU,EAAyB,EAAE;IAC7F,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACvB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,aAAa,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,kBAAkB,CAAC,EAAE;QACjD,UAAU;QACV,UAAU;QACV,IAAI;KACL,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,eAAe,mBAc1B"}
@@ -0,0 +1,60 @@
1
+ import { ForgeSqlOperation } from "../core/ForgeSQLQueryBuilder";
2
+ import { TriggerResponse } from "./";
3
+ import { OperationType } from "../utils/requestTypeContextUtils";
4
+ export interface TriggerOptions {
5
+ warnThresholdMs?: number;
6
+ memoryThresholdBytes?: number;
7
+ showPlan?: boolean;
8
+ operationType?: OperationType;
9
+ topN?: number;
10
+ hours?: number;
11
+ tables?: "SUMMARY_AND_HISTORY" | "CLUSTER_SUMMARY_AND_HISTORY";
12
+ }
13
+ /**
14
+ * @deprecated This function is deprecated and will be removed in a future version.
15
+ *
16
+ * This function was previously a complex implementation that directly queried
17
+ * CLUSTER_STATEMENTS_SUMMARY tables to analyze query performance. However, this approach
18
+ * had reliability issues with long-running functions where metadata could be evicted
19
+ * before the function completes.
20
+ *
21
+ * The recommended replacement is to use the new observability system with `executeWithMetadata`:
22
+ * - **TopSlowest mode** (default): Deterministic logging of SQL digests executed in resolvers
23
+ * - **SummaryTable mode** (optional): Uses CLUSTER_STATEMENTS_SUMMARY with a short memory window
24
+ * - Automatic fallback mechanisms for long-running functions
25
+ * - More reliable post-mortem diagnostics for Timeout and OOM errors
26
+ *
27
+ * Note: `slowQuerySchedulerTrigger` is a different function that analyzes TiDB's slow query log
28
+ * and is not a direct replacement for this function.
29
+ *
30
+ * For more details on the improvements and migration path, see:
31
+ * https://community.developer.atlassian.com/t/practical-sql-observability-for-forge-apps-with-forge-sql-orm/123456
32
+ *
33
+ * @param orm - ForgeSQL ORM instance
34
+ * @param options - Configuration options (currently passed to slowQuerySchedulerTrigger as a temporary wrapper)
35
+ * @returns Promise<TriggerResponse<string>> - HTTP response with query results or error
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * // Old usage (deprecated):
40
+ * await topSlowestStatementLastHourTrigger(forgeSQL, { hours: 1 });
41
+ *
42
+ * // New usage (recommended - use executeWithMetadata in your resolvers):
43
+ * await forgeSQL.executeWithMetadata(
44
+ * async () => {
45
+ * // your resolver logic
46
+ * },
47
+ * async (totalDbTime, totalResponseSize, printPlan) => {
48
+ * // custom observability logic
49
+ * if (totalDbTime > 1000) await printPlan();
50
+ * },
51
+ * {
52
+ * mode: "TopSlowest",
53
+ * topQueries: 1,
54
+ * showSlowestPlans: true
55
+ * }
56
+ * );
57
+ * ```
58
+ */
59
+ export declare const topSlowestStatementLastHourTrigger: (orm: ForgeSqlOperation, options?: TriggerOptions) => Promise<TriggerResponse<string>>;
60
+ //# sourceMappingURL=topSlowestStatementLastHourTrigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topSlowestStatementLastHourTrigger.d.ts","sourceRoot":"","sources":["../../src/webtriggers/topSlowestStatementLastHourTrigger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAA6B,eAAe,EAAE,MAAM,IAAI,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,qBAAqB,GAAG,6BAA6B,CAAC;CAChE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,eAAO,MAAM,kCAAkC,GAC7C,KAAK,iBAAiB,EACtB,UAAU,cAAc,KACvB,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAKjC,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.topSlowestStatementLastHourTrigger = void 0;
4
+ const _1 = require("./");
5
+ /**
6
+ * @deprecated This function is deprecated and will be removed in a future version.
7
+ *
8
+ * This function was previously a complex implementation that directly queried
9
+ * CLUSTER_STATEMENTS_SUMMARY tables to analyze query performance. However, this approach
10
+ * had reliability issues with long-running functions where metadata could be evicted
11
+ * before the function completes.
12
+ *
13
+ * The recommended replacement is to use the new observability system with `executeWithMetadata`:
14
+ * - **TopSlowest mode** (default): Deterministic logging of SQL digests executed in resolvers
15
+ * - **SummaryTable mode** (optional): Uses CLUSTER_STATEMENTS_SUMMARY with a short memory window
16
+ * - Automatic fallback mechanisms for long-running functions
17
+ * - More reliable post-mortem diagnostics for Timeout and OOM errors
18
+ *
19
+ * Note: `slowQuerySchedulerTrigger` is a different function that analyzes TiDB's slow query log
20
+ * and is not a direct replacement for this function.
21
+ *
22
+ * For more details on the improvements and migration path, see:
23
+ * https://community.developer.atlassian.com/t/practical-sql-observability-for-forge-apps-with-forge-sql-orm/123456
24
+ *
25
+ * @param orm - ForgeSQL ORM instance
26
+ * @param options - Configuration options (currently passed to slowQuerySchedulerTrigger as a temporary wrapper)
27
+ * @returns Promise<TriggerResponse<string>> - HTTP response with query results or error
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * // Old usage (deprecated):
32
+ * await topSlowestStatementLastHourTrigger(forgeSQL, { hours: 1 });
33
+ *
34
+ * // New usage (recommended - use executeWithMetadata in your resolvers):
35
+ * await forgeSQL.executeWithMetadata(
36
+ * async () => {
37
+ * // your resolver logic
38
+ * },
39
+ * async (totalDbTime, totalResponseSize, printPlan) => {
40
+ * // custom observability logic
41
+ * if (totalDbTime > 1000) await printPlan();
42
+ * },
43
+ * {
44
+ * mode: "TopSlowest",
45
+ * topQueries: 1,
46
+ * showSlowestPlans: true
47
+ * }
48
+ * );
49
+ * ```
50
+ */
51
+ const topSlowestStatementLastHourTrigger = async (orm, options) => {
52
+ return (0, _1.slowQuerySchedulerTrigger)(orm, options ? { timeout: 3000, hours: options.hours ?? 1 } : { timeout: 3000, hours: 1 });
53
+ };
54
+ exports.topSlowestStatementLastHourTrigger = topSlowestStatementLastHourTrigger;
55
+ //# sourceMappingURL=topSlowestStatementLastHourTrigger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topSlowestStatementLastHourTrigger.js","sourceRoot":"","sources":["../../src/webtriggers/topSlowestStatementLastHourTrigger.ts"],"names":[],"mappings":";;;AACA,yBAAgE;AAahE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACI,MAAM,kCAAkC,GAAG,KAAK,EACrD,GAAsB,EACtB,OAAwB,EACU,EAAE;IACpC,OAAO,IAAA,4BAAyB,EAC9B,GAAG,EACH,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CACrF,CAAC;AACJ,CAAC,CAAC;AARW,QAAA,kCAAkC,sCAQ7C"}