@ibm/ibmi-mcp-server 0.1.2 → 0.3.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.
Files changed (207) hide show
  1. package/README.md +2178 -46
  2. package/dist/config/index.d.ts +2 -0
  3. package/dist/config/index.d.ts.map +1 -1
  4. package/dist/config/index.js +57 -24
  5. package/dist/config/index.js.map +1 -1
  6. package/dist/config/resolver.d.ts.map +1 -1
  7. package/dist/config/resolver.js.map +1 -1
  8. package/dist/ibmi-mcp-server/auth/httpAuthEndpoint.js +1 -1
  9. package/dist/ibmi-mcp-server/services/connectionPool.js +2 -2
  10. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts +80 -0
  11. package/dist/ibmi-mcp-server/tools/executeSql.tool.d.ts.map +1 -0
  12. package/dist/ibmi-mcp-server/tools/executeSql.tool.js +356 -0
  13. package/dist/ibmi-mcp-server/tools/executeSql.tool.js.map +1 -0
  14. package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts +36 -0
  15. package/dist/ibmi-mcp-server/tools/generateSql.tool.d.ts.map +1 -0
  16. package/dist/ibmi-mcp-server/tools/generateSql.tool.js +281 -0
  17. package/dist/ibmi-mcp-server/tools/generateSql.tool.js.map +1 -0
  18. package/dist/ibmi-mcp-server/tools/index.d.ts +85 -0
  19. package/dist/ibmi-mcp-server/tools/index.d.ts.map +1 -0
  20. package/dist/ibmi-mcp-server/tools/index.js +21 -0
  21. package/dist/ibmi-mcp-server/tools/index.js.map +1 -0
  22. package/dist/ibmi-mcp-server/utils/config/configParser.d.ts +9 -0
  23. package/dist/ibmi-mcp-server/utils/config/configParser.d.ts.map +1 -1
  24. package/dist/ibmi-mcp-server/utils/config/configParser.js +58 -0
  25. package/dist/ibmi-mcp-server/utils/config/configParser.js.map +1 -1
  26. package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.js +1 -1
  27. package/dist/ibmi-mcp-server/utils/config/toolConfigBuilder.js.map +1 -1
  28. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts +4 -4
  29. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.d.ts.map +1 -1
  30. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js +7 -8
  31. package/dist/ibmi-mcp-server/utils/config/toolDefinitions.js.map +1 -1
  32. package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts +0 -8
  33. package/dist/ibmi-mcp-server/utils/config/toolFactory.d.ts.map +1 -1
  34. package/dist/ibmi-mcp-server/utils/config/toolFactory.js +0 -31
  35. package/dist/ibmi-mcp-server/utils/config/toolFactory.js.map +1 -1
  36. package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts +1 -1
  37. package/dist/ibmi-mcp-server/utils/config/toolsetManager.d.ts.map +1 -1
  38. package/dist/ibmi-mcp-server/utils/config/toolsetManager.js +2 -2
  39. package/dist/ibmi-mcp-server/utils/config/toolsetManager.js.map +1 -1
  40. package/dist/ibmi-mcp-server/utils/language/document.d.ts +26 -0
  41. package/dist/ibmi-mcp-server/utils/language/document.d.ts.map +1 -0
  42. package/dist/ibmi-mcp-server/utils/language/document.js +318 -0
  43. package/dist/ibmi-mcp-server/utils/language/document.js.map +1 -0
  44. package/dist/ibmi-mcp-server/utils/language/statement.d.ts +43 -0
  45. package/dist/ibmi-mcp-server/utils/language/statement.d.ts.map +1 -0
  46. package/dist/ibmi-mcp-server/utils/language/statement.js +796 -0
  47. package/dist/ibmi-mcp-server/utils/language/statement.js.map +1 -0
  48. package/dist/ibmi-mcp-server/utils/language/tokens.d.ts +32 -0
  49. package/dist/ibmi-mcp-server/utils/language/tokens.d.ts.map +1 -0
  50. package/dist/ibmi-mcp-server/utils/language/tokens.js +532 -0
  51. package/dist/ibmi-mcp-server/utils/language/tokens.js.map +1 -0
  52. package/dist/ibmi-mcp-server/utils/language/types.d.ts +138 -0
  53. package/dist/ibmi-mcp-server/utils/language/types.d.ts.map +1 -0
  54. package/dist/ibmi-mcp-server/utils/language/types.js +93 -0
  55. package/dist/ibmi-mcp-server/utils/language/types.js.map +1 -0
  56. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts +48 -0
  57. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.d.ts.map +1 -0
  58. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js +93 -0
  59. package/dist/ibmi-mcp-server/utils/security/ibmiSqlParser.js.map +1 -0
  60. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts +35 -59
  61. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.d.ts.map +1 -1
  62. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js +108 -288
  63. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidator.js.map +1 -1
  64. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts +54 -0
  65. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.d.ts.map +1 -0
  66. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js +91 -0
  67. package/dist/ibmi-mcp-server/utils/security/sqlSecurityValidatorFallback.js.map +1 -0
  68. package/dist/index.js +4 -1
  69. package/dist/index.js.map +1 -1
  70. package/dist/mcp-server/tools/index.d.ts +13 -2
  71. package/dist/mcp-server/tools/index.d.ts.map +1 -1
  72. package/dist/mcp-server/tools/index.js +29 -9
  73. package/dist/mcp-server/tools/index.js.map +1 -1
  74. package/dist/mcp-server/tools/utils/index.d.ts +7 -0
  75. package/dist/mcp-server/tools/utils/index.d.ts.map +1 -0
  76. package/dist/mcp-server/tools/utils/index.js +7 -0
  77. package/dist/mcp-server/tools/utils/index.js.map +1 -0
  78. package/dist/mcp-server/tools/utils/tool-factory.d.ts +129 -0
  79. package/dist/mcp-server/tools/utils/tool-factory.d.ts.map +1 -0
  80. package/dist/mcp-server/tools/utils/tool-factory.js +179 -0
  81. package/dist/mcp-server/tools/utils/tool-factory.js.map +1 -0
  82. package/dist/mcp-server/tools/utils/types.d.ts +117 -0
  83. package/dist/mcp-server/tools/utils/types.d.ts.map +1 -0
  84. package/dist/mcp-server/tools/utils/types.js +11 -0
  85. package/dist/mcp-server/tools/utils/types.js.map +1 -0
  86. package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts +26 -0
  87. package/dist/mcp-server/transports/core/cleanupTransformStream.d.ts.map +1 -0
  88. package/dist/mcp-server/transports/core/cleanupTransformStream.js +60 -0
  89. package/dist/mcp-server/transports/core/cleanupTransformStream.js.map +1 -0
  90. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts +1 -1
  91. package/dist/mcp-server/transports/core/statefulTransportManager.d.ts.map +1 -1
  92. package/dist/mcp-server/transports/core/statefulTransportManager.js +50 -40
  93. package/dist/mcp-server/transports/core/statefulTransportManager.js.map +1 -1
  94. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts +2 -13
  95. package/dist/mcp-server/transports/core/statelessTransportManager.d.ts.map +1 -1
  96. package/dist/mcp-server/transports/core/statelessTransportManager.js +35 -62
  97. package/dist/mcp-server/transports/core/statelessTransportManager.js.map +1 -1
  98. package/dist/mcp-server/transports/core/transportRequest.d.ts +1 -2
  99. package/dist/mcp-server/transports/core/transportRequest.d.ts.map +1 -1
  100. package/dist/mcp-server/transports/http/mcpTransportMiddleware.d.ts.map +1 -1
  101. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js +1 -3
  102. package/dist/mcp-server/transports/http/mcpTransportMiddleware.js.map +1 -1
  103. package/dist/utils/internal/logger.d.ts +5 -0
  104. package/dist/utils/internal/logger.d.ts.map +1 -1
  105. package/dist/utils/internal/logger.js +65 -36
  106. package/dist/utils/internal/logger.js.map +1 -1
  107. package/package.json +29 -23
  108. package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts +0 -9
  109. package/dist/ibmi-mcp-server/tools/executeSql/index.d.ts.map +0 -1
  110. package/dist/ibmi-mcp-server/tools/executeSql/index.js +0 -9
  111. package/dist/ibmi-mcp-server/tools/executeSql/index.js.map +0 -1
  112. package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts +0 -51
  113. package/dist/ibmi-mcp-server/tools/executeSql/logic.d.ts.map +0 -1
  114. package/dist/ibmi-mcp-server/tools/executeSql/logic.js +0 -179
  115. package/dist/ibmi-mcp-server/tools/executeSql/logic.js.map +0 -1
  116. package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts +0 -52
  117. package/dist/ibmi-mcp-server/tools/executeSql/registration.d.ts.map +0 -1
  118. package/dist/ibmi-mcp-server/tools/executeSql/registration.js +0 -161
  119. package/dist/ibmi-mcp-server/tools/executeSql/registration.js.map +0 -1
  120. package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts +0 -13
  121. package/dist/ibmi-mcp-server/tools/generateSql/index.d.ts.map +0 -1
  122. package/dist/ibmi-mcp-server/tools/generateSql/index.js +0 -13
  123. package/dist/ibmi-mcp-server/tools/generateSql/index.js.map +0 -1
  124. package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts +0 -64
  125. package/dist/ibmi-mcp-server/tools/generateSql/logic.d.ts.map +0 -1
  126. package/dist/ibmi-mcp-server/tools/generateSql/logic.js +0 -190
  127. package/dist/ibmi-mcp-server/tools/generateSql/logic.js.map +0 -1
  128. package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts +0 -18
  129. package/dist/ibmi-mcp-server/tools/generateSql/registration.d.ts.map +0 -1
  130. package/dist/ibmi-mcp-server/tools/generateSql/registration.js +0 -64
  131. package/dist/ibmi-mcp-server/tools/generateSql/registration.js.map +0 -1
  132. package/dist/mcp-server/tools/catFactFetcher/index.d.ts +0 -8
  133. package/dist/mcp-server/tools/catFactFetcher/index.d.ts.map +0 -1
  134. package/dist/mcp-server/tools/catFactFetcher/index.js +0 -8
  135. package/dist/mcp-server/tools/catFactFetcher/index.js.map +0 -1
  136. package/dist/mcp-server/tools/catFactFetcher/logic.d.ts +0 -52
  137. package/dist/mcp-server/tools/catFactFetcher/logic.d.ts.map +0 -1
  138. package/dist/mcp-server/tools/catFactFetcher/logic.js +0 -95
  139. package/dist/mcp-server/tools/catFactFetcher/logic.js.map +0 -1
  140. package/dist/mcp-server/tools/catFactFetcher/registration.d.ts +0 -9
  141. package/dist/mcp-server/tools/catFactFetcher/registration.d.ts.map +0 -1
  142. package/dist/mcp-server/tools/catFactFetcher/registration.js +0 -43
  143. package/dist/mcp-server/tools/catFactFetcher/registration.js.map +0 -1
  144. package/dist/mcp-server/tools/echoTool/index.d.ts +0 -13
  145. package/dist/mcp-server/tools/echoTool/index.d.ts.map +0 -1
  146. package/dist/mcp-server/tools/echoTool/index.js +0 -13
  147. package/dist/mcp-server/tools/echoTool/index.js.map +0 -1
  148. package/dist/mcp-server/tools/echoTool/logic.d.ts +0 -69
  149. package/dist/mcp-server/tools/echoTool/logic.d.ts.map +0 -1
  150. package/dist/mcp-server/tools/echoTool/logic.js +0 -119
  151. package/dist/mcp-server/tools/echoTool/logic.js.map +0 -1
  152. package/dist/mcp-server/tools/echoTool/registration.d.ts +0 -9
  153. package/dist/mcp-server/tools/echoTool/registration.d.ts.map +0 -1
  154. package/dist/mcp-server/tools/echoTool/registration.js +0 -45
  155. package/dist/mcp-server/tools/echoTool/registration.js.map +0 -1
  156. package/dist/mcp-server/tools/imageTest/index.d.ts +0 -7
  157. package/dist/mcp-server/tools/imageTest/index.d.ts.map +0 -1
  158. package/dist/mcp-server/tools/imageTest/index.js +0 -7
  159. package/dist/mcp-server/tools/imageTest/index.js.map +0 -1
  160. package/dist/mcp-server/tools/imageTest/logic.d.ts +0 -27
  161. package/dist/mcp-server/tools/imageTest/logic.d.ts.map +0 -1
  162. package/dist/mcp-server/tools/imageTest/logic.js +0 -44
  163. package/dist/mcp-server/tools/imageTest/logic.js.map +0 -1
  164. package/dist/mcp-server/tools/imageTest/registration.d.ts +0 -9
  165. package/dist/mcp-server/tools/imageTest/registration.d.ts.map +0 -1
  166. package/dist/mcp-server/tools/imageTest/registration.js +0 -49
  167. package/dist/mcp-server/tools/imageTest/registration.js.map +0 -1
  168. package/dist/mcp-server/tools/utils/tool-utils.d.ts +0 -43
  169. package/dist/mcp-server/tools/utils/tool-utils.d.ts.map +0 -1
  170. package/dist/mcp-server/tools/utils/tool-utils.js +0 -44
  171. package/dist/mcp-server/tools/utils/tool-utils.js.map +0 -1
  172. package/dist/mcp-server/transports/core/headerUtils.d.ts +0 -27
  173. package/dist/mcp-server/transports/core/headerUtils.d.ts.map +0 -1
  174. package/dist/mcp-server/transports/core/headerUtils.js +0 -53
  175. package/dist/mcp-server/transports/core/headerUtils.js.map +0 -1
  176. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts +0 -77
  177. package/dist/mcp-server/transports/core/honoNodeBridge.d.ts.map +0 -1
  178. package/dist/mcp-server/transports/core/honoNodeBridge.js +0 -150
  179. package/dist/mcp-server/transports/core/honoNodeBridge.js.map +0 -1
  180. package/dist/services/duck-db/duckDBConnectionManager.d.ts +0 -55
  181. package/dist/services/duck-db/duckDBConnectionManager.d.ts.map +0 -1
  182. package/dist/services/duck-db/duckDBConnectionManager.js +0 -184
  183. package/dist/services/duck-db/duckDBConnectionManager.js.map +0 -1
  184. package/dist/services/duck-db/duckDBQueryExecutor.d.ts +0 -18
  185. package/dist/services/duck-db/duckDBQueryExecutor.d.ts.map +0 -1
  186. package/dist/services/duck-db/duckDBQueryExecutor.js +0 -115
  187. package/dist/services/duck-db/duckDBQueryExecutor.js.map +0 -1
  188. package/dist/services/duck-db/duckDBService.d.ts +0 -27
  189. package/dist/services/duck-db/duckDBService.d.ts.map +0 -1
  190. package/dist/services/duck-db/duckDBService.js +0 -151
  191. package/dist/services/duck-db/duckDBService.js.map +0 -1
  192. package/dist/services/duck-db/types.d.ts +0 -135
  193. package/dist/services/duck-db/types.d.ts.map +0 -1
  194. package/dist/services/duck-db/types.js +0 -6
  195. package/dist/services/duck-db/types.js.map +0 -1
  196. package/dist/services/llm-providers/openRouterProvider.d.ts +0 -36
  197. package/dist/services/llm-providers/openRouterProvider.d.ts.map +0 -1
  198. package/dist/services/llm-providers/openRouterProvider.js +0 -235
  199. package/dist/services/llm-providers/openRouterProvider.js.map +0 -1
  200. package/dist/services/supabase/supabaseClient.d.ts +0 -25
  201. package/dist/services/supabase/supabaseClient.d.ts.map +0 -1
  202. package/dist/services/supabase/supabaseClient.js +0 -68
  203. package/dist/services/supabase/supabaseClient.js.map +0 -1
  204. package/dist/storage/duckdbExample.d.ts +0 -8
  205. package/dist/storage/duckdbExample.d.ts.map +0 -1
  206. package/dist/storage/duckdbExample.js +0 -197
  207. package/dist/storage/duckdbExample.js.map +0 -1
@@ -0,0 +1,796 @@
1
+ /* eslint-disable */
2
+ // @ts-nocheck
3
+ // Vendored from vscode-db2i - TypeScript strict mode and ESLint disabled
4
+ import SQLTokeniser, { NameTypes } from "./tokens.js";
5
+ import { ClauseType, ClauseTypeWord, StatementType, StatementTypeWord, } from "./types.js";
6
+ export const tokenIs = (token, type, value) => {
7
+ return (token &&
8
+ token.type === type &&
9
+ (value ? token.value?.toUpperCase() === value : true));
10
+ };
11
+ export default class Statement {
12
+ tokens;
13
+ range;
14
+ type = StatementType.Unknown;
15
+ label;
16
+ _blockTokens;
17
+ get blockTokens() {
18
+ if (!this._blockTokens) {
19
+ this._blockTokens = SQLTokeniser.createBlocks(this.tokens.slice(0));
20
+ }
21
+ return this._blockTokens;
22
+ }
23
+ constructor(tokens, range) {
24
+ this.tokens = tokens;
25
+ this.range = range;
26
+ this.tokens = this.tokens.filter((newToken) => newToken.type !== `newline`);
27
+ let first = this.tokens[0];
28
+ if (tokenIs(first, `word`, `EXEC`) &&
29
+ tokenIs(this.tokens[1], `word`, `SQL`)) {
30
+ first = this.tokens[2];
31
+ }
32
+ else if (tokenIs(this.tokens[1], `colon`)) {
33
+ this.label = first.value;
34
+ first = this.tokens[2];
35
+ }
36
+ const wordValue = first?.value?.toUpperCase();
37
+ this.type = StatementTypeWord[wordValue] || StatementType.Unknown;
38
+ switch (this.type) {
39
+ case StatementType.Create:
40
+ // No scalar transformation here..
41
+ break;
42
+ default:
43
+ this.tokens = SQLTokeniser.findScalars(this.tokens);
44
+ break;
45
+ }
46
+ }
47
+ getLabel() {
48
+ return this.label;
49
+ }
50
+ isCompoundStart() {
51
+ if (this.tokens.length === 1 &&
52
+ tokenIs(this.tokens[0], `keyword`, `BEGIN`)) {
53
+ return true;
54
+ }
55
+ // These statements can end with BEGIN, which signifies a block starter
56
+ if ([StatementType.Create, StatementType.Declare].includes(this.type)) {
57
+ const last = this.tokens[this.tokens.length - 1];
58
+ if (tokenIs(last, `keyword`, `BEGIN`)) {
59
+ return true;
60
+ }
61
+ }
62
+ return false;
63
+ }
64
+ static typeIsConditional(type) {
65
+ return [
66
+ StatementType.If,
67
+ StatementType.While,
68
+ StatementType.Loop,
69
+ StatementType.For,
70
+ ].includes(type);
71
+ }
72
+ isConditionStart() {
73
+ return Statement.typeIsConditional(this.type);
74
+ }
75
+ isConditionEnd() {
76
+ return this.type === StatementType.End && this.tokens.length > 1;
77
+ }
78
+ isCompoundEnd() {
79
+ return this.type === StatementType.End && this.tokens.length === 1;
80
+ }
81
+ getTokenByOffset(offset) {
82
+ const blockSearch = (tokens) => {
83
+ const token = tokens.find((token) => offset >= token.range.start && offset <= token.range.end);
84
+ if (token?.type === `block` && token.block) {
85
+ return blockSearch(token.block);
86
+ }
87
+ return token;
88
+ };
89
+ return blockSearch(this.tokens);
90
+ }
91
+ getClauseForOffset(offset) {
92
+ let currentClause = ClauseType.Unknown;
93
+ for (let i = 0; i < this.tokens.length; i++) {
94
+ if (offset < this.tokens[i].range.start) {
95
+ break;
96
+ }
97
+ if (tokenIs(this.tokens[i], `clause`)) {
98
+ currentClause = ClauseTypeWord[this.tokens[i].value.toUpperCase()];
99
+ }
100
+ }
101
+ return currentClause;
102
+ }
103
+ getBlockRangeAt(offset) {
104
+ const blockContainsOffset = (cOffset, block) => {
105
+ const tokenInOffset = block.find((token) => cOffset >= token.range.start && cOffset <= token.range.end);
106
+ if (tokenInOffset) {
107
+ if (tokenInOffset.type === `block`) {
108
+ if (tokenInOffset.block.length > 0) {
109
+ let blockRange = blockContainsOffset(cOffset, tokenInOffset.block);
110
+ if (!blockRange) {
111
+ blockRange = {
112
+ start: this.tokens.findIndex((token) => token.range.start === tokenInOffset.range.start) + 1,
113
+ end: this.tokens.findIndex((token) => token.range.end === tokenInOffset.range.end),
114
+ };
115
+ }
116
+ return blockRange;
117
+ }
118
+ else {
119
+ const rawEnd = this.tokens.findIndex((token) => token.range.end === tokenInOffset.range.end);
120
+ return {
121
+ start: rawEnd,
122
+ end: rawEnd,
123
+ };
124
+ }
125
+ }
126
+ else {
127
+ const rawStart = this.tokens.findIndex((token) => token.range.start === block[0].range.start);
128
+ const rawEnd = this.tokens.findIndex((token) => token.range.end === block[block.length - 1].range.end);
129
+ return {
130
+ start: rawStart,
131
+ end: rawEnd + 1,
132
+ };
133
+ }
134
+ }
135
+ return undefined;
136
+ };
137
+ return blockContainsOffset(offset, this.blockTokens);
138
+ }
139
+ getCallableDetail(offset, withBlocks = false) {
140
+ const range = this.getBlockRangeAt(offset);
141
+ if (range) {
142
+ const hasDot = (tokenIs(this.tokens[range.start - 4], `word`) ||
143
+ tokenIs(this.tokens[range.start - 4], `sqlName`)) &&
144
+ tokenIs(this.tokens[range.start - 3], `dot`);
145
+ const parentRef = hasDot
146
+ ? this.getRefAtToken(range.start - 4)
147
+ : this.getRefAtToken(range.start - 2);
148
+ if (parentRef) {
149
+ return {
150
+ tokens: withBlocks
151
+ ? SQLTokeniser.createBlocks(this.tokens.slice(range.start, range.end))
152
+ : this.tokens.slice(range.start, range.end),
153
+ parentRef,
154
+ };
155
+ }
156
+ }
157
+ }
158
+ getBlockAt(offset) {
159
+ const expandBlock = (tokens) => {
160
+ const block = tokens.filter((token) => token.type === `block`);
161
+ if (block.length > 0) {
162
+ return block.reduce((acc, token) => acc.concat(expandBlock(token.block)), tokens);
163
+ }
164
+ return tokens;
165
+ };
166
+ let blockRange = this.getBlockRangeAt(offset);
167
+ if (blockRange) {
168
+ return expandBlock(this.tokens.slice(blockRange.start, blockRange.end));
169
+ }
170
+ return [];
171
+ }
172
+ getReferenceByOffset(offset) {
173
+ let i = this.tokens.findIndex((token) => offset >= token.range.start && offset <= token.range.end);
174
+ let currentType;
175
+ let prevMustBe;
176
+ // Reset to end
177
+ if (i >= 0) {
178
+ currentType = this.tokens[i].type;
179
+ if (currentType === `dot` || currentType === `forwardslash`)
180
+ prevMustBe = `name`;
181
+ else if (NameTypes.includes(currentType))
182
+ prevMustBe = `dot`;
183
+ }
184
+ else {
185
+ i = this.tokens.length - 1;
186
+ prevMustBe = `name`;
187
+ }
188
+ while (i >= 0 && this.tokens[i - 1]) {
189
+ i--;
190
+ currentType = this.tokens[i].type;
191
+ switch (prevMustBe) {
192
+ case `dot`:
193
+ if (currentType === `dot`) {
194
+ prevMustBe = `name`;
195
+ }
196
+ else {
197
+ return this.getRefAtToken(i + 1);
198
+ }
199
+ break;
200
+ case `name`:
201
+ if (NameTypes.includes(currentType)) {
202
+ prevMustBe = `dot`;
203
+ }
204
+ else {
205
+ return this.getRefAtToken(i + 1);
206
+ }
207
+ break;
208
+ }
209
+ }
210
+ }
211
+ getCTEReferences() {
212
+ if (this.type !== StatementType.With)
213
+ return [];
214
+ const withBlocks = this.blockTokens;
215
+ let cteList = [];
216
+ for (let i = 0; i < withBlocks.length; i++) {
217
+ if (tokenIs(withBlocks[i], `word`) ||
218
+ tokenIs(withBlocks[i], `function`)) {
219
+ let cteName = withBlocks[i].value;
220
+ let parameters = [];
221
+ let statementBlockI = i + 1;
222
+ if (tokenIs(withBlocks[i + 1], `block`) &&
223
+ tokenIs(withBlocks[i + 2], `keyword`, `AS`)) {
224
+ parameters = withBlocks[i + 1]
225
+ .block.filter((blockToken) => blockToken.type === `word`)
226
+ .map((blockToken) => blockToken.value);
227
+ statementBlockI = i + 3;
228
+ }
229
+ else if (tokenIs(withBlocks[i + 1], `keyword`, `AS`)) {
230
+ statementBlockI = i + 2;
231
+ }
232
+ const statementBlock = withBlocks[statementBlockI];
233
+ if (tokenIs(statementBlock, `block`)) {
234
+ cteList.push({
235
+ name: cteName,
236
+ columns: parameters,
237
+ statement: new Statement(Statement.trimTokens(statementBlock.block), statementBlock.range),
238
+ });
239
+ }
240
+ i = statementBlockI;
241
+ }
242
+ if (tokenIs(withBlocks[i], `statementType`, `SELECT`)) {
243
+ break;
244
+ }
245
+ }
246
+ return cteList;
247
+ }
248
+ getRoutineParameters() {
249
+ const list = [];
250
+ if (this.type !== StatementType.Create) {
251
+ return [];
252
+ }
253
+ function splitTokens(inTokens, type) {
254
+ const chunks = [];
255
+ let currentChunk = [];
256
+ for (const token of inTokens) {
257
+ if (tokenIs(token, type)) {
258
+ if (currentChunk.length > 0) {
259
+ chunks.push(currentChunk);
260
+ currentChunk = [];
261
+ }
262
+ }
263
+ else {
264
+ currentChunk.push(token);
265
+ }
266
+ }
267
+ if (currentChunk.length > 0) {
268
+ chunks.push(currentChunk);
269
+ }
270
+ return chunks;
271
+ }
272
+ const withBlocks = SQLTokeniser.createBlocks(this.tokens.slice(0));
273
+ const firstBlock = withBlocks.find((token) => token.type === `block`);
274
+ if (firstBlock && firstBlock.block) {
275
+ const parameters = splitTokens(firstBlock.block, `comma`);
276
+ for (const parameter of parameters) {
277
+ // If the first token is the parm type, then the name follows
278
+ if (tokenIs(parameter[0], `keyword`))
279
+ continue;
280
+ let nameIndex = tokenIs(parameter[0], `parmType`) ? 1 : 0;
281
+ const name = parameter[nameIndex].value;
282
+ // Include parmType if it is provided
283
+ const definitionTokens = (nameIndex === 1 ? [parameter[0]] : []).concat(parameter.slice(nameIndex + 1));
284
+ list.push({
285
+ tokens: parameter,
286
+ createType: Statement.formatSimpleTokens(definitionTokens),
287
+ alias: name,
288
+ object: {
289
+ name,
290
+ },
291
+ });
292
+ }
293
+ }
294
+ return list;
295
+ }
296
+ static BANNED_NAMES = [`VALUES`];
297
+ getObjectReferences() {
298
+ let list = [];
299
+ const doAdd = (ref) => {
300
+ if (ref) {
301
+ if (ref.object.name &&
302
+ !Statement.BANNED_NAMES.includes(ref.object.name.toUpperCase())) {
303
+ list.push(ref);
304
+ }
305
+ }
306
+ };
307
+ const basicQueryFinder = (startIndex) => {
308
+ let currentClause;
309
+ for (let i = startIndex; i < this.tokens.length; i++) {
310
+ if (tokenIs(this.tokens[i], `clause`, `FROM`)) {
311
+ currentClause = `from`;
312
+ }
313
+ else if (tokenIs(this.tokens[i], `statementType`, `SELECT`)) {
314
+ currentClause = `select`;
315
+ }
316
+ else if ((currentClause === `from` && tokenIs(this.tokens[i], `clause`)) ||
317
+ tokenIs(this.tokens[i], `join`) ||
318
+ tokenIs(this.tokens[i], `closebracket`)) {
319
+ currentClause = undefined;
320
+ }
321
+ if (tokenIs(this.tokens[i], `clause`, `FROM`) ||
322
+ (this.type !== StatementType.Select &&
323
+ tokenIs(this.tokens[i], `clause`, `INTO`)) ||
324
+ tokenIs(this.tokens[i], `join`) ||
325
+ (currentClause === `from` && tokenIs(this.tokens[i], `comma`))) {
326
+ const sqlObj = this.getRefAtToken(i + 1);
327
+ if (sqlObj) {
328
+ doAdd(sqlObj);
329
+ i += sqlObj.tokens.length;
330
+ if (sqlObj.isUDTF || sqlObj.fromLateral) {
331
+ i += 3; //For the brackets
332
+ }
333
+ }
334
+ }
335
+ else if (currentClause === `select` &&
336
+ tokenIs(this.tokens[i], `function`)) {
337
+ const sqlObj = this.getRefAtToken(i);
338
+ if (sqlObj) {
339
+ doAdd(sqlObj);
340
+ i += sqlObj.tokens.length;
341
+ if (sqlObj.isUDTF || sqlObj.fromLateral) {
342
+ i += 3; //For the brackets
343
+ }
344
+ }
345
+ }
346
+ else if (currentClause === `from` &&
347
+ tokenIs(this.tokens[i], `function`)) {
348
+ const sqlObj = this.getRefAtToken(i, { includeParameters: true });
349
+ if (sqlObj) {
350
+ i += sqlObj.tokens.length;
351
+ if (sqlObj.isUDTF || sqlObj.fromLateral) {
352
+ i += 3; //For the brackets
353
+ }
354
+ }
355
+ }
356
+ }
357
+ };
358
+ let inFromClause = false;
359
+ switch (this.type) {
360
+ case StatementType.Call:
361
+ // CALL X()
362
+ doAdd(this.getRefAtToken(1, { includeParameters: true }));
363
+ break;
364
+ case StatementType.Alter:
365
+ if (this.tokens.length >= 3) {
366
+ let object = this.getRefAtToken(2, { withSystemName: true });
367
+ if (object) {
368
+ object.createType = this.tokens[1].value;
369
+ doAdd(object);
370
+ for (let i = object.tokens.length + 2; i < this.tokens.length; i++) {
371
+ if (tokenIs(this.tokens[i], `keyword`, `REFERENCES`)) {
372
+ doAdd(this.getRefAtToken(i + 1, { withSystemName: true }));
373
+ }
374
+ }
375
+ }
376
+ }
377
+ break;
378
+ case StatementType.With:
379
+ basicQueryFinder(0);
380
+ break;
381
+ case StatementType.Insert:
382
+ case StatementType.Select:
383
+ case StatementType.Delete:
384
+ basicQueryFinder(0);
385
+ break;
386
+ case StatementType.Create:
387
+ let object;
388
+ let postName;
389
+ if (tokenIs(this.tokens[1], `keyword`, `OR`) &&
390
+ tokenIs(this.tokens[2], `keyword`, `REPLACE`)) {
391
+ object = this.getRefAtToken(4, { withSystemName: true });
392
+ if (object) {
393
+ postName = object.tokens.length + 4;
394
+ object.createType = this.tokens[3].value;
395
+ }
396
+ }
397
+ else if (tokenIs(this.tokens[1], `keyword`, `UNIQUE`)) {
398
+ object = this.getRefAtToken(3, { withSystemName: true });
399
+ if (object) {
400
+ postName = object.tokens.length + 3;
401
+ object.createType = this.tokens[2].value;
402
+ }
403
+ }
404
+ else {
405
+ object = this.getRefAtToken(2, { withSystemName: true });
406
+ if (object) {
407
+ postName = object.tokens.length + 2;
408
+ object.createType = this.tokens[1].value;
409
+ }
410
+ }
411
+ doAdd(object);
412
+ if (object && postName) {
413
+ switch (object.createType?.toUpperCase()) {
414
+ case `FUNCTION`:
415
+ case `PROCEDURE`:
416
+ // For functions, perhaps we can use the SPECIFIC keyword for the system name
417
+ for (let i = postName; i < this.tokens.length; i++) {
418
+ if (tokenIs(this.tokens[i], `keyword`, `SPECIFIC`) &&
419
+ this.tokens[i + 1]) {
420
+ object.object.system = this.tokens[i + 1].value;
421
+ i++;
422
+ }
423
+ // Support for external name
424
+ if (tokenIs(this.tokens[i], `keyword`, `EXTERNAL`) &&
425
+ tokenIs(this.tokens[i + 1], `word`, `NAME`) &&
426
+ this.tokens[i + 2]) {
427
+ const externalRef = this.getRefAtToken(i + 2);
428
+ if (externalRef) {
429
+ externalRef.createType = `external`;
430
+ externalRef.alias = undefined;
431
+ externalRef.object.system = externalRef.object.name;
432
+ i += externalRef.tokens.length + 2;
433
+ doAdd(externalRef);
434
+ }
435
+ }
436
+ }
437
+ break;
438
+ case `INDEX`:
439
+ // If the type is `INDEX`, the next reference is the `ON` keyword
440
+ for (let i = postName; i < this.tokens.length; i++) {
441
+ if (tokenIs(this.tokens[i], `keyword`, `ON`)) {
442
+ doAdd(this.getRefAtToken(i + 1));
443
+ break;
444
+ }
445
+ }
446
+ break;
447
+ case `VARIABLE`:
448
+ if (postName) {
449
+ object.createType = Statement.formatSimpleTokens(this.tokens.slice(postName));
450
+ }
451
+ break;
452
+ case `VIEW`:
453
+ case `TABLE`:
454
+ const asKeyword = this.tokens.findIndex((token) => tokenIs(token, `keyword`, `AS`));
455
+ if (asKeyword > 0) {
456
+ basicQueryFinder(asKeyword);
457
+ }
458
+ break;
459
+ }
460
+ }
461
+ break;
462
+ case StatementType.Declare:
463
+ if (tokenIs(this.tokens[2], `keyword`, `HANDLER`)) {
464
+ // DECLARE XX HANDLER FOR....
465
+ let def = {
466
+ object: { name: this.tokens[1].value },
467
+ tokens: this.tokens.slice(1, 3),
468
+ };
469
+ def.createType = `Handler`;
470
+ doAdd(def);
471
+ }
472
+ else if (tokenIs(this.tokens[2], `word`, `PROCEDURE`)) {
473
+ // DECLARE XX PROCEDURE..
474
+ }
475
+ else if ((tokenIs(this.tokens[1], `word`, `GLOBAL`) &&
476
+ tokenIs(this.tokens[2], `word`, `TEMPORARY`),
477
+ tokenIs(this.tokens[3], `word`, `TABLE`))) {
478
+ // Handle DECLARE GLOBAL TEMP TABLE x.x ()...
479
+ let def = this.getRefAtToken(4);
480
+ def.createType = `Temporary Table`;
481
+ doAdd(def);
482
+ }
483
+ else if (tokenIs(this.tokens[1], `word`)) {
484
+ // DECLARE XX TYPE DEFAULT ..
485
+ let def = {
486
+ object: { name: this.tokens[1].value },
487
+ tokens: this.tokens.slice(1),
488
+ };
489
+ if (tokenIs(this.tokens[2], `keyword`, `CURSOR`)) {
490
+ def.createType = `Cursor`;
491
+ }
492
+ else {
493
+ let defaultIndex = this.tokens.findIndex((t) => tokenIs(t, `keyword`, `DEFAULT`));
494
+ const valueTokens = this.tokens.slice(2, defaultIndex >= 0 ? defaultIndex : undefined);
495
+ def.createType = Statement.formatSimpleTokens(valueTokens);
496
+ }
497
+ doAdd(def);
498
+ }
499
+ break;
500
+ }
501
+ return list;
502
+ }
503
+ getRefAtToken(i, options = {}) {
504
+ let sqlObj;
505
+ let nextIndex = i;
506
+ let nextToken = this.tokens[i];
507
+ let endIndex = i;
508
+ const isSubSelect = tokenIs(nextToken, `function`, `TABLE`) ||
509
+ tokenIs(nextToken, `function`, `LATERAL`) ||
510
+ (options.includeParameters &&
511
+ tokenIs(nextToken, `function`) &&
512
+ this.type !== StatementType.Call);
513
+ if (isSubSelect) {
514
+ sqlObj = this.getRefAtToken(i + 2);
515
+ if (sqlObj) {
516
+ sqlObj.isUDTF = true;
517
+ const blockTokens = this.getBlockAt(sqlObj.tokens[0].range.end);
518
+ sqlObj.tokens = blockTokens;
519
+ nextIndex = i + 2 + blockTokens.length;
520
+ nextToken = this.tokens[nextIndex];
521
+ }
522
+ else {
523
+ nextIndex = -1;
524
+ nextToken = undefined;
525
+ }
526
+ }
527
+ else {
528
+ if (nextToken && NameTypes.includes(nextToken.type)) {
529
+ nextIndex = i;
530
+ endIndex = i;
531
+ sqlObj = {
532
+ tokens: [],
533
+ object: {
534
+ name: nextToken.value,
535
+ },
536
+ };
537
+ if (tokenIs(this.tokens[i + 1], `dot`) ||
538
+ tokenIs(this.tokens[i + 1], `forwardslash`)) {
539
+ nextIndex = i + 2;
540
+ nextToken = this.tokens[nextIndex];
541
+ endIndex = nextToken ? nextIndex : i + 1;
542
+ sqlObj = {
543
+ tokens: [],
544
+ object: {
545
+ schema: this.tokens[i].value,
546
+ name: nextToken && NameTypes.includes(nextToken.type)
547
+ ? nextToken.value
548
+ : undefined,
549
+ },
550
+ };
551
+ }
552
+ }
553
+ }
554
+ if (sqlObj) {
555
+ if (options.withSystemName !== true) {
556
+ // If the next token is not a clause.. we might have the alias
557
+ if (nextToken && this.tokens[nextIndex + 1]) {
558
+ if (tokenIs(this.tokens[nextIndex + 1], `keyword`, `AS`) &&
559
+ tokenIs(this.tokens[nextIndex + 2], `word`)) {
560
+ endIndex = nextIndex + 2;
561
+ sqlObj.alias = this.tokens[nextIndex + 2].value;
562
+ }
563
+ else if (tokenIs(this.tokens[nextIndex + 1], `word`)) {
564
+ endIndex = nextIndex + 1;
565
+ sqlObj.alias = this.tokens[nextIndex + 1].value;
566
+ }
567
+ }
568
+ }
569
+ if (!isSubSelect && !sqlObj.isUDTF) {
570
+ sqlObj.tokens = this.tokens.slice(i, endIndex + 1);
571
+ if (options.includeParameters &&
572
+ tokenIs(this.tokens[endIndex + 1], `openbracket`)) {
573
+ const blockTokens = this.getBlockAt(this.tokens[endIndex + 1].range.end + 1);
574
+ if (blockTokens.length > 0) {
575
+ sqlObj.tokens = sqlObj.tokens.concat([
576
+ {
577
+ type: `openbracket`,
578
+ value: `(`,
579
+ range: {
580
+ start: this.tokens[endIndex + 1].range.start,
581
+ end: this.tokens[endIndex + 1].range.end,
582
+ },
583
+ },
584
+ ...blockTokens,
585
+ {
586
+ type: `closebracket`,
587
+ value: `)`,
588
+ range: {
589
+ start: blockTokens[blockTokens.length - 1].range.end,
590
+ end: blockTokens[blockTokens.length - 1].range.end,
591
+ },
592
+ },
593
+ ]);
594
+ }
595
+ }
596
+ }
597
+ if (options.withSystemName) {
598
+ if (tokenIs(this.tokens[endIndex + 1], `statementType`, `FOR`) &&
599
+ tokenIs(this.tokens[endIndex + 2], `word`, `SYSTEM`) &&
600
+ tokenIs(this.tokens[endIndex + 3], `word`, `NAME`)) {
601
+ if (this.tokens[endIndex + 4] &&
602
+ NameTypes.includes(this.tokens[endIndex + 4].type)) {
603
+ sqlObj.object.system = this.tokens[endIndex + 4].value;
604
+ }
605
+ }
606
+ }
607
+ }
608
+ return sqlObj;
609
+ }
610
+ /**
611
+ * Gets areas of statement that are likely from embedded statements
612
+ * EXEC SQL
613
+ * INTO area
614
+ * Host variables
615
+ * DECLARE .. CURSOR FOR
616
+ */
617
+ getEmbeddedStatementAreas() {
618
+ // Only these statements support the INTO clause in embedded SQL really
619
+ const validIntoStatements = [
620
+ StatementType.Unknown,
621
+ StatementType.With,
622
+ StatementType.Select,
623
+ ];
624
+ let ranges = [];
625
+ let intoClause;
626
+ let declareStmt;
627
+ let lastTokenWasMarker = false;
628
+ for (let i = 0; i < this.tokens.length; i++) {
629
+ const prevToken = this.tokens[i - 1];
630
+ const currentToken = this.tokens[i];
631
+ if (!tokenIs(currentToken, `colon`)) {
632
+ lastTokenWasMarker = false;
633
+ }
634
+ switch (currentToken.type) {
635
+ case `statementType`:
636
+ const currentValue = currentToken.value.toLowerCase();
637
+ if (declareStmt) {
638
+ if (currentValue === `for`) {
639
+ ranges.push({
640
+ type: `remove`,
641
+ range: {
642
+ start: declareStmt.range.start,
643
+ end: currentToken.range.end,
644
+ },
645
+ });
646
+ declareStmt = undefined;
647
+ }
648
+ continue;
649
+ }
650
+ // If we're in a DECLARE, it's likely a cursor definition
651
+ if (currentValue === `declare`) {
652
+ declareStmt = currentToken;
653
+ }
654
+ break;
655
+ case `clause`:
656
+ if (!validIntoStatements.includes(this.type))
657
+ continue;
658
+ if (declareStmt)
659
+ continue;
660
+ // We need to remove the INTO clause completely.
661
+ if (currentToken.value.toLowerCase() === `into`) {
662
+ intoClause = currentToken;
663
+ }
664
+ else if (intoClause) {
665
+ const endToken = this.tokens[i - 1];
666
+ ranges.push({
667
+ type: `remove`,
668
+ range: {
669
+ start: intoClause.range.start,
670
+ end: endToken.range.end,
671
+ },
672
+ });
673
+ intoClause = undefined;
674
+ }
675
+ break;
676
+ case `questionmark`:
677
+ if (intoClause)
678
+ continue;
679
+ if (declareStmt)
680
+ continue;
681
+ ranges.push({
682
+ type: `marker`,
683
+ range: currentToken.range,
684
+ });
685
+ break;
686
+ case `colon`:
687
+ if (intoClause)
688
+ continue;
689
+ if (declareStmt)
690
+ continue;
691
+ if (prevToken && prevToken.type === `string`)
692
+ continue;
693
+ let nextMustBe = `word`;
694
+ let followingTokenI = i + 1;
695
+ let endToken;
696
+ // Handles when we have a host variable
697
+ // This logic supports qualified host variables
698
+ // i.e. :myvar or :mystruct.subf
699
+ let followingToken = this.tokens[followingTokenI];
700
+ while (followingToken && followingToken.type === nextMustBe) {
701
+ switch (followingToken.type) {
702
+ case `word`:
703
+ nextMustBe = `dot`;
704
+ break;
705
+ case `dot`:
706
+ nextMustBe = `word`;
707
+ break;
708
+ }
709
+ endToken = followingToken;
710
+ followingTokenI++;
711
+ followingToken = this.tokens[followingTokenI];
712
+ }
713
+ if (endToken) {
714
+ ranges.push({
715
+ type: lastTokenWasMarker ? `remove` : `marker`,
716
+ range: {
717
+ start: currentToken.range.start,
718
+ end: endToken.range.end,
719
+ },
720
+ named: endToken.value,
721
+ });
722
+ lastTokenWasMarker = true;
723
+ i = followingTokenI - 1;
724
+ }
725
+ break;
726
+ default:
727
+ if (i === 0 && tokenIs(currentToken, `word`, `EXEC`)) {
728
+ // We check and remove the starting `EXEC SQL`
729
+ if (tokenIs(this.tokens[i + 1], `word`, `SQL`)) {
730
+ ranges.push({
731
+ type: `remove`,
732
+ range: {
733
+ start: currentToken.range.start,
734
+ end: this.tokens[i + 1].range.end,
735
+ },
736
+ });
737
+ }
738
+ }
739
+ break;
740
+ }
741
+ }
742
+ return ranges;
743
+ }
744
+ static trimTokens(tokens) {
745
+ if (tokens.length > 0) {
746
+ let realFirstToken = tokens.findIndex((t) => t.type !== `newline`);
747
+ if (realFirstToken < 0)
748
+ realFirstToken = 0;
749
+ let realLastToken = 0;
750
+ for (let i = tokens.length - 1; i >= 0; i--) {
751
+ if (tokens[i].type !== `newline`) {
752
+ realLastToken = i + 1;
753
+ break;
754
+ }
755
+ }
756
+ tokens = tokens.slice(realFirstToken, realLastToken);
757
+ }
758
+ return tokens;
759
+ }
760
+ static formatSimpleTokens(tokens) {
761
+ let outString = ``;
762
+ for (let i = 0; i < tokens.length; i++) {
763
+ const cT = tokens[i];
764
+ const nT = tokens[i + 1];
765
+ const pT = tokens[i - 1];
766
+ switch (cT.type) {
767
+ case `block`:
768
+ outString += `(${Statement.formatSimpleTokens(cT.block)})`;
769
+ if (nT && nT.type !== `closebracket`) {
770
+ outString += ` `;
771
+ }
772
+ break;
773
+ case `openbracket`:
774
+ outString += cT.value;
775
+ break;
776
+ case `closebracket`:
777
+ outString += cT.value;
778
+ if (nT && nT.type !== cT.type) {
779
+ outString += ` `;
780
+ }
781
+ break;
782
+ default:
783
+ if (nT &&
784
+ ![`closebracket`, `openbracket`, `comma`, `block`].includes(nT.type)) {
785
+ outString += `${cT.value} `;
786
+ }
787
+ else {
788
+ outString += cT.value;
789
+ }
790
+ break;
791
+ }
792
+ }
793
+ return outString.trimEnd();
794
+ }
795
+ }
796
+ //# sourceMappingURL=statement.js.map