agentlang 0.0.2

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 (240) hide show
  1. package/LICENSE +83 -0
  2. package/README.md +120 -0
  3. package/bin/cli.js +4 -0
  4. package/out/api/http.d.ts +3 -0
  5. package/out/api/http.d.ts.map +1 -0
  6. package/out/api/http.js +290 -0
  7. package/out/api/http.js.map +1 -0
  8. package/out/cli/cli-util.d.ts +7 -0
  9. package/out/cli/cli-util.d.ts.map +1 -0
  10. package/out/cli/cli-util.js +9 -0
  11. package/out/cli/cli-util.js.map +1 -0
  12. package/out/cli/docs.d.ts +2 -0
  13. package/out/cli/docs.d.ts.map +1 -0
  14. package/out/cli/docs.js +236 -0
  15. package/out/cli/docs.js.map +1 -0
  16. package/out/cli/main.d.ts +288 -0
  17. package/out/cli/main.d.ts.map +1 -0
  18. package/out/cli/main.js +119 -0
  19. package/out/cli/main.js.map +1 -0
  20. package/out/cli/openapi-docs.yml +695 -0
  21. package/out/extension/main.cjs +18093 -0
  22. package/out/extension/main.cjs.map +7 -0
  23. package/out/extension/main.d.ts +4 -0
  24. package/out/extension/main.d.ts.map +1 -0
  25. package/out/extension/main.js +42 -0
  26. package/out/extension/main.js.map +1 -0
  27. package/out/language/agentlang-module.d.ts +42 -0
  28. package/out/language/agentlang-module.d.ts.map +1 -0
  29. package/out/language/agentlang-module.js +42 -0
  30. package/out/language/agentlang-module.js.map +1 -0
  31. package/out/language/agentlang-validator.d.ts +15 -0
  32. package/out/language/agentlang-validator.d.ts.map +1 -0
  33. package/out/language/agentlang-validator.js +50 -0
  34. package/out/language/agentlang-validator.js.map +1 -0
  35. package/out/language/generated/ast.d.ts +491 -0
  36. package/out/language/generated/ast.d.ts.map +1 -0
  37. package/out/language/generated/ast.js +934 -0
  38. package/out/language/generated/ast.js.map +1 -0
  39. package/out/language/generated/grammar.d.ts +7 -0
  40. package/out/language/generated/grammar.d.ts.map +1 -0
  41. package/out/language/generated/grammar.js +4475 -0
  42. package/out/language/generated/grammar.js.map +1 -0
  43. package/out/language/generated/module.d.ts +14 -0
  44. package/out/language/generated/module.d.ts.map +1 -0
  45. package/out/language/generated/module.js +21 -0
  46. package/out/language/generated/module.js.map +1 -0
  47. package/out/language/main-browser.d.ts +2 -0
  48. package/out/language/main-browser.d.ts.map +1 -0
  49. package/out/language/main-browser.js +10 -0
  50. package/out/language/main-browser.js.map +1 -0
  51. package/out/language/main.cjs +36229 -0
  52. package/out/language/main.cjs.map +7 -0
  53. package/out/language/main.d.ts +2 -0
  54. package/out/language/main.d.ts.map +1 -0
  55. package/out/language/main.js +11 -0
  56. package/out/language/main.js.map +1 -0
  57. package/out/language/parser.d.ts +9 -0
  58. package/out/language/parser.d.ts.map +1 -0
  59. package/out/language/parser.js +273 -0
  60. package/out/language/parser.js.map +1 -0
  61. package/out/language/syntax.d.ts +155 -0
  62. package/out/language/syntax.d.ts.map +1 -0
  63. package/out/language/syntax.js +527 -0
  64. package/out/language/syntax.js.map +1 -0
  65. package/out/runtime/agents/common.d.ts +2 -0
  66. package/out/runtime/agents/common.d.ts.map +1 -0
  67. package/out/runtime/agents/common.js +178 -0
  68. package/out/runtime/agents/common.js.map +1 -0
  69. package/out/runtime/agents/impl/openai.d.ts +8 -0
  70. package/out/runtime/agents/impl/openai.d.ts.map +1 -0
  71. package/out/runtime/agents/impl/openai.js +15 -0
  72. package/out/runtime/agents/impl/openai.js.map +1 -0
  73. package/out/runtime/agents/provider.d.ts +21 -0
  74. package/out/runtime/agents/provider.d.ts.map +1 -0
  75. package/out/runtime/agents/provider.js +32 -0
  76. package/out/runtime/agents/provider.js.map +1 -0
  77. package/out/runtime/agents/registry.d.ts +2 -0
  78. package/out/runtime/agents/registry.d.ts.map +1 -0
  79. package/out/runtime/agents/registry.js +10 -0
  80. package/out/runtime/agents/registry.js.map +1 -0
  81. package/out/runtime/auth/cognito.d.ts +16 -0
  82. package/out/runtime/auth/cognito.d.ts.map +1 -0
  83. package/out/runtime/auth/cognito.js +186 -0
  84. package/out/runtime/auth/cognito.js.map +1 -0
  85. package/out/runtime/auth/defs.d.ts +11 -0
  86. package/out/runtime/auth/defs.d.ts.map +1 -0
  87. package/out/runtime/auth/defs.js +24 -0
  88. package/out/runtime/auth/defs.js.map +1 -0
  89. package/out/runtime/auth/interface.d.ts +22 -0
  90. package/out/runtime/auth/interface.d.ts.map +1 -0
  91. package/out/runtime/auth/interface.js +2 -0
  92. package/out/runtime/auth/interface.js.map +1 -0
  93. package/out/runtime/defs.js +24 -0
  94. package/out/runtime/defs.js.map +1 -0
  95. package/out/runtime/interpreter.d.ts +69 -0
  96. package/out/runtime/interpreter.d.ts.map +1 -0
  97. package/out/runtime/interpreter.js +1163 -0
  98. package/out/runtime/interpreter.js.map +1 -0
  99. package/out/runtime/loader.d.ts +25 -0
  100. package/out/runtime/loader.d.ts.map +1 -0
  101. package/out/runtime/loader.js +346 -0
  102. package/out/runtime/loader.js.map +1 -0
  103. package/out/runtime/logger.d.ts +2 -0
  104. package/out/runtime/logger.d.ts.map +1 -0
  105. package/out/runtime/logger.js +44 -0
  106. package/out/runtime/logger.js.map +1 -0
  107. package/out/runtime/module.d.ts +273 -0
  108. package/out/runtime/module.d.ts.map +1 -0
  109. package/out/runtime/module.js +1786 -0
  110. package/out/runtime/module.js.map +1 -0
  111. package/out/runtime/modules/ai.d.ts +26 -0
  112. package/out/runtime/modules/ai.d.ts.map +1 -0
  113. package/out/runtime/modules/ai.js +211 -0
  114. package/out/runtime/modules/ai.js.map +1 -0
  115. package/out/runtime/modules/auth.d.ts +39 -0
  116. package/out/runtime/modules/auth.d.ts.map +1 -0
  117. package/out/runtime/modules/auth.js +359 -0
  118. package/out/runtime/modules/auth.js.map +1 -0
  119. package/out/runtime/modules/core.d.ts +2 -0
  120. package/out/runtime/modules/core.d.ts.map +1 -0
  121. package/out/runtime/modules/core.js +67 -0
  122. package/out/runtime/modules/core.js.map +1 -0
  123. package/out/runtime/relgraph.d.ts +21 -0
  124. package/out/runtime/relgraph.d.ts.map +1 -0
  125. package/out/runtime/relgraph.js +156 -0
  126. package/out/runtime/relgraph.js.map +1 -0
  127. package/out/runtime/resolvers/interface.d.ts +59 -0
  128. package/out/runtime/resolvers/interface.d.ts.map +1 -0
  129. package/out/runtime/resolvers/interface.js +111 -0
  130. package/out/runtime/resolvers/interface.js.map +1 -0
  131. package/out/runtime/resolvers/registry.d.ts +8 -0
  132. package/out/runtime/resolvers/registry.d.ts.map +1 -0
  133. package/out/runtime/resolvers/registry.js +26 -0
  134. package/out/runtime/resolvers/registry.js.map +1 -0
  135. package/out/runtime/resolvers/sqldb/database.d.ts +50 -0
  136. package/out/runtime/resolvers/sqldb/database.d.ts.map +1 -0
  137. package/out/runtime/resolvers/sqldb/database.js +618 -0
  138. package/out/runtime/resolvers/sqldb/database.js.map +1 -0
  139. package/out/runtime/resolvers/sqldb/dbutil.d.ts +18 -0
  140. package/out/runtime/resolvers/sqldb/dbutil.d.ts.map +1 -0
  141. package/out/runtime/resolvers/sqldb/dbutil.js +221 -0
  142. package/out/runtime/resolvers/sqldb/dbutil.js.map +1 -0
  143. package/out/runtime/resolvers/sqldb/impl.d.ts +26 -0
  144. package/out/runtime/resolvers/sqldb/impl.d.ts.map +1 -0
  145. package/out/runtime/resolvers/sqldb/impl.js +300 -0
  146. package/out/runtime/resolvers/sqldb/impl.js.map +1 -0
  147. package/out/runtime/state.js +83 -0
  148. package/out/runtime/state.js.map +1 -0
  149. package/out/runtime/util.d.ts +43 -0
  150. package/out/runtime/util.d.ts.map +1 -0
  151. package/out/runtime/util.js +447 -0
  152. package/out/runtime/util.js.map +1 -0
  153. package/out/setupClassic.d.ts +98 -0
  154. package/out/setupClassic.d.ts.map +1 -0
  155. package/out/setupClassic.js +38 -0
  156. package/out/setupClassic.js.map +1 -0
  157. package/out/setupCommon.d.ts +2 -0
  158. package/out/setupCommon.d.ts.map +1 -0
  159. package/out/setupCommon.js +33 -0
  160. package/out/setupCommon.js.map +1 -0
  161. package/out/setupExtended.d.ts +40 -0
  162. package/out/setupExtended.d.ts.map +1 -0
  163. package/out/setupExtended.js +67 -0
  164. package/out/setupExtended.js.map +1 -0
  165. package/out/syntaxes/agentlang.monarch.d.ts +77 -0
  166. package/out/syntaxes/agentlang.monarch.d.ts.map +1 -0
  167. package/out/syntaxes/agentlang.monarch.js +31 -0
  168. package/out/syntaxes/agentlang.monarch.js.map +1 -0
  169. package/out/utils/fs/index.d.ts +14 -0
  170. package/out/utils/fs/index.d.ts.map +1 -0
  171. package/out/utils/fs/index.js +26 -0
  172. package/out/utils/fs/index.js.map +1 -0
  173. package/out/utils/fs/interfaces.d.ts +105 -0
  174. package/out/utils/fs/interfaces.d.ts.map +1 -0
  175. package/out/utils/fs/interfaces.js +5 -0
  176. package/out/utils/fs/interfaces.js.map +1 -0
  177. package/out/utils/fs/lightning-fs.d.ts +116 -0
  178. package/out/utils/fs/lightning-fs.d.ts.map +1 -0
  179. package/out/utils/fs/lightning-fs.js +243 -0
  180. package/out/utils/fs/lightning-fs.js.map +1 -0
  181. package/out/utils/fs/node-fs.d.ts +93 -0
  182. package/out/utils/fs/node-fs.d.ts.map +1 -0
  183. package/out/utils/fs/node-fs.js +169 -0
  184. package/out/utils/fs/node-fs.js.map +1 -0
  185. package/out/utils/fs-utils.d.ts +153 -0
  186. package/out/utils/fs-utils.d.ts.map +1 -0
  187. package/out/utils/fs-utils.js +271 -0
  188. package/out/utils/fs-utils.js.map +1 -0
  189. package/out/utils/runtime.d.ts +36 -0
  190. package/out/utils/runtime.d.ts.map +1 -0
  191. package/out/utils/runtime.js +39 -0
  192. package/out/utils/runtime.js.map +1 -0
  193. package/package.json +155 -0
  194. package/src/api/http.ts +361 -0
  195. package/src/cli/cli-util.ts +18 -0
  196. package/src/cli/main.ts +146 -0
  197. package/src/extension/main.ts +51 -0
  198. package/src/language/agentlang-module.ts +75 -0
  199. package/src/language/agentlang-validator.ts +60 -0
  200. package/src/language/agentlang.langium +178 -0
  201. package/src/language/generated/ast.ts +1698 -0
  202. package/src/language/generated/grammar.ts +4477 -0
  203. package/src/language/generated/module.ts +25 -0
  204. package/src/language/main-browser.ts +19 -0
  205. package/src/language/main.ts +13 -0
  206. package/src/language/parser.ts +329 -0
  207. package/src/language/syntax.ts +646 -0
  208. package/src/runtime/agents/common.ts +177 -0
  209. package/src/runtime/agents/impl/openai.ts +19 -0
  210. package/src/runtime/agents/provider.ts +58 -0
  211. package/src/runtime/agents/registry.ts +9 -0
  212. package/src/runtime/auth/cognito.ts +225 -0
  213. package/src/runtime/auth/defs.ts +33 -0
  214. package/src/runtime/auth/interface.ts +31 -0
  215. package/src/runtime/defs.ts +33 -0
  216. package/src/runtime/interpreter.ts +1352 -0
  217. package/src/runtime/loader.ts +450 -0
  218. package/src/runtime/logger.ts +51 -0
  219. package/src/runtime/module.ts +2188 -0
  220. package/src/runtime/modules/ai.ts +257 -0
  221. package/src/runtime/modules/auth.ts +489 -0
  222. package/src/runtime/modules/core.ts +95 -0
  223. package/src/runtime/relgraph.ts +195 -0
  224. package/src/runtime/resolvers/interface.ts +160 -0
  225. package/src/runtime/resolvers/registry.ts +30 -0
  226. package/src/runtime/resolvers/sqldb/database.ts +823 -0
  227. package/src/runtime/resolvers/sqldb/dbutil.ts +257 -0
  228. package/src/runtime/resolvers/sqldb/impl.ts +471 -0
  229. package/src/runtime/state.ts +87 -0
  230. package/src/runtime/util.ts +513 -0
  231. package/src/setupClassic.ts +43 -0
  232. package/src/setupCommon.ts +33 -0
  233. package/src/setupExtended.ts +79 -0
  234. package/src/syntaxes/agentlang.monarch.ts +31 -0
  235. package/src/utils/fs/index.ts +28 -0
  236. package/src/utils/fs/interfaces.ts +118 -0
  237. package/src/utils/fs/lightning-fs.ts +284 -0
  238. package/src/utils/fs/node-fs.ts +185 -0
  239. package/src/utils/fs-utils.ts +304 -0
  240. package/src/utils/runtime.ts +43 -0
@@ -0,0 +1,25 @@
1
+ /******************************************************************************
2
+ * This file was generated by langium-cli 3.5.0.
3
+ * DO NOT EDIT MANUALLY!
4
+ ******************************************************************************/
5
+
6
+ import type { LangiumSharedCoreServices, LangiumCoreServices, LangiumGeneratedCoreServices, LangiumGeneratedSharedCoreServices, LanguageMetaData, Module } from 'langium';
7
+ import { AgentlangAstReflection } from './ast.js';
8
+ import { AgentlangGrammar } from './grammar.js';
9
+
10
+ export const AgentlangLanguageMetaData = {
11
+ languageId: 'agentlang',
12
+ fileExtensions: ['.al'],
13
+ caseInsensitive: false,
14
+ mode: 'development'
15
+ } as const satisfies LanguageMetaData;
16
+
17
+ export const AgentlangGeneratedSharedModule: Module<LangiumSharedCoreServices, LangiumGeneratedSharedCoreServices> = {
18
+ AstReflection: () => new AgentlangAstReflection()
19
+ };
20
+
21
+ export const AgentlangGeneratedModule: Module<LangiumCoreServices, LangiumGeneratedCoreServices> = {
22
+ Grammar: () => AgentlangGrammar(),
23
+ LanguageMetaData: () => AgentlangLanguageMetaData,
24
+ parser: {}
25
+ };
@@ -0,0 +1,19 @@
1
+ import { EmptyFileSystem } from 'langium';
2
+ import { startLanguageServer } from 'langium/lsp';
3
+ import {
4
+ BrowserMessageReader,
5
+ BrowserMessageWriter,
6
+ createConnection,
7
+ } from 'vscode-languageserver/browser.js';
8
+ import { createAgentlangServices } from './agentlang-module.js';
9
+
10
+ declare const self: DedicatedWorkerGlobalScope;
11
+
12
+ const messageReader = new BrowserMessageReader(self);
13
+ const messageWriter = new BrowserMessageWriter(self);
14
+
15
+ const connection = createConnection(messageReader, messageWriter);
16
+
17
+ const { shared } = createAgentlangServices({ connection, ...EmptyFileSystem });
18
+
19
+ startLanguageServer(shared);
@@ -0,0 +1,13 @@
1
+ import { startLanguageServer } from 'langium/lsp';
2
+ import { NodeFileSystem } from 'langium/node';
3
+ import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js';
4
+ import { createAgentlangServices } from './agentlang-module.js';
5
+
6
+ // Create a connection to the client
7
+ const connection = createConnection(ProposedFeatures.all);
8
+
9
+ // Inject the shared services and language-specific services
10
+ const { shared } = createAgentlangServices({ connection, ...NodeFileSystem });
11
+
12
+ // Start the language server with the shared services
13
+ startLanguageServer(shared);
@@ -0,0 +1,329 @@
1
+ import { createAgentlangServices } from '../language/agentlang-module.js';
2
+ import { AstNode, EmptyFileSystem, LangiumCoreServices, LangiumDocument, URI } from 'langium';
3
+ import {
4
+ CrudMap,
5
+ Delete,
6
+ Expr,
7
+ ForEach,
8
+ Group,
9
+ Handler,
10
+ If,
11
+ isGroup,
12
+ isLiteral,
13
+ isNegExpr,
14
+ isNotExpr,
15
+ isPrimExpr,
16
+ isWorkflowDefinition,
17
+ Literal,
18
+ ModuleDefinition,
19
+ NegExpr,
20
+ NotExpr,
21
+ Pattern,
22
+ PrimExpr,
23
+ RelationshipPattern,
24
+ SetAttribute,
25
+ Statement,
26
+ WorkflowDefinition,
27
+ } from './generated/ast.js';
28
+ import { firstAliasSpec, firstCatchSpec, QuerySuffix } from '../runtime/util.js';
29
+ import {
30
+ BasePattern,
31
+ CrudPattern,
32
+ DeletePattern,
33
+ ExpressionPattern,
34
+ ForEachPattern,
35
+ FunctionCallPattern,
36
+ GroupExpressionPattern,
37
+ IfPattern,
38
+ LiteralPattern,
39
+ NegExpressionPattern,
40
+ NotExpressionPattern,
41
+ } from './syntax.js';
42
+
43
+ let nextDocumentId = 1;
44
+
45
+ export function parseHelper<T extends AstNode = AstNode>(
46
+ services: LangiumCoreServices
47
+ ): (input: string, options?: any) => Promise<LangiumDocument<T>> {
48
+ const metaData = services.LanguageMetaData;
49
+ const documentBuilder = services.shared.workspace.DocumentBuilder;
50
+ return async (input: string, options?: any) => {
51
+ const uri = URI.parse(
52
+ options?.documentUri ?? `file:///${nextDocumentId++}${metaData.fileExtensions[0] ?? ''}`
53
+ );
54
+ const document = services.shared.workspace.LangiumDocumentFactory.fromString<T>(
55
+ input,
56
+ uri,
57
+ options?.parserOptions
58
+ );
59
+ services.shared.workspace.LangiumDocuments.addDocument(document);
60
+ await documentBuilder.build([document], options);
61
+ return document;
62
+ };
63
+ }
64
+
65
+ const services = createAgentlangServices(EmptyFileSystem);
66
+ export const parse = parseHelper<ModuleDefinition>(services.Agentlang);
67
+
68
+ export async function parseModule(moduleDef: string): Promise<ModuleDefinition> {
69
+ const document = await parse(moduleDef, { validation: true });
70
+ maybeRaiseParserErrors(document);
71
+ return document.parseResult.value;
72
+ }
73
+
74
+ export async function parseStatement(stmt: string): Promise<Statement> {
75
+ let result: Statement | undefined;
76
+ const mod: ModuleDefinition = await parseModule(`module Temp\nworkflow TempEvent { ${stmt} }`);
77
+ if (isWorkflowDefinition(mod.defs[0])) {
78
+ result = mod.defs[0].statements[0];
79
+ } else {
80
+ throw new Error('Failed to extract workflow-statement');
81
+ }
82
+ if (result) {
83
+ return result;
84
+ } else {
85
+ throw new Error('There was an error parsing the statement');
86
+ }
87
+ }
88
+
89
+ export async function parseWorkflow(workflowDef: string): Promise<WorkflowDefinition> {
90
+ const mod = await parseModule(`module Temp ${workflowDef}`);
91
+ if (isWorkflowDefinition(mod.defs[0])) {
92
+ return mod.defs[0] as WorkflowDefinition;
93
+ } else {
94
+ throw new Error(`Failed to generated workflow from ${workflowDef}`);
95
+ }
96
+ }
97
+
98
+ function maybeRaiseParserErrors(document: LangiumDocument) {
99
+ if (document.parseResult.lexerErrors.length > 0 || document.parseResult.parserErrors.length > 0) {
100
+ const errs: Array<string> = [];
101
+ document.parseResult.lexerErrors.forEach((v: any) => {
102
+ errs.push(v.message);
103
+ });
104
+ document.parseResult.parserErrors.forEach((v: any) => {
105
+ errs.push(v.message);
106
+ });
107
+ throw new Error(`There were parser errors: \n ${errs.join('\n')}`);
108
+ }
109
+ }
110
+
111
+ export async function introspect(s: string): Promise<BasePattern[]> {
112
+ let result: BasePattern[] = [];
113
+ const v: LangiumDocument<ModuleDefinition> = await parse(`module Temp workflow Test {${s}}`);
114
+ if (v.parseResult.lexerErrors.length > 0) {
115
+ throw new Error(
116
+ `Lexer errors: ${v.parseResult.lexerErrors
117
+ .map((err: any) => {
118
+ return err.message;
119
+ })
120
+ .join('\n')}`
121
+ );
122
+ }
123
+ if (v.parseResult.parserErrors.length > 0) {
124
+ throw new Error(
125
+ `Parser errors: ${v.parseResult.parserErrors
126
+ .map((err: any) => {
127
+ return err.message;
128
+ })
129
+ .join('\n')}`
130
+ );
131
+ }
132
+ if (isWorkflowDefinition(v.parseResult.value.defs[0])) {
133
+ result = introspectHelper(v.parseResult.value.defs[0].statements);
134
+ } else {
135
+ throw new Error(`Failed to parse statements`);
136
+ }
137
+ return result;
138
+ }
139
+
140
+ function introspectHelper(stmts: Statement[]): BasePattern[] {
141
+ const result: BasePattern[] = [];
142
+ stmts.forEach((stmt: Statement) => {
143
+ result.push(introspectStatement(stmt));
144
+ });
145
+ return result;
146
+ }
147
+
148
+ function introspectStatement(stmt: Statement): BasePattern {
149
+ const r: BasePattern = introspectPattern(stmt.pattern);
150
+ const aliasSpec = firstAliasSpec(stmt);
151
+ if (aliasSpec) {
152
+ if (aliasSpec.alias) {
153
+ r.setAlias(aliasSpec.alias);
154
+ } else if (aliasSpec.aliases.length > 0) {
155
+ r.setAliases(aliasSpec.aliases);
156
+ }
157
+ }
158
+ const catchSpec = firstCatchSpec(stmt);
159
+ if (catchSpec) {
160
+ catchSpec.handlers.forEach((h: Handler) => {
161
+ r.addHandler(h.except, introspectStatement(h.stmt));
162
+ });
163
+ }
164
+ return r;
165
+ }
166
+
167
+ function introspectPattern(pat: Pattern): BasePattern {
168
+ let r: BasePattern | undefined;
169
+ if (pat.crudMap) {
170
+ if (isQueryPattern(pat)) {
171
+ r = introspectQueryPattern(pat.crudMap);
172
+ } else {
173
+ r = introspectCreatePattern(pat.crudMap);
174
+ }
175
+ } else if (pat.literal) {
176
+ r = introspectLiteral(pat.literal);
177
+ } else if (pat.forEach) {
178
+ r = introspectForEach(pat.forEach);
179
+ } else if (pat.if) {
180
+ r = introspectIf(pat.if);
181
+ } else if (pat.delete) {
182
+ r = introspectDelete(pat.delete);
183
+ }
184
+ if (r) return r;
185
+ else {
186
+ throw new Error(`Failed to introspect pattern: ${pat}`);
187
+ }
188
+ }
189
+
190
+ function isQueryPattern(pat: Pattern): boolean {
191
+ if (pat.crudMap) {
192
+ const crudMap: CrudMap = pat.crudMap;
193
+ return (
194
+ crudMap.name.endsWith(QuerySuffix) ||
195
+ (crudMap.attributes.length > 0 &&
196
+ crudMap.attributes.every((v: SetAttribute) => {
197
+ return v.name.endsWith(QuerySuffix);
198
+ }))
199
+ );
200
+ }
201
+ return false;
202
+ }
203
+
204
+ function introspectGroup(expr: Group): GroupExpressionPattern {
205
+ return new GroupExpressionPattern(introspectExpression(expr.ge) as ExpressionPattern);
206
+ }
207
+
208
+ function introspectNegExpr(expr: NegExpr): NegExpressionPattern {
209
+ return new NegExpressionPattern(introspectExpression(expr.ne) as ExpressionPattern);
210
+ }
211
+
212
+ function introspectNotExpr(expr: NotExpr): NotExpressionPattern {
213
+ return new NotExpressionPattern(introspectExpression(expr.ne) as ExpressionPattern);
214
+ }
215
+
216
+ function introspectPrimExpr(expr: PrimExpr): BasePattern {
217
+ if (isLiteral(expr)) {
218
+ return introspectLiteral(expr);
219
+ } else if (isGroup(expr)) {
220
+ return introspectGroup(expr);
221
+ } else if (isNegExpr(expr)) {
222
+ return introspectNegExpr(expr);
223
+ } else if (isNotExpr(expr)) {
224
+ return introspectNotExpr(expr);
225
+ } else {
226
+ throw new Error(`Not a PrimExpr - ${expr}`);
227
+ }
228
+ }
229
+
230
+ function introspectExpression(expr: Expr | Expr): BasePattern {
231
+ if (isPrimExpr(expr)) {
232
+ return introspectPrimExpr(expr);
233
+ }
234
+ if (expr.$cstNode) {
235
+ return new ExpressionPattern(expr.$cstNode.text);
236
+ }
237
+ throw new Error('Failed to introspect expression - ' + expr);
238
+ }
239
+
240
+ function introspectQueryPattern(crudMap: CrudMap): CrudPattern {
241
+ if (crudMap) {
242
+ const cp: CrudPattern = new CrudPattern(crudMap.name);
243
+ crudMap.attributes.forEach((sa: SetAttribute) => {
244
+ cp.addAttribute(sa.name, introspectExpression(sa.value), sa.op);
245
+ });
246
+ crudMap.relationships.forEach((rp: RelationshipPattern) => {
247
+ cp.addRelationship(rp.name, introspectPattern(rp.pattern) as CrudPattern | CrudPattern[]);
248
+ });
249
+ cp.isQuery = true;
250
+ return cp;
251
+ }
252
+ throw new Error(`Failed to introspect query-pattern: ${crudMap}`);
253
+ }
254
+
255
+ function introspectCreatePattern(crudMap: CrudMap): CrudPattern {
256
+ if (crudMap) {
257
+ const cp: CrudPattern = new CrudPattern(crudMap.name);
258
+ crudMap.attributes.forEach((sa: SetAttribute) => {
259
+ if (!cp.isQueryUpdate && sa.name.endsWith(QuerySuffix)) {
260
+ cp.isQueryUpdate = true;
261
+ }
262
+ cp.addAttribute(sa.name, introspectExpression(sa.value), sa.op);
263
+ });
264
+ crudMap.relationships.forEach((rp: RelationshipPattern) => {
265
+ cp.addRelationship(rp.name, introspectPattern(rp.pattern) as CrudPattern | CrudPattern[]);
266
+ });
267
+ if (!cp.isQueryUpdate) {
268
+ cp.isCreate = true;
269
+ }
270
+ return cp;
271
+ }
272
+ throw new Error(`Failed to introspect create-pattern: ${crudMap}`);
273
+ }
274
+
275
+ function introspectLiteral(lit: Literal): BasePattern {
276
+ if (lit.id) {
277
+ return LiteralPattern.Id(lit.id);
278
+ } else if (lit.num) {
279
+ return LiteralPattern.Number(lit.num);
280
+ } else if (lit.ref) {
281
+ return LiteralPattern.Reference(lit.ref);
282
+ } else if (lit.str) {
283
+ return LiteralPattern.String(lit.str);
284
+ } else if (lit.bool) {
285
+ return LiteralPattern.Boolean(lit.bool == 'true' ? true : false);
286
+ } else if (lit.fnCall) {
287
+ return new FunctionCallPattern(
288
+ lit.fnCall.name,
289
+ lit.fnCall.args.map((v: Literal) => {
290
+ return introspectLiteral(v);
291
+ })
292
+ );
293
+ } else if (lit.array) {
294
+ return LiteralPattern.Array(
295
+ lit.array.vals.map((stmt: Statement) => {
296
+ return introspectStatement(stmt);
297
+ })
298
+ );
299
+ } else {
300
+ throw new Error(`Invalid literal - ${lit}`);
301
+ }
302
+ }
303
+
304
+ function introspectForEach(forEach: ForEach): ForEachPattern {
305
+ const fp: ForEachPattern = new ForEachPattern(forEach.var, introspectPattern(forEach.src));
306
+ forEach.statements.forEach((stmt: Statement) => {
307
+ fp.addPattern(introspectStatement(stmt));
308
+ });
309
+ return fp;
310
+ }
311
+
312
+ function introspectIf(ifpat: If): IfPattern {
313
+ const ifp: IfPattern = new IfPattern(introspectExpression(ifpat.cond));
314
+ ifpat.statements.forEach((stmt: Statement) => {
315
+ ifp.addPattern(introspectStatement(stmt));
316
+ });
317
+ if (ifpat.else) {
318
+ ifp.setElse(
319
+ ifpat.else.statements.map((stmt: Statement) => {
320
+ return introspectStatement(stmt);
321
+ })
322
+ );
323
+ }
324
+ return ifp;
325
+ }
326
+
327
+ function introspectDelete(deletePat: Delete): DeletePattern {
328
+ return new DeletePattern(introspectPattern(deletePat.pattern));
329
+ }