@memberjunction/sqlserver-dataprovider 5.4.1 → 5.6.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/README.md +13 -6
- package/dist/SQLServerDataProvider.d.ts +57 -478
- package/dist/SQLServerDataProvider.d.ts.map +1 -1
- package/dist/SQLServerDataProvider.js +269 -3312
- package/dist/SQLServerDataProvider.js.map +1 -1
- package/dist/SQLServerTransactionGroup.d.ts.map +1 -1
- package/dist/SQLServerTransactionGroup.js +5 -6
- package/dist/SQLServerTransactionGroup.js.map +1 -1
- package/dist/UserCache.js +2 -2
- package/dist/UserCache.js.map +1 -1
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +0 -81
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +14 -15
- package/dist/SqlLogger.d.ts +0 -70
- package/dist/SqlLogger.d.ts.map +0 -1
- package/dist/SqlLogger.js +0 -311
- package/dist/SqlLogger.js.map +0 -1
- package/dist/queryParameterProcessor.d.ts +0 -59
- package/dist/queryParameterProcessor.d.ts.map +0 -1
- package/dist/queryParameterProcessor.js +0 -208
- package/dist/queryParameterProcessor.js.map +0 -1
package/dist/UserCache.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LogError, Metadata, UserInfo } from "@memberjunction/core";
|
|
2
|
-
import { MJGlobal } from "@memberjunction/global";
|
|
2
|
+
import { MJGlobal, UUIDsEqual } from "@memberjunction/global";
|
|
3
3
|
import sql from 'mssql';
|
|
4
4
|
const SYSTEM_USER_ID = 'ecafccec-6a37-ef11-86d4-000d3a4e707e';
|
|
5
5
|
/**
|
|
@@ -48,7 +48,7 @@ export class UserCache {
|
|
|
48
48
|
const r = rResult.recordset;
|
|
49
49
|
if (u) {
|
|
50
50
|
this._users = u.map((user) => {
|
|
51
|
-
user.UserRoles = r.filter((role) => role.UserID
|
|
51
|
+
user.UserRoles = r.filter((role) => UUIDsEqual(role.UserID, user.ID));
|
|
52
52
|
const uI = new UserInfo(Metadata.Provider, user);
|
|
53
53
|
return uI;
|
|
54
54
|
});
|
package/dist/UserCache.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserCache.js","sourceRoot":"","sources":["../src/UserCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"UserCache.js","sourceRoot":"","sources":["../src/UserCache.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
export { setupSQLServerClient } from "./config.js";
|
|
2
2
|
export { SQLServerDataProvider } from "./SQLServerDataProvider.js";
|
|
3
|
-
export { ExecuteSQLOptions,
|
|
4
|
-
export { SqlLoggingSessionImpl } from "./SqlLogger.js";
|
|
3
|
+
export { ExecuteSQLOptions, SQLServerProviderConfigData, } from "./types.js";
|
|
5
4
|
export { UserCache } from "./UserCache.js";
|
|
6
|
-
export { QueryParameterProcessor } from "./queryParameterProcessor.js";
|
|
7
5
|
export { NodeFileSystemProvider } from "./NodeFileSystemProvider.js";
|
|
8
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
export { setupSQLServerClient } from "./config.js";
|
|
2
2
|
export { SQLServerDataProvider } from "./SQLServerDataProvider.js";
|
|
3
|
-
export { SQLServerProviderConfigData } from "./types.js";
|
|
4
|
-
export { SqlLoggingSessionImpl } from "./SqlLogger.js";
|
|
3
|
+
export { SQLServerProviderConfigData, } from "./types.js";
|
|
5
4
|
export { UserCache } from "./UserCache.js";
|
|
6
|
-
export { QueryParameterProcessor } from "./queryParameterProcessor.js";
|
|
7
5
|
export { NodeFileSystemProvider } from "./NodeFileSystemProvider.js";
|
|
8
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAEL,2BAA2B,GAC5B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -55,17 +55,6 @@ export interface InternalSQLOptions {
|
|
|
55
55
|
/** User context for logging */
|
|
56
56
|
contextUser?: UserInfo;
|
|
57
57
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Configuration options for batch SQL execution
|
|
60
|
-
*/
|
|
61
|
-
export interface ExecuteSQLBatchOptions {
|
|
62
|
-
/** Optional description for this batch operation */
|
|
63
|
-
description?: string;
|
|
64
|
-
/** If true, this batch will not be logged to any logging session */
|
|
65
|
-
ignoreLogging?: boolean;
|
|
66
|
-
/** Whether this batch contains data mutation operations */
|
|
67
|
-
isMutation?: boolean;
|
|
68
|
-
}
|
|
69
58
|
/**
|
|
70
59
|
* Configuration data specific to SQL Server provider
|
|
71
60
|
*/
|
|
@@ -84,74 +73,4 @@ export interface SQLServerProviderConfigOptions {
|
|
|
84
73
|
ConnectionPool: sql.ConnectionPool;
|
|
85
74
|
CheckRefreshIntervalSeconds: number;
|
|
86
75
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Configuration options for SQL logging sessions
|
|
89
|
-
*/
|
|
90
|
-
export interface SqlLoggingOptions {
|
|
91
|
-
/** Whether to format output as a flyway migration file with schema placeholders */
|
|
92
|
-
formatAsMigration?: boolean;
|
|
93
|
-
/**
|
|
94
|
-
* Optional default schema name to use for Flyway migrations for replacing schema names with
|
|
95
|
-
* the placeholder ${flyway:defaultSchema}
|
|
96
|
-
*/
|
|
97
|
-
defaultSchemaName?: string;
|
|
98
|
-
/** Optional description to include as a comment at the start of the log */
|
|
99
|
-
description?: string;
|
|
100
|
-
/** Which types of statements to log: 'queries' (all), 'mutations' (only data changes), 'both' (default) */
|
|
101
|
-
statementTypes?: 'queries' | 'mutations' | 'both';
|
|
102
|
-
/** Optional batch separator to emit after each statement (e.g., "GO" for SQL Server) */
|
|
103
|
-
batchSeparator?: string;
|
|
104
|
-
/** Whether to pretty print SQL statements with proper formatting */
|
|
105
|
-
prettyPrint?: boolean;
|
|
106
|
-
/** Whether to log record change metadata wrapper SQL (default: false). When false, only core spCreate/spUpdate/spDelete calls are logged */
|
|
107
|
-
logRecordChangeMetadata?: boolean;
|
|
108
|
-
/** Whether to retain log files that contain no SQL statements (default: false). When false, empty log files are automatically deleted on dispose */
|
|
109
|
-
retainEmptyLogFiles?: boolean;
|
|
110
|
-
/** Optional user ID to filter SQL logging - only log SQL executed by this user */
|
|
111
|
-
filterByUserId?: string;
|
|
112
|
-
/** Optional friendly name for this logging session (for UI display) */
|
|
113
|
-
sessionName?: string;
|
|
114
|
-
/** Whether to output verbose debug information to console (default: false) */
|
|
115
|
-
verboseOutput?: boolean;
|
|
116
|
-
/**
|
|
117
|
-
* Array of patterns to filter SQL statements.
|
|
118
|
-
* Supports both regex (RegExp objects) and simple wildcard patterns (strings).
|
|
119
|
-
* How these patterns are applied depends on filterType.
|
|
120
|
-
*
|
|
121
|
-
* String patterns support:
|
|
122
|
-
* - Simple wildcards: "*AIPrompt*", "spCreate*", "*Run"
|
|
123
|
-
* - Regex strings: "/spCreate.*Run/i", "/^SELECT.*FROM/i"
|
|
124
|
-
*
|
|
125
|
-
* RegExp examples:
|
|
126
|
-
* - /spCreateAIPromptRun/i - Match stored procedure calls
|
|
127
|
-
* - /^SELECT.*FROM.*vw.*Metadata/i - Match metadata view queries
|
|
128
|
-
* - /INSERT INTO EntityFieldValue/i - Match specific inserts
|
|
129
|
-
*/
|
|
130
|
-
filterPatterns?: (string | RegExp)[];
|
|
131
|
-
/**
|
|
132
|
-
* Determines how filterPatterns are applied:
|
|
133
|
-
* - 'exclude': If ANY pattern matches, the SQL is NOT logged (default)
|
|
134
|
-
* - 'include': If ANY pattern matches, the SQL IS logged
|
|
135
|
-
*
|
|
136
|
-
* Note: If filterPatterns is empty/undefined, all SQL is logged regardless of filterType.
|
|
137
|
-
*/
|
|
138
|
-
filterType?: 'include' | 'exclude';
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Interface for SQL logging session with disposable pattern
|
|
142
|
-
*/
|
|
143
|
-
export interface SqlLoggingSession {
|
|
144
|
-
/** Unique session ID */
|
|
145
|
-
readonly id: string;
|
|
146
|
-
/** File path where SQL is being logged */
|
|
147
|
-
readonly filePath: string;
|
|
148
|
-
/** Session start time */
|
|
149
|
-
readonly startTime: Date;
|
|
150
|
-
/** Number of statements logged so far */
|
|
151
|
-
readonly statementCount: number;
|
|
152
|
-
/** Configuration options for this session */
|
|
153
|
-
readonly options: SqlLoggingOptions;
|
|
154
|
-
/** Dispose method to stop logging and clean up resources */
|
|
155
|
-
dispose(): Promise<void>;
|
|
156
|
-
}
|
|
157
76
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2GAA2G;IAC3G,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACrC,qCAAqC;IACrC,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,OAAO,EACvB,UAAU,CAAC,EAAE,OAAO,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,WAAW,CAAC,EAAE,QAAQ,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,QAAQ,CAAC;CACxB;AAED;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,GAAG,MAAM,OAAO,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2GAA2G;IAC3G,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,WAAW,CAAC;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,IAAI,EAAE,GAAG,CAAC,cAAc,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACrC,qCAAqC;IACrC,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,GAAG,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,OAAO,EACvB,UAAU,CAAC,EAAE,OAAO,EACpB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,WAAW,CAAC,EAAE,QAAQ,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,4DAA4D;IAC5D,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+BAA+B;IAC/B,WAAW,CAAC,EAAE,QAAQ,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,2BAA4B,SAAQ,sBAAsB,CAAC,8BAA8B,CAAC;IACrG;;OAEG;IACH,IAAI,cAAc,IAAI,GAAG,CAAC,cAAc,CAEvC;IAED;;OAEG;IACH,IAAI,2BAA2B,IAAI,MAAM,CAExC;gBAGC,cAAc,EAAE,GAAG,CAAC,cAAc,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,2BAA2B,GAAE,MAAU,EACvC,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,cAAc,CAAC,EAAE,MAAM,EAAE,EACzB,sBAAsB,GAAE,OAAc;CAazC;AAED,MAAM,WAAW,8BAA8B;IAC7C,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC;IACnC,2BAA2B,EAAE,MAAM,CAAC;CACrC"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAY,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,sBAAsB,EAAY,MAAM,sBAAsB,CAAC;AA6DxE;;GAEG;AACH,MAAM,OAAO,2BAA4B,SAAQ,sBAAsD;IACrG;;OAEG;IACH,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,IAAI,2BAA2B;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC;IAC/C,CAAC;IAED,YACE,cAAkC,EAClC,gBAAyB,EACzB,8BAAsC,CAAC,CAAC,sCAAsC,EAC9E,cAAyB,EACzB,cAAyB,EACzB,yBAAkC,IAAI;QAEtC,KAAK,CACH;YACE,cAAc,EAAE,cAAc;YAC9B,2BAA2B,EAAE,2BAA2B;SACzD,EACD,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,sBAAsB,CACvB,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/sqlserver-dataprovider",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.6.0",
|
|
5
5
|
"description": "MemberJunction: SQL Server Client Data Provider",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -18,28 +18,27 @@
|
|
|
18
18
|
"author": "MemberJunction.com",
|
|
19
19
|
"license": "ISC",
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@types/nunjucks": "^3.2.6",
|
|
22
21
|
"@types/uuid": "^11.0.0",
|
|
23
22
|
"ts-node-dev": "^2.0.0",
|
|
24
23
|
"vitest": "^3.1.1",
|
|
25
24
|
"typescript": "^5.9.3"
|
|
26
25
|
},
|
|
27
26
|
"dependencies": {
|
|
28
|
-
"@memberjunction/actions": "5.
|
|
29
|
-
"@memberjunction/actions-base": "5.
|
|
30
|
-
"@memberjunction/ai": "5.
|
|
31
|
-
"@memberjunction/ai-provider-bundle": "5.
|
|
32
|
-
"@memberjunction/ai-vector-dupe": "5.
|
|
33
|
-
"@memberjunction/aiengine": "5.
|
|
34
|
-
"@memberjunction/core": "5.
|
|
35
|
-
"@memberjunction/core-entities": "5.
|
|
36
|
-
"@memberjunction/encryption": "5.
|
|
37
|
-
"@memberjunction/
|
|
38
|
-
"@memberjunction/
|
|
27
|
+
"@memberjunction/actions": "5.6.0",
|
|
28
|
+
"@memberjunction/actions-base": "5.6.0",
|
|
29
|
+
"@memberjunction/ai": "5.6.0",
|
|
30
|
+
"@memberjunction/ai-provider-bundle": "5.6.0",
|
|
31
|
+
"@memberjunction/ai-vector-dupe": "5.6.0",
|
|
32
|
+
"@memberjunction/aiengine": "5.6.0",
|
|
33
|
+
"@memberjunction/core": "5.6.0",
|
|
34
|
+
"@memberjunction/core-entities": "5.6.0",
|
|
35
|
+
"@memberjunction/encryption": "5.6.0",
|
|
36
|
+
"@memberjunction/generic-database-provider": "5.6.0",
|
|
37
|
+
"@memberjunction/global": "5.6.0",
|
|
38
|
+
"@memberjunction/query-processor": "5.6.0",
|
|
39
|
+
"@memberjunction/queue": "5.6.0",
|
|
39
40
|
"mssql": "^12.2.0",
|
|
40
|
-
"nunjucks": "^3.2.4",
|
|
41
41
|
"rxjs": "^7.8.2",
|
|
42
|
-
"sql-formatter": "^15.7.0",
|
|
43
42
|
"uuid": "^13.0.0"
|
|
44
43
|
},
|
|
45
44
|
"repository": {
|
package/dist/SqlLogger.d.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview SQL Logging Implementation for SQL Server Data Provider
|
|
3
|
-
*
|
|
4
|
-
* This module provides SQL statement logging functionality with file I/O,
|
|
5
|
-
* filtering, formatting, and session management capabilities.
|
|
6
|
-
*
|
|
7
|
-
* @module @memberjunction/sqlserver-dataprovider/SqlLogger
|
|
8
|
-
*/
|
|
9
|
-
import { SqlLoggingOptions, SqlLoggingSession } from './types.js';
|
|
10
|
-
/**
|
|
11
|
-
* Internal implementation of SqlLoggingSession that handles SQL statement logging to files.
|
|
12
|
-
* This class manages file I/O, SQL formatting, and filtering based on session options.
|
|
13
|
-
*
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
export declare class SqlLoggingSessionImpl implements SqlLoggingSession {
|
|
17
|
-
readonly id: string;
|
|
18
|
-
readonly filePath: string;
|
|
19
|
-
readonly startTime: Date;
|
|
20
|
-
readonly options: SqlLoggingOptions;
|
|
21
|
-
private _statementCount;
|
|
22
|
-
private _emittedStatementCount;
|
|
23
|
-
private _fileHandle;
|
|
24
|
-
private _disposed;
|
|
25
|
-
private _compiledPatterns;
|
|
26
|
-
constructor(id: string, filePath: string, options?: SqlLoggingOptions);
|
|
27
|
-
/**
|
|
28
|
-
* Gets the count of SQL statements actually written to the log file
|
|
29
|
-
* @returns The number of emitted statements (after filtering)
|
|
30
|
-
*/
|
|
31
|
-
get statementCount(): number;
|
|
32
|
-
/**
|
|
33
|
-
* Initializes the logging session by creating the log file and writing the header
|
|
34
|
-
* @throws Error if file creation fails
|
|
35
|
-
*/
|
|
36
|
-
initialize(): Promise<void>;
|
|
37
|
-
/**
|
|
38
|
-
* Logs a SQL statement to the file, applying filtering and formatting based on session options
|
|
39
|
-
*
|
|
40
|
-
* @param query - The SQL query to log
|
|
41
|
-
* @param parameters - Optional parameters for the query
|
|
42
|
-
* @param description - Optional description for this operation
|
|
43
|
-
* @param isMutation - Whether this is a data mutation operation
|
|
44
|
-
* @param simpleSQLFallback - Optional simple SQL to use if logRecordChangeMetadata=false
|
|
45
|
-
*/
|
|
46
|
-
logSqlStatement(query: string, parameters?: any, description?: string, isMutation?: boolean, simpleSQLFallback?: string): Promise<void>;
|
|
47
|
-
/**
|
|
48
|
-
* Disposes of the logging session, writes the footer, closes the file, and optionally deletes empty files
|
|
49
|
-
*/
|
|
50
|
-
dispose(): Promise<void>;
|
|
51
|
-
private _generateHeader;
|
|
52
|
-
private _generateFooter;
|
|
53
|
-
/**
|
|
54
|
-
* Format SQL using sql-formatter library with SQL Server dialect
|
|
55
|
-
*/
|
|
56
|
-
private _prettyPrintSql;
|
|
57
|
-
/**
|
|
58
|
-
* Post-process SQL to ensure BEGIN, END, and EXEC keywords are on their own lines
|
|
59
|
-
*/
|
|
60
|
-
private _postProcessBeginEnd;
|
|
61
|
-
/**
|
|
62
|
-
* Escapes ${...} patterns within SQL string literals to prevent Flyway from interpreting them as placeholders.
|
|
63
|
-
* Converts ${templateVariable} to $' + '{templateVariable} within string literals.
|
|
64
|
-
*
|
|
65
|
-
* @param sql - The SQL statement to process
|
|
66
|
-
* @returns The SQL with escaped template syntax within strings
|
|
67
|
-
*/
|
|
68
|
-
private _escapeFlywaySyntaxInStrings;
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=SqlLogger.d.ts.map
|
package/dist/SqlLogger.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SqlLogger.d.ts","sourceRoot":"","sources":["../src/SqlLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;GAKG;AACH,qBAAa,qBAAsB,YAAW,iBAAiB;IAC7D,SAAgB,EAAE,EAAE,MAAM,CAAC;IAC3B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,SAAS,EAAE,IAAI,CAAC;IAChC,SAAgB,OAAO,EAAE,iBAAiB,CAAC;IAC3C,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,sBAAsB,CAAa;IAC3C,OAAO,CAAC,WAAW,CAAuC;IAC1D,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,iBAAiB,CAAuB;gBAEpC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAYzE;;;OAGG;IACH,IAAW,cAAc,IAAI,MAAM,CAElC;IAED;;;OAGG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAaxC;;;;;;;;OAQG;IACU,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,GAAE,OAAe,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2J3J;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BrC,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,eAAe;IAavB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;CASrC"}
|
package/dist/SqlLogger.js
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview SQL Logging Implementation for SQL Server Data Provider
|
|
3
|
-
*
|
|
4
|
-
* This module provides SQL statement logging functionality with file I/O,
|
|
5
|
-
* filtering, formatting, and session management capabilities.
|
|
6
|
-
*
|
|
7
|
-
* @module @memberjunction/sqlserver-dataprovider/SqlLogger
|
|
8
|
-
*/
|
|
9
|
-
import * as fs from 'fs';
|
|
10
|
-
import * as path from 'path';
|
|
11
|
-
import { format as formatSql } from 'sql-formatter';
|
|
12
|
-
import { ensureRegExps } from '@memberjunction/global';
|
|
13
|
-
/**
|
|
14
|
-
* Internal implementation of SqlLoggingSession that handles SQL statement logging to files.
|
|
15
|
-
* This class manages file I/O, SQL formatting, and filtering based on session options.
|
|
16
|
-
*
|
|
17
|
-
* @internal
|
|
18
|
-
*/
|
|
19
|
-
export class SqlLoggingSessionImpl {
|
|
20
|
-
constructor(id, filePath, options = {}) {
|
|
21
|
-
this._statementCount = 0;
|
|
22
|
-
this._emittedStatementCount = 0; // Track actually emitted statements
|
|
23
|
-
this._fileHandle = null;
|
|
24
|
-
this._disposed = false;
|
|
25
|
-
this.id = id;
|
|
26
|
-
this.filePath = filePath;
|
|
27
|
-
this.startTime = new Date();
|
|
28
|
-
this.options = options;
|
|
29
|
-
// Compile patterns once during construction
|
|
30
|
-
if (options.filterPatterns && options.filterPatterns.length > 0) {
|
|
31
|
-
this._compiledPatterns = ensureRegExps(options.filterPatterns);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Gets the count of SQL statements actually written to the log file
|
|
36
|
-
* @returns The number of emitted statements (after filtering)
|
|
37
|
-
*/
|
|
38
|
-
get statementCount() {
|
|
39
|
-
return this._emittedStatementCount; // Return actually emitted statements
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Initializes the logging session by creating the log file and writing the header
|
|
43
|
-
* @throws Error if file creation fails
|
|
44
|
-
*/
|
|
45
|
-
async initialize() {
|
|
46
|
-
// Ensure directory exists
|
|
47
|
-
const dir = path.dirname(this.filePath);
|
|
48
|
-
await fs.promises.mkdir(dir, { recursive: true });
|
|
49
|
-
// Open file for writing
|
|
50
|
-
this._fileHandle = await fs.promises.open(this.filePath, 'w');
|
|
51
|
-
// Write header comment
|
|
52
|
-
const header = this._generateHeader();
|
|
53
|
-
await this._fileHandle.writeFile(header);
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Logs a SQL statement to the file, applying filtering and formatting based on session options
|
|
57
|
-
*
|
|
58
|
-
* @param query - The SQL query to log
|
|
59
|
-
* @param parameters - Optional parameters for the query
|
|
60
|
-
* @param description - Optional description for this operation
|
|
61
|
-
* @param isMutation - Whether this is a data mutation operation
|
|
62
|
-
* @param simpleSQLFallback - Optional simple SQL to use if logRecordChangeMetadata=false
|
|
63
|
-
*/
|
|
64
|
-
async logSqlStatement(query, parameters, description, isMutation = false, simpleSQLFallback) {
|
|
65
|
-
const verbose = this.options.verboseOutput === true;
|
|
66
|
-
if (verbose) {
|
|
67
|
-
console.log(`=== SESSION ${this.id} LOG ATTEMPT ===`);
|
|
68
|
-
console.log(`Session disposed: ${this._disposed}, File handle exists: ${!!this._fileHandle}`);
|
|
69
|
-
console.log(`Query (first 100 chars): ${query.substring(0, 100)}...`);
|
|
70
|
-
console.log(`isMutation: ${isMutation}, description: ${description || 'none'}`);
|
|
71
|
-
console.log(`Options:`, this.options);
|
|
72
|
-
}
|
|
73
|
-
if (this._disposed || !this._fileHandle) {
|
|
74
|
-
if (verbose) {
|
|
75
|
-
console.log(`Session ${this.id}: Skipping - disposed or no file handle`);
|
|
76
|
-
}
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
// Filter statements based on statementTypes option
|
|
80
|
-
const statementTypes = this.options.statementTypes || 'both';
|
|
81
|
-
if (verbose) {
|
|
82
|
-
console.log(`Session ${this.id}: Statement filter check - statementTypes: ${statementTypes}, isMutation: ${isMutation}`);
|
|
83
|
-
}
|
|
84
|
-
if (statementTypes === 'mutations' && !isMutation) {
|
|
85
|
-
if (verbose) {
|
|
86
|
-
console.log(`Session ${this.id}: Skipping - mutations only but this is not a mutation`);
|
|
87
|
-
}
|
|
88
|
-
return; // Skip logging non-mutation statements
|
|
89
|
-
}
|
|
90
|
-
if (statementTypes === 'queries' && isMutation) {
|
|
91
|
-
if (verbose) {
|
|
92
|
-
console.log(`Session ${this.id}: Skipping - queries only but this is a mutation`);
|
|
93
|
-
}
|
|
94
|
-
return; // Skip logging mutation statements
|
|
95
|
-
}
|
|
96
|
-
if (verbose) {
|
|
97
|
-
console.log(`Session ${this.id}: Statement passed type filters, proceeding to process`);
|
|
98
|
-
}
|
|
99
|
-
let logEntry = '';
|
|
100
|
-
// Add description comment if provided
|
|
101
|
-
if (description) {
|
|
102
|
-
logEntry += `-- ${description}\n`;
|
|
103
|
-
}
|
|
104
|
-
// Process the SQL statement
|
|
105
|
-
let processedQuery = query;
|
|
106
|
-
// Use simple SQL fallback if this session has logRecordChangeMetadata=false (default) and fallback is provided
|
|
107
|
-
if (this.options.logRecordChangeMetadata !== true && simpleSQLFallback) {
|
|
108
|
-
processedQuery = simpleSQLFallback;
|
|
109
|
-
// Update description to indicate we're using the simplified version
|
|
110
|
-
if (description && !description.includes('(core SP call only)')) {
|
|
111
|
-
logEntry = logEntry.replace(`-- ${description}\n`, `-- ${description} (core SP call only)\n`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
// Apply pattern filtering on the processed query
|
|
115
|
-
if (this._compiledPatterns && this._compiledPatterns.length > 0) {
|
|
116
|
-
const filterType = this.options.filterType || 'exclude'; // Default to exclude
|
|
117
|
-
const anyPatternMatches = this._compiledPatterns.some(pattern => pattern.test(processedQuery));
|
|
118
|
-
if (verbose) {
|
|
119
|
-
console.log(`Session ${this.id}: Pattern filter check - filterType: ${filterType}, patterns: ${this._compiledPatterns.length}, anyMatch: ${anyPatternMatches}`);
|
|
120
|
-
console.log(`Session ${this.id}: Testing against processedQuery: ${processedQuery.substring(0, 100)}...`);
|
|
121
|
-
}
|
|
122
|
-
if (filterType === 'exclude' && anyPatternMatches) {
|
|
123
|
-
if (verbose) {
|
|
124
|
-
console.log(`Session ${this.id}: Skipping - exclude pattern matched`);
|
|
125
|
-
}
|
|
126
|
-
return; // Skip logging if any exclude pattern matches
|
|
127
|
-
}
|
|
128
|
-
if (filterType === 'include' && !anyPatternMatches) {
|
|
129
|
-
if (verbose) {
|
|
130
|
-
console.log(`Session ${this.id}: Skipping - no include pattern matched`);
|
|
131
|
-
}
|
|
132
|
-
return; // Skip logging if no include pattern matches
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// Replace schema names with Flyway placeholders if migration format
|
|
136
|
-
if (this.options.formatAsMigration) {
|
|
137
|
-
// Step 1: Escape ${...} patterns within SQL string literals to prevent Flyway from treating them as placeholders
|
|
138
|
-
// This regex matches string literals and replaces ${...} with $' + '{...} within them
|
|
139
|
-
processedQuery = this._escapeFlywaySyntaxInStrings(processedQuery);
|
|
140
|
-
// Step 2: Replace schema names with Flyway placeholders
|
|
141
|
-
const schemaName = this.options.defaultSchemaName;
|
|
142
|
-
if (schemaName?.length > 0) {
|
|
143
|
-
// Create a regex that matches the schema name with optional brackets
|
|
144
|
-
const schemaRegex = new RegExp(`\\[?${schemaName}\\]?\\.`, 'g');
|
|
145
|
-
processedQuery = processedQuery.replace(schemaRegex, '[${flyway:defaultSchema}].');
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
// no default schema name provided
|
|
149
|
-
if (verbose) {
|
|
150
|
-
console.warn(`Session ${this.id}: No default schema name provided for Flyway migration format, using [\${flyway:defaultSchema}] placeholder`);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
// Apply pretty printing if enabled
|
|
155
|
-
if (this.options.prettyPrint) {
|
|
156
|
-
processedQuery = this._prettyPrintSql(processedQuery);
|
|
157
|
-
}
|
|
158
|
-
// Add the SQL statement
|
|
159
|
-
logEntry += `${processedQuery};\n`;
|
|
160
|
-
// Add parameter comment if parameters exist
|
|
161
|
-
if (parameters) {
|
|
162
|
-
if (Array.isArray(parameters)) {
|
|
163
|
-
if (parameters.length > 0) {
|
|
164
|
-
logEntry += `-- Parameters: ${parameters.map((p, i) => `@p${i}='${p}'`).join(', ')}\n`;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
else if (typeof parameters === 'object') {
|
|
168
|
-
const paramStr = Object.entries(parameters)
|
|
169
|
-
.map(([key, value]) => `@${key}='${value}'`)
|
|
170
|
-
.join(', ');
|
|
171
|
-
if (paramStr) {
|
|
172
|
-
logEntry += `-- Parameters: ${paramStr}\n`;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
// Add batch separator if specified
|
|
177
|
-
if (this.options.batchSeparator) {
|
|
178
|
-
logEntry += `\n${this.options.batchSeparator}\n`;
|
|
179
|
-
}
|
|
180
|
-
logEntry += '\n'; // Add blank line between statements
|
|
181
|
-
if (verbose) {
|
|
182
|
-
console.log(`Session ${this.id}: About to write log entry (${logEntry.length} chars)`);
|
|
183
|
-
console.log(`Session ${this.id}: Log entry preview: ${logEntry.substring(0, 200)}...`);
|
|
184
|
-
}
|
|
185
|
-
try {
|
|
186
|
-
await this._fileHandle.writeFile(logEntry);
|
|
187
|
-
this._statementCount++;
|
|
188
|
-
this._emittedStatementCount++; // Track actually emitted statements
|
|
189
|
-
if (verbose) {
|
|
190
|
-
console.log(`Session ${this.id}: Successfully wrote to file. New counts - total: ${this._statementCount}, emitted: ${this._emittedStatementCount}`);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
catch (error) {
|
|
194
|
-
console.error(`Session ${this.id}: Error writing to file:`, error);
|
|
195
|
-
throw error;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Disposes of the logging session, writes the footer, closes the file, and optionally deletes empty files
|
|
200
|
-
*/
|
|
201
|
-
async dispose() {
|
|
202
|
-
if (this._disposed) {
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
this._disposed = true;
|
|
206
|
-
if (this._fileHandle) {
|
|
207
|
-
// Write footer comment
|
|
208
|
-
const footer = this._generateFooter();
|
|
209
|
-
await this._fileHandle.writeFile(footer);
|
|
210
|
-
await this._fileHandle.close();
|
|
211
|
-
this._fileHandle = null;
|
|
212
|
-
// Check if we should delete empty log files
|
|
213
|
-
if (this._emittedStatementCount === 0 && !this.options.retainEmptyLogFiles) {
|
|
214
|
-
try {
|
|
215
|
-
await fs.promises.unlink(this.filePath);
|
|
216
|
-
// Log that we deleted the empty file (optional)
|
|
217
|
-
console.log(`Deleted empty SQL log file: ${this.filePath}`);
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
// Ignore errors during deletion (file might already be deleted, etc.)
|
|
221
|
-
console.error(`Failed to delete empty SQL log file: ${this.filePath}`, error);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
_generateHeader() {
|
|
227
|
-
let header = `-- SQL Logging Session\n`;
|
|
228
|
-
header += `-- Session ID: ${this.id}\n`;
|
|
229
|
-
header += `-- Started: ${this.startTime.toISOString()}\n`;
|
|
230
|
-
if (this.options.description) {
|
|
231
|
-
header += `-- Description: ${this.options.description}\n`;
|
|
232
|
-
}
|
|
233
|
-
if (this.options.formatAsMigration) {
|
|
234
|
-
header += `-- Format: Migration-ready with Flyway schema placeholders\n`;
|
|
235
|
-
}
|
|
236
|
-
header += `-- Generated by MemberJunction SQLServerDataProvider\n`;
|
|
237
|
-
header += `\n`;
|
|
238
|
-
return header;
|
|
239
|
-
}
|
|
240
|
-
_generateFooter() {
|
|
241
|
-
const endTime = new Date();
|
|
242
|
-
const duration = endTime.getTime() - this.startTime.getTime();
|
|
243
|
-
let footer = `\n-- End of SQL Logging Session\n`;
|
|
244
|
-
footer += `-- Session ID: ${this.id}\n`;
|
|
245
|
-
footer += `-- Completed: ${endTime.toISOString()}\n`;
|
|
246
|
-
footer += `-- Duration: ${duration}ms\n`;
|
|
247
|
-
footer += `-- Total Statements: ${this._emittedStatementCount}\n`;
|
|
248
|
-
return footer;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Format SQL using sql-formatter library with SQL Server dialect
|
|
252
|
-
*/
|
|
253
|
-
_prettyPrintSql(sql) {
|
|
254
|
-
if (!sql)
|
|
255
|
-
return sql;
|
|
256
|
-
try {
|
|
257
|
-
let formatted = formatSql(sql, {
|
|
258
|
-
language: 'tsql', // SQL Server Transact-SQL dialect
|
|
259
|
-
tabWidth: 2,
|
|
260
|
-
keywordCase: 'upper',
|
|
261
|
-
functionCase: 'upper',
|
|
262
|
-
dataTypeCase: 'upper',
|
|
263
|
-
linesBetweenQueries: 1,
|
|
264
|
-
});
|
|
265
|
-
// Post-process to fix BEGIN/END formatting
|
|
266
|
-
formatted = this._postProcessBeginEnd(formatted);
|
|
267
|
-
return formatted;
|
|
268
|
-
}
|
|
269
|
-
catch (error) {
|
|
270
|
-
// If formatting fails, return original SQL
|
|
271
|
-
console.warn('SQL formatting failed, returning original:', error);
|
|
272
|
-
return sql;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Post-process SQL to ensure BEGIN, END, and EXEC keywords are on their own lines
|
|
277
|
-
*/
|
|
278
|
-
_postProcessBeginEnd(sql) {
|
|
279
|
-
if (!sql)
|
|
280
|
-
return sql;
|
|
281
|
-
// Fix BEGIN keyword - ensure it's on its own line
|
|
282
|
-
// Match: any non-whitespace followed by space(s) followed by BEGIN (word boundary)
|
|
283
|
-
sql = sql.replace(/(\S)\s+(BEGIN\b)/g, '$1\n$2');
|
|
284
|
-
// Fix BEGIN followed by other keywords - ensure what follows BEGIN is on a new line
|
|
285
|
-
// Match: BEGIN followed by space(s) followed by non-whitespace
|
|
286
|
-
sql = sql.replace(/(BEGIN\b)\s+(\S)/g, '$1\n$2');
|
|
287
|
-
// Fix END keyword - ensure it's on its own line
|
|
288
|
-
// Match: any non-whitespace followed by space(s) followed by END (word boundary)
|
|
289
|
-
sql = sql.replace(/(\S)\s+(END\b)/g, '$1\n$2');
|
|
290
|
-
// Fix EXEC keyword - ensure it's on its own line
|
|
291
|
-
// Match: any non-whitespace followed by space(s) followed by EXEC (word boundary)
|
|
292
|
-
sql = sql.replace(/(\S)\s+(EXEC\b)/g, '$1\n$2');
|
|
293
|
-
return sql;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Escapes ${...} patterns within SQL string literals to prevent Flyway from interpreting them as placeholders.
|
|
297
|
-
* Converts ${templateVariable} to $' + '{templateVariable} within string literals.
|
|
298
|
-
*
|
|
299
|
-
* @param sql - The SQL statement to process
|
|
300
|
-
* @returns The SQL with escaped template syntax within strings
|
|
301
|
-
*/
|
|
302
|
-
_escapeFlywaySyntaxInStrings(sql) {
|
|
303
|
-
// Regex /\$\{/g matches all occurrences of "${" literally:
|
|
304
|
-
// - \$ escapes the dollar sign (which is a special regex character)
|
|
305
|
-
// - \{ escapes the opening brace (also a special regex character)
|
|
306
|
-
// - /g flag ensures all occurrences are replaced, not just the first one
|
|
307
|
-
// The replacement "$'+'{ " breaks up the ${ pattern so Flyway won't interpret it as a placeholder
|
|
308
|
-
return sql.replaceAll(/\$\{/g, "$$'+'{");
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
//# sourceMappingURL=SqlLogger.js.map
|
package/dist/SqlLogger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SqlLogger.js","sourceRoot":"","sources":["../src/SqlLogger.ts"],"names":[],"mappings":"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"}
|