sof-mssql 2.1.0 → 2.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.
- package/dist/fhirpath/visitor.d.ts +78 -0
- package/dist/fhirpath/visitor.d.ts.map +1 -1
- package/dist/fhirpath/visitor.js +208 -11
- package/dist/fhirpath/visitor.js.map +1 -1
- package/dist/parser.d.ts +1 -1
- package/dist/parser.js +1 -1
- package/dist/queryGenerator/index.d.ts +0 -4
- package/dist/queryGenerator/index.d.ts.map +1 -1
- package/dist/queryGenerator/index.js +1 -9
- package/dist/queryGenerator/index.js.map +1 -1
- package/dist/queryGenerator/treeWalker/aliasGenerator.d.ts +26 -0
- package/dist/queryGenerator/treeWalker/aliasGenerator.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/aliasGenerator.js +31 -0
- package/dist/queryGenerator/treeWalker/aliasGenerator.js.map +1 -0
- package/dist/queryGenerator/treeWalker/classify.d.ts +19 -0
- package/dist/queryGenerator/treeWalker/classify.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/classify.js +36 -0
- package/dist/queryGenerator/treeWalker/classify.js.map +1 -0
- package/dist/queryGenerator/treeWalker/compile.d.ts +29 -0
- package/dist/queryGenerator/treeWalker/compile.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/compile.js +97 -0
- package/dist/queryGenerator/treeWalker/compile.js.map +1 -0
- package/dist/queryGenerator/treeWalker/cteTemplates.d.ts +58 -0
- package/dist/queryGenerator/treeWalker/cteTemplates.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/cteTemplates.js +131 -0
- package/dist/queryGenerator/treeWalker/cteTemplates.js.map +1 -0
- package/dist/queryGenerator/treeWalker/index.d.ts +6 -0
- package/dist/queryGenerator/treeWalker/index.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/index.js +9 -0
- package/dist/queryGenerator/treeWalker/index.js.map +1 -0
- package/dist/queryGenerator/treeWalker/mergeSiblings.d.ts +28 -0
- package/dist/queryGenerator/treeWalker/mergeSiblings.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/mergeSiblings.js +54 -0
- package/dist/queryGenerator/treeWalker/mergeSiblings.js.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/columnsOnly.d.ts +40 -0
- package/dist/queryGenerator/treeWalker/operators/columnsOnly.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/columnsOnly.js +56 -0
- package/dist/queryGenerator/treeWalker/operators/columnsOnly.js.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/forEach.d.ts +47 -0
- package/dist/queryGenerator/treeWalker/operators/forEach.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/forEach.js +150 -0
- package/dist/queryGenerator/treeWalker/operators/forEach.js.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/group.d.ts +35 -0
- package/dist/queryGenerator/treeWalker/operators/group.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/group.js +56 -0
- package/dist/queryGenerator/treeWalker/operators/group.js.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/repeat.d.ts +47 -0
- package/dist/queryGenerator/treeWalker/operators/repeat.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/repeat.js +122 -0
- package/dist/queryGenerator/treeWalker/operators/repeat.js.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/unionAll.d.ts +54 -0
- package/dist/queryGenerator/treeWalker/operators/unionAll.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/operators/unionAll.js +121 -0
- package/dist/queryGenerator/treeWalker/operators/unionAll.js.map +1 -0
- package/dist/queryGenerator/treeWalker/render.d.ts +34 -0
- package/dist/queryGenerator/treeWalker/render.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/render.js +41 -0
- package/dist/queryGenerator/treeWalker/render.js.map +1 -0
- package/dist/queryGenerator/treeWalker/types.d.ts +64 -0
- package/dist/queryGenerator/treeWalker/types.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/types.js +14 -0
- package/dist/queryGenerator/treeWalker/types.js.map +1 -0
- package/dist/queryGenerator/treeWalker/walker.d.ts +36 -0
- package/dist/queryGenerator/treeWalker/walker.d.ts.map +1 -0
- package/dist/queryGenerator/treeWalker/walker.js +58 -0
- package/dist/queryGenerator/treeWalker/walker.js.map +1 -0
- package/dist/queryGenerator.d.ts +8 -94
- package/dist/queryGenerator.d.ts.map +1 -1
- package/dist/queryGenerator.js +16 -268
- package/dist/queryGenerator.js.map +1 -1
- package/dist/tests/utils/database.d.ts +2 -0
- package/dist/tests/utils/database.d.ts.map +1 -1
- package/dist/tests/utils/database.js +10 -1
- package/dist/tests/utils/database.js.map +1 -1
- package/dist/tests/utils/generator.d.ts +2 -0
- package/dist/tests/utils/generator.d.ts.map +1 -1
- package/dist/tests/utils/generator.js +24 -0
- package/dist/tests/utils/generator.js.map +1 -1
- package/dist/tests/utils/reporter.d.ts +1 -1
- package/dist/tests/utils/reporter.d.ts.map +1 -1
- package/dist/tests/utils/reporter.js +5 -4
- package/dist/tests/utils/reporter.js.map +1 -1
- package/dist/tests/utils/types.d.ts +1 -1
- package/dist/tests/utils/types.js +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +2 -1
- package/dist/queryGenerator/ForEachProcessor.d.ts +0 -127
- package/dist/queryGenerator/ForEachProcessor.d.ts.map +0 -1
- package/dist/queryGenerator/ForEachProcessor.js +0 -351
- package/dist/queryGenerator/ForEachProcessor.js.map +0 -1
- package/dist/queryGenerator/RepeatProcessor.d.ts +0 -177
- package/dist/queryGenerator/RepeatProcessor.d.ts.map +0 -1
- package/dist/queryGenerator/RepeatProcessor.js +0 -336
- package/dist/queryGenerator/RepeatProcessor.js.map +0 -1
- package/dist/queryGenerator/SelectClauseBuilder.d.ts +0 -108
- package/dist/queryGenerator/SelectClauseBuilder.d.ts.map +0 -1
- package/dist/queryGenerator/SelectClauseBuilder.js +0 -346
- package/dist/queryGenerator/SelectClauseBuilder.js.map +0 -1
- package/dist/queryGenerator/SelectCombinationExpander.d.ts +0 -42
- package/dist/queryGenerator/SelectCombinationExpander.d.ts.map +0 -1
- package/dist/queryGenerator/SelectCombinationExpander.js +0 -95
- package/dist/queryGenerator/SelectCombinationExpander.js.map +0 -1
package/dist/queryGenerator.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* T-SQL query generator for ViewDefinition structures.
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
|
+
* Public façade over the tree-walker query compiler. Builds the base
|
|
6
|
+
* transpiler context (resource alias, constants, optional test id) and
|
|
7
|
+
* delegates SQL generation to `compileViewDefinition`.
|
|
5
8
|
*/
|
|
6
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
10
|
exports.QueryGenerator = void 0;
|
|
8
|
-
const
|
|
9
|
-
const index_js_1 = require("./queryGenerator/index.js");
|
|
11
|
+
const index_js_1 = require("./queryGenerator/treeWalker/index.js");
|
|
10
12
|
/**
|
|
11
|
-
*
|
|
13
|
+
* Compiles a SQL on FHIR `ViewDefinition` to a T-SQL query.
|
|
12
14
|
*/
|
|
13
15
|
class QueryGenerator {
|
|
14
16
|
options;
|
|
15
|
-
pathParser;
|
|
16
|
-
combinationExpander;
|
|
17
|
-
forEachProcessor;
|
|
18
|
-
repeatProcessor;
|
|
19
|
-
selectClauseBuilder;
|
|
20
|
-
whereClauseBuilder;
|
|
21
|
-
columnGenerator;
|
|
22
17
|
constructor(options = {}) {
|
|
23
18
|
this.options = {
|
|
24
19
|
tableName: "fhir_resources",
|
|
@@ -27,249 +22,26 @@ class QueryGenerator {
|
|
|
27
22
|
resourceJsonColumn: "json",
|
|
28
23
|
...options,
|
|
29
24
|
};
|
|
30
|
-
// Initialise specialised processors.
|
|
31
|
-
this.pathParser = new index_js_1.PathParser();
|
|
32
|
-
this.combinationExpander = new index_js_1.SelectCombinationExpander();
|
|
33
|
-
this.columnGenerator = new index_js_1.ColumnExpressionGenerator();
|
|
34
|
-
this.forEachProcessor = new index_js_1.ForEachProcessor(this.pathParser);
|
|
35
|
-
this.repeatProcessor = new index_js_1.RepeatProcessor();
|
|
36
|
-
this.selectClauseBuilder = new index_js_1.SelectClauseBuilder(this.columnGenerator);
|
|
37
|
-
this.whereClauseBuilder = new index_js_1.WhereClauseBuilder();
|
|
38
25
|
}
|
|
39
26
|
/**
|
|
40
27
|
* Generate a T-SQL query from a ViewDefinition.
|
|
41
28
|
*/
|
|
42
29
|
generateQuery(viewDef, testId) {
|
|
43
30
|
try {
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const withClause = `WITH\n${allCteDefinitions.join(",\n")}\n`;
|
|
52
|
-
sql = withClause + statements.join("\nUNION ALL\n");
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
sql = statements.join("\nUNION ALL\n");
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
// Single statement. If it has CTEs, they're already included.
|
|
60
|
-
sql = statements[0];
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
sql,
|
|
64
|
-
columns,
|
|
65
|
-
};
|
|
31
|
+
const transpilerCtx = this.createBaseContext(viewDef, testId);
|
|
32
|
+
return (0, index_js_1.compileViewDefinition)(viewDef, {
|
|
33
|
+
tableName: this.options.tableName,
|
|
34
|
+
schemaName: this.options.schemaName,
|
|
35
|
+
testId,
|
|
36
|
+
transpilerCtx,
|
|
37
|
+
});
|
|
66
38
|
}
|
|
67
39
|
catch (error) {
|
|
68
40
|
throw new Error(`Failed to generate query for ViewDefinition: ${error}`);
|
|
69
41
|
}
|
|
70
42
|
}
|
|
71
43
|
/**
|
|
72
|
-
*
|
|
73
|
-
*/
|
|
74
|
-
generateAllSelectStatements(viewDef, context) {
|
|
75
|
-
const unionCombinations = this.combinationExpander.expandCombinations(viewDef.select);
|
|
76
|
-
const statements = [];
|
|
77
|
-
const allCteDefinitions = [];
|
|
78
|
-
const isMultiUnion = unionCombinations.length > 1;
|
|
79
|
-
// Shared counter state to ensure unique CTE aliases across all combinations.
|
|
80
|
-
const cteCounter = { value: 0 };
|
|
81
|
-
for (const combination of unionCombinations) {
|
|
82
|
-
const { statement, cteDefinitions } = this.generateStatementForCombination(combination, viewDef, context, isMultiUnion, cteCounter);
|
|
83
|
-
statements.push(statement);
|
|
84
|
-
allCteDefinitions.push(...cteDefinitions);
|
|
85
|
-
}
|
|
86
|
-
return { statements, allCteDefinitions };
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Generate a complete SQL statement for a specific combination.
|
|
90
|
-
*
|
|
91
|
-
* Routes to the appropriate statement generator based on the directives
|
|
92
|
-
* present in the combination:
|
|
93
|
-
* - Repeat statements use recursive CTEs.
|
|
94
|
-
* - ForEach statements use CROSS APPLY.
|
|
95
|
-
* - Simple statements have neither.
|
|
96
|
-
*
|
|
97
|
-
* @param combination - The select combination to generate.
|
|
98
|
-
* @param viewDef - The ViewDefinition being processed.
|
|
99
|
-
* @param context - The transpiler context.
|
|
100
|
-
* @param isMultiUnion - If true, CTEs are returned separately for consolidation.
|
|
101
|
-
* @param cteCounter - Shared counter for unique CTE aliases across combinations.
|
|
102
|
-
* @returns The statement and any CTE definitions (empty if not repeat or single statement).
|
|
103
|
-
*/
|
|
104
|
-
generateStatementForCombination(combination, viewDef, context, isMultiUnion, cteCounter) {
|
|
105
|
-
const hasRepeat = this.repeatProcessor.combinationHasRepeat(combination);
|
|
106
|
-
const hasForEach = this.forEachProcessor.combinationHasForEach(combination);
|
|
107
|
-
// Repeat takes precedence if both are present (forEach will be nested).
|
|
108
|
-
if (hasRepeat) {
|
|
109
|
-
return this.generateRepeatStatement(combination, viewDef, context, isMultiUnion, cteCounter);
|
|
110
|
-
}
|
|
111
|
-
else if (hasForEach) {
|
|
112
|
-
return {
|
|
113
|
-
statement: this.generateForEachStatement(combination, viewDef, context),
|
|
114
|
-
cteDefinitions: [],
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
return {
|
|
119
|
-
statement: this.generateSimpleStatement(combination, viewDef, context),
|
|
120
|
-
cteDefinitions: [],
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Generate a simple SELECT statement without forEach.
|
|
126
|
-
*/
|
|
127
|
-
generateSimpleStatement(combination, viewDef, context) {
|
|
128
|
-
const selectClause = this.selectClauseBuilder.generateSimpleSelectClause(combination, context);
|
|
129
|
-
const fromClause = this.generateFromClause(context);
|
|
130
|
-
const whereClause = this.whereClauseBuilder.buildWhereClause(viewDef.resource, context.resourceAlias, context.testId, viewDef.where, context);
|
|
131
|
-
let statement = `${selectClause}\n${fromClause}`;
|
|
132
|
-
if (whereClause !== null) {
|
|
133
|
-
statement += `\n${whereClause}`;
|
|
134
|
-
}
|
|
135
|
-
return statement;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Generate a SELECT statement with forEach using CROSS APPLY.
|
|
139
|
-
*/
|
|
140
|
-
generateForEachStatement(combination, viewDef, context) {
|
|
141
|
-
const fromClause = this.generateFromClause(context);
|
|
142
|
-
const { forEachContextMap, topLevelForEach } = this.forEachProcessor.buildForEachContextMap(combination.selects, context, combination);
|
|
143
|
-
const applyClauses = this.forEachProcessor.buildApplyClauses(forEachContextMap, topLevelForEach, combination);
|
|
144
|
-
const selectClause = this.selectClauseBuilder.generateForEachSelectClause(combination, context, forEachContextMap);
|
|
145
|
-
const whereClause = this.whereClauseBuilder.buildWhereClause(viewDef.resource, context.resourceAlias, context.testId, viewDef.where, context);
|
|
146
|
-
let statement = `${selectClause}\n${fromClause}${applyClauses}`;
|
|
147
|
-
if (whereClause !== null) {
|
|
148
|
-
statement += `\n${whereClause}`;
|
|
149
|
-
}
|
|
150
|
-
return statement;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Generate a SELECT statement with repeat using recursive CTEs.
|
|
154
|
-
*
|
|
155
|
-
* The repeat directive generates a recursive CTE that traverses a tree
|
|
156
|
-
* structure by following one or more paths at each level. The CTE is then
|
|
157
|
-
* joined to the main query using INNER JOIN.
|
|
158
|
-
*
|
|
159
|
-
* If the combination also contains forEach, the forEach is processed after
|
|
160
|
-
* the repeat CTE, using the repeat context as its source.
|
|
161
|
-
*
|
|
162
|
-
* @param combination - The select combination being processed.
|
|
163
|
-
* @param viewDef - The ViewDefinition.
|
|
164
|
-
* @param context - The transpiler context.
|
|
165
|
-
* @param isMultiUnion - If true, return CTE definitions separately for consolidation.
|
|
166
|
-
* @param cteCounter - Shared counter for unique CTE aliases across combinations.
|
|
167
|
-
* @returns Statement and CTE definitions.
|
|
168
|
-
*/
|
|
169
|
-
generateRepeatStatement(combination, viewDef, context, isMultiUnion, cteCounter) {
|
|
170
|
-
// Build repeat contexts and CTEs.
|
|
171
|
-
const { repeatContextMap, topLevelRepeat } = this.repeatProcessor.buildRepeatContextMap(combination.selects, context, combination, cteCounter);
|
|
172
|
-
const tableName = `[${this.options.schemaName}].[${this.options.tableName}]`;
|
|
173
|
-
const cteDefinitions = this.repeatProcessor.buildRepeatCteDefinitions(repeatContextMap, topLevelRepeat, context.resourceAlias, viewDef.resource, context.testId, tableName);
|
|
174
|
-
const joinClauses = this.repeatProcessor.buildRepeatApplyClauses(repeatContextMap, topLevelRepeat, context.resourceAlias);
|
|
175
|
-
const { selectClause, forEachApplyClauses } = this.buildRepeatSelectAndForEach(combination, context, repeatContextMap);
|
|
176
|
-
const fromClause = this.generateFromClause(context);
|
|
177
|
-
const statement = this.assembleRepeatStatement(selectClause, fromClause, joinClauses, forEachApplyClauses, cteDefinitions, isMultiUnion);
|
|
178
|
-
return { statement, cteDefinitions: isMultiUnion ? cteDefinitions : [] };
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Build select clause and forEach apply clauses for repeat statements.
|
|
182
|
-
*/
|
|
183
|
-
buildRepeatSelectAndForEach(combination, context, repeatContextMap) {
|
|
184
|
-
const hasNestedForEach = this.forEachProcessor.combinationHasForEach(combination);
|
|
185
|
-
if (!hasNestedForEach) {
|
|
186
|
-
return {
|
|
187
|
-
selectClause: this.selectClauseBuilder.generateRepeatSelectClause(combination, context, repeatContextMap),
|
|
188
|
-
forEachApplyClauses: "",
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
const { forEachContextMap, topLevelForEach } = this.forEachProcessor.buildForEachContextMap(combination.selects, context, combination);
|
|
192
|
-
this.updateForEachSourcesForRepeat(forEachContextMap, repeatContextMap);
|
|
193
|
-
return {
|
|
194
|
-
selectClause: this.selectClauseBuilder.generateRepeatSelectClause(combination, context, repeatContextMap, forEachContextMap),
|
|
195
|
-
forEachApplyClauses: this.forEachProcessor.buildApplyClauses(forEachContextMap, topLevelForEach, combination),
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Assemble the final repeat statement from its components.
|
|
200
|
-
*/
|
|
201
|
-
assembleRepeatStatement(selectClause, fromClause, joinClauses, forEachApplyClauses, cteDefinitions, isMultiUnion) {
|
|
202
|
-
const baseStatement = `${selectClause}\n${fromClause}${joinClauses}${forEachApplyClauses}`;
|
|
203
|
-
if (isMultiUnion) {
|
|
204
|
-
return baseStatement;
|
|
205
|
-
}
|
|
206
|
-
const withClause = cteDefinitions.length > 0 ? `WITH\n${cteDefinitions.join(",\n")}\n` : "";
|
|
207
|
-
return `${withClause}${baseStatement}`;
|
|
208
|
-
}
|
|
209
|
-
/**
|
|
210
|
-
* Update forEach source expressions to use repeat CTE instead of resource JSON.
|
|
211
|
-
*
|
|
212
|
-
* When forEach is nested inside repeat, the forEach should iterate over
|
|
213
|
-
* arrays within the repeat context (e.g., repeat_0.item_json) rather than
|
|
214
|
-
* the root resource JSON.
|
|
215
|
-
*/
|
|
216
|
-
updateForEachSourcesForRepeat(forEachContextMap, repeatContextMap) {
|
|
217
|
-
// Find the repeat select that contains each forEach.
|
|
218
|
-
for (const [forEachSelect, forEachContext] of forEachContextMap) {
|
|
219
|
-
const containingRepeat = this.findContainingRepeat(forEachSelect, repeatContextMap);
|
|
220
|
-
if (containingRepeat) {
|
|
221
|
-
const repeatContext = repeatContextMap.get(containingRepeat);
|
|
222
|
-
if (repeatContext) {
|
|
223
|
-
// Update the forEach source to use the repeat CTE's item_json.
|
|
224
|
-
forEachContext.forEachSource = `${repeatContext.cteAlias}.item_json`;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Find the repeat select that contains a given forEach select.
|
|
231
|
-
*/
|
|
232
|
-
findContainingRepeat(forEachSelect, repeatContextMap) {
|
|
233
|
-
// Check each repeat select to see if the forEach is nested within it.
|
|
234
|
-
for (const [repeatSelect] of repeatContextMap) {
|
|
235
|
-
if (this.isForEachNestedInRepeat(forEachSelect, repeatSelect)) {
|
|
236
|
-
return repeatSelect;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
return undefined;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Check if a forEach select is nested within a repeat select.
|
|
243
|
-
*/
|
|
244
|
-
isForEachNestedInRepeat(forEachSelect, repeatSelect) {
|
|
245
|
-
if (!repeatSelect.select) {
|
|
246
|
-
return false;
|
|
247
|
-
}
|
|
248
|
-
return this.isSelectNestedIn(forEachSelect, repeatSelect.select);
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Recursively check if a select is nested within a list of selects.
|
|
252
|
-
*/
|
|
253
|
-
isSelectNestedIn(target, selects) {
|
|
254
|
-
for (const select of selects) {
|
|
255
|
-
if (select === target) {
|
|
256
|
-
return true;
|
|
257
|
-
}
|
|
258
|
-
if (select.select && this.isSelectNestedIn(target, select.select)) {
|
|
259
|
-
return true;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
return false;
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* Generate the FROM clause.
|
|
266
|
-
*/
|
|
267
|
-
generateFromClause(context) {
|
|
268
|
-
const tableName = `[${this.options.schemaName}].[${this.options.tableName}]`;
|
|
269
|
-
return `FROM ${tableName} AS [${context.resourceAlias}]`;
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Create the base transpiler context.
|
|
44
|
+
* Create the base transpiler context with resource alias and constants.
|
|
273
45
|
*/
|
|
274
46
|
createBaseContext(viewDef, testId) {
|
|
275
47
|
const constants = {};
|
|
@@ -285,7 +57,8 @@ class QueryGenerator {
|
|
|
285
57
|
};
|
|
286
58
|
}
|
|
287
59
|
/**
|
|
288
|
-
* Extract the value from a ViewDefinitionConstant.
|
|
60
|
+
* Extract the value from a ViewDefinitionConstant. Throws if zero or more
|
|
61
|
+
* than one `value[x]` element is set.
|
|
289
62
|
*/
|
|
290
63
|
getConstantValue(constant) {
|
|
291
64
|
const primitiveKeys = [
|
|
@@ -320,31 +93,6 @@ class QueryGenerator {
|
|
|
320
93
|
const key = definedValues[0];
|
|
321
94
|
return constant[key];
|
|
322
95
|
}
|
|
323
|
-
/**
|
|
324
|
-
* Collect all column definitions from select elements.
|
|
325
|
-
*/
|
|
326
|
-
collectAllColumns(selects) {
|
|
327
|
-
const columns = [];
|
|
328
|
-
for (const select of selects) {
|
|
329
|
-
if (select.column) {
|
|
330
|
-
for (const column of select.column) {
|
|
331
|
-
columns.push({
|
|
332
|
-
name: column.name,
|
|
333
|
-
type: transpiler_js_1.Transpiler.inferSqlType(column.type, column.tag),
|
|
334
|
-
nullable: true, // FHIR data is generally nullable.
|
|
335
|
-
description: column.description,
|
|
336
|
-
});
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
if (select.select) {
|
|
340
|
-
columns.push(...this.collectAllColumns(select.select));
|
|
341
|
-
}
|
|
342
|
-
if (select.unionAll) {
|
|
343
|
-
columns.push(...this.collectAllColumns(select.unionAll));
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
return columns;
|
|
347
|
-
}
|
|
348
96
|
}
|
|
349
97
|
exports.QueryGenerator = QueryGenerator;
|
|
350
98
|
//# sourceMappingURL=queryGenerator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryGenerator.js","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":";AAAA;;;
|
|
1
|
+
{"version":3,"file":"queryGenerator.js","sourceRoot":"","sources":["../src/queryGenerator.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAGH,mEAA6E;AAc7E;;GAEG;AACH,MAAa,cAAc;IACR,OAAO,CAAkC;IAE1D,YAAY,UAAiC,EAAE;QAC7C,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE,gBAAgB;YAC3B,UAAU,EAAE,KAAK;YACjB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,MAAM;YAC1B,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,OAAuB,EAAE,MAAe;QACpD,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9D,OAAO,IAAA,gCAAqB,EAAC,OAAO,EAAE;gBACpC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;gBACjC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,MAAM;gBACN,aAAa;aACd,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,gDAAgD,KAAK,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CACvB,OAAuB,EACvB,MAAe;QAEf,MAAM,SAAS,GAAwD,EAAE,CAAC;QAE1E,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACxC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,OAAO;YACL,aAAa,EAAE,GAAG;YAClB,SAAS;YACT,MAAM;SACP,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,gBAAgB,CACtB,QAAgC;QAEhC,MAAM,aAAa,GAAqC;YACtD,aAAa;YACb,cAAc;YACd,cAAc;YACd,cAAc;YACd,WAAW;YACX,eAAe;YACf,WAAW;YACX,cAAc;YACd,WAAW;YACX,SAAS;YACT,UAAU;YACV,UAAU;YACV,gBAAgB;YAChB,WAAW;YACX,UAAU;YACV,eAAe;YACf,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,gBAAgB;SACjB,CAAC;QAEF,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CACxC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,CACrC,CAAC;QAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,IAAI,kDAAkD,CAC7E,CAAC;QACJ,CAAC;QAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,aAAa,QAAQ,CAAC,IAAI,6DAA6D,aAAa,CAAC,MAAM,EAAE,CAC9G,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC,GAAG,CAA8B,CAAC;IACpD,CAAC;CACF;AArGD,wCAqGC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/database.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/database.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,cAAc,EAAkC,MAAM,OAAO,CAAC;AA+CvE;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBnD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAWrD;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,GAAG,EAAE,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCnE;AAwFD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,cAAc,CAKhD"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Provides functions to manage database connections, table creation,
|
|
6
6
|
* and test data lifecycle during Vitest test execution.
|
|
7
|
+
*
|
|
8
|
+
* @author John Grimes
|
|
7
9
|
*/
|
|
8
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
11
|
exports.setupDatabase = setupDatabase;
|
|
@@ -11,6 +13,7 @@ exports.cleanupDatabase = cleanupDatabase;
|
|
|
11
13
|
exports.setupTestData = setupTestData;
|
|
12
14
|
exports.cleanupTestData = cleanupTestData;
|
|
13
15
|
exports.getDatabasePool = getDatabasePool;
|
|
16
|
+
const lossless_json_1 = require("lossless-json");
|
|
14
17
|
const mssql_1 = require("mssql");
|
|
15
18
|
// Global connection pool
|
|
16
19
|
let globalPool = null;
|
|
@@ -115,7 +118,13 @@ async function setupTestData(resources, testId) {
|
|
|
115
118
|
`;
|
|
116
119
|
const insertRequest = new mssql_1.Request(globalPool);
|
|
117
120
|
insertRequest.input("resource_type", resource.resourceType);
|
|
118
|
-
|
|
121
|
+
// Serialise with lossless-json so decimal lexemes (including trailing
|
|
122
|
+
// zeros, e.g. 1.0) are preserved in the stored JSON. This relies on the
|
|
123
|
+
// resource having been parsed losslessly upstream (see the dynamic test
|
|
124
|
+
// generator); plain JSON.stringify would collapse 1.0 to 1 and strip the
|
|
125
|
+
// precision the boundary functions depend on (FR-011). Non-numeric values
|
|
126
|
+
// are unaffected.
|
|
127
|
+
insertRequest.input("json", (0, lossless_json_1.stringify)(resource) ?? "null");
|
|
119
128
|
insertRequest.input("test_id", testId);
|
|
120
129
|
const result = await insertRequest.query(insertSql);
|
|
121
130
|
const insertedId = result.recordset[0]?.[tableConfig.resourceIdColumn];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/tests/utils/database.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/tests/utils/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Creates Vitest test suites dynamically at runtime without generating physical files.
|
|
5
5
|
* Each SQL-on-FHIR JSON test file becomes a describe block with individual it blocks
|
|
6
6
|
* for each test case. Results are collected for report generation.
|
|
7
|
+
*
|
|
8
|
+
* @author John Grimes
|
|
7
9
|
*/
|
|
8
10
|
import type { TestReport } from "./types";
|
|
9
11
|
declare global {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/generator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,SAAS,CAAC;AAM3D,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,WAAW,EAAE,UAAU,GAAG,SAAS,CAAC;CACzC;AAiBD;;GAEG;AACH,qBAAa,sBAAsB;IACjC;;OAEG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAoB7C;;OAEG;IACH,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAWvD;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA+BzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+C3B;;OAEG;IACH,gBAAgB,IAAI,IAAI;CAKzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAoB3E"}
|
|
@@ -5,17 +5,34 @@
|
|
|
5
5
|
* Creates Vitest test suites dynamically at runtime without generating physical files.
|
|
6
6
|
* Each SQL-on-FHIR JSON test file becomes a describe block with individual it blocks
|
|
7
7
|
* for each test case. Results are collected for report generation.
|
|
8
|
+
*
|
|
9
|
+
* @author John Grimes
|
|
8
10
|
*/
|
|
9
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
12
|
exports.DynamicVitestGenerator = void 0;
|
|
11
13
|
exports.createDynamicTests = createDynamicTests;
|
|
12
14
|
const fs_1 = require("fs");
|
|
15
|
+
const lossless_json_1 = require("lossless-json");
|
|
13
16
|
const path_1 = require("path");
|
|
14
17
|
const vitest_1 = require("vitest");
|
|
15
18
|
const parser_1 = require("../../parser");
|
|
16
19
|
const database_js_1 = require("./database.js");
|
|
17
20
|
const sqlOnFhir_1 = require("./sqlOnFhir");
|
|
18
21
|
const testContext_js_1 = require("./testContext.js");
|
|
22
|
+
/**
|
|
23
|
+
* Parse the `resources` array of a test suite from its raw JSON, preserving
|
|
24
|
+
* numeric lexemes (e.g. decimal trailing zeros such as 1.0) as lossless values
|
|
25
|
+
* so they survive insertion into the database (FR-011). Only the resources are
|
|
26
|
+
* parsed this way; the surrounding suite (including expected results) is parsed
|
|
27
|
+
* normally elsewhere so result comparison keeps plain numbers.
|
|
28
|
+
*
|
|
29
|
+
* @param testSuiteJson - The raw test suite JSON text.
|
|
30
|
+
* @returns The resources array with numeric lexemes preserved.
|
|
31
|
+
*/
|
|
32
|
+
function losslessParseResources(testSuiteJson) {
|
|
33
|
+
const parsed = (0, lossless_json_1.parse)(testSuiteJson);
|
|
34
|
+
return Array.isArray(parsed.resources) ? parsed.resources : [];
|
|
35
|
+
}
|
|
19
36
|
/**
|
|
20
37
|
* Dynamic test generator that creates Vitest tests at runtime.
|
|
21
38
|
*/
|
|
@@ -26,6 +43,13 @@ class DynamicVitestGenerator {
|
|
|
26
43
|
generateTestsFromFile(filePath) {
|
|
27
44
|
const testSuiteJson = (0, fs_1.readFileSync)(filePath, "utf8");
|
|
28
45
|
const testSuite = parser_1.ViewDefinitionParser.parseTestSuite(testSuiteJson);
|
|
46
|
+
// Re-parse the resources losslessly so decimal lexemes (e.g. 1.0) survive
|
|
47
|
+
// for insertion (FR-011). The standard parse used above collapses 1.0 to 1
|
|
48
|
+
// before the value ever reaches the database, which the decimal boundary
|
|
49
|
+
// functions cannot recover from. Only the resources need this treatment;
|
|
50
|
+
// the test expectations keep plain numbers so result comparison is
|
|
51
|
+
// unaffected. The lossless objects are serialised by setupTestData.
|
|
52
|
+
testSuite.resources = losslessParseResources(testSuiteJson);
|
|
29
53
|
const suiteName = testSuite.title;
|
|
30
54
|
// Extract filename for report (e.g., "basic.json" from "/path/to/basic.json")
|
|
31
55
|
const fileName = filePath.split("/").pop() ?? filePath;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/tests/utils/generator.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/tests/utils/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Custom Vitest reporter for SQL-on-FHIR test result collection.
|
|
3
3
|
*
|
|
4
4
|
* Collects test results during Vitest execution and formats them according
|
|
5
|
-
* to the
|
|
5
|
+
* to the SQL on FHIR test report schema. Results are stored globally
|
|
6
6
|
* and can be accessed after test completion for report generation.
|
|
7
7
|
*/
|
|
8
8
|
import type { RunnerTestFile } from "vitest";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,wBAA6B;IASlD;;;OAGG;IACH,UAAU,CACR,KAAK,CAAC,EAAE,cAAc,EAAE,EACxB,OAAO,CAAC,EAAE,OAAO,EAAE,EACnB,SAAS,CAAC,EAAE,OAAO,GAClB,IAAI;IAsBP;;OAEG;IACH,OAAO,CAAC,gBAAgB;
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../src/tests/utils/reporter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAc,cAAc,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGjD,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,cAAM,iBAAkB,YAAW,QAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,wBAA6B;IASlD;;;OAGG;IACH,UAAU,CACR,KAAK,CAAC,EAAE,cAAc,EAAE,EACxB,OAAO,CAAC,EAAE,OAAO,EAAE,EACnB,SAAS,CAAC,EAAE,OAAO,GAClB,IAAI;IAsBP;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwBxB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6B/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAarC;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAe9B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAoBnC;;;;;;;;;OASG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;OAEG;IACH,YAAY,IAAI,IAAI;IAQpB,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAKxB,gBAAgB,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlC,cAAc,CAAC,IAAI,IAAI;IAIvB,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;CAI3D;AAGD,eAAe,iBAAiB,CAAC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Custom Vitest reporter for SQL-on-FHIR test result collection.
|
|
4
4
|
*
|
|
5
5
|
* Collects test results during Vitest execution and formats them according
|
|
6
|
-
* to the
|
|
6
|
+
* to the SQL on FHIR test report schema. Results are stored globally
|
|
7
7
|
* and can be accessed after test completion for report generation.
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
@@ -58,10 +58,11 @@ class SqlOnFhirReporter {
|
|
|
58
58
|
console.log(`Failed: ${stats.failed}`);
|
|
59
59
|
console.log(`Skipped: ${stats.skipped}`);
|
|
60
60
|
console.log(`Total: ${stats.total}`);
|
|
61
|
-
//
|
|
61
|
+
// Note when a test name filter narrowed the run, so the skipped count is
|
|
62
|
+
// not mistaken for failures. The standard run (no filter) executes the
|
|
63
|
+
// full suite, including the formerly experimental join/boundary tests.
|
|
62
64
|
if (process.argv.some((arg) => arg.includes("testNamePattern"))) {
|
|
63
|
-
console.log("\nNote:
|
|
64
|
-
console.log("These tests cover features outside the scope of this implementation.");
|
|
65
|
+
console.log("\nNote: a test name filter was applied; tests outside the filter were excluded from this run.");
|
|
65
66
|
}
|
|
66
67
|
console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");
|
|
67
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/tests/utils/reporter.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,2BAA8C;AAC9C,+BAA+B;AAc/B;;GAEG;AACH,MAAM,iBAAiB;IACJ,OAAO,CAA2B;IAC3C,UAAU,GAAe,EAAE,CAAC;IAEpC,YAAY,UAAoC,EAAE;QAChD,IAAI,CAAC,OAAO,GAAG;YACb,UAAU,EAAE,sBAAsB;YAClC,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,KAAwB,EACxB,OAAmB,EACnB,SAAmB;QAEnB,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,2DAA2D;QAC3D,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,WAAW,EAAE,CAAC;YACjE,IAAI,CAAC,UAAU,GAAI,MAAc,CAAC,WAAW,CAAC;QAChD,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAEnC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAuB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAEvC,
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../src/tests/utils/reporter.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,2BAA8C;AAC9C,+BAA+B;AAc/B;;GAEG;AACH,MAAM,iBAAiB;IACJ,OAAO,CAA2B;IAC3C,UAAU,GAAe,EAAE,CAAC;IAEpC,YAAY,UAAoC,EAAE;QAChD,IAAI,CAAC,OAAO,GAAG;YACb,UAAU,EAAE,sBAAsB;YAClC,eAAe,EAAE,IAAI;YACrB,YAAY,EAAE,IAAI;YAClB,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,KAAwB,EACxB,OAAmB,EACnB,SAAmB;QAEnB,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,2DAA2D;QAC3D,IAAI,OAAO,MAAM,KAAK,WAAW,IAAK,MAAc,CAAC,WAAW,EAAE,CAAC;YACjE,IAAI,CAAC,UAAU,GAAI,MAAc,CAAC,WAAW,CAAC;QAChD,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAEnC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,KAAuB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAElD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAEvC,yEAAyE;YACzE,uEAAuE;YACvE,uEAAuE;YACvE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;gBAChE,OAAO,CAAC,GAAG,CACT,+FAA+F,CAChG,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,KAAuB;QAMrD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAE1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;gBACvB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM;YACN,MAAM;YACN,OAAO;YACP,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;SACjC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAgB;QAKvC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC1D,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;gBACzC,MAAM,EAAE,CAAC;YACX,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,CAAC;gBACzC,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBAC7C,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;gBACvB,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,UAAkB;QAC5B,IAAI,CAAC;YACH,qCAAqC;YACrC,MAAM,SAAS,GAAG,IAAA,cAAO,EAAC,UAAU,CAAC,CAAC;YACtC,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAA,kBAAa,EAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAAC,KAAuB;QACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,SAAS;YAE1B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC9B,IACE,IAAI,CAAC,IAAI,KAAK,OAAO;oBACrB,IAAI,CAAC,IAAI,KAAK,8BAA8B,EAC5C,CAAC;oBACD,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,2BAA2B,CAAC,WAAuB;QACzD,IAAI,CAAC,CAAC,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK;YAAE,OAAO;QAE5D,4DAA4D;QAC5D,2CAA2C;QAC3C,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YAC3C,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO;gBAAE,SAAS;YAE1C,iEAAiE;YACjE,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,IAAI,OAAO,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAEjE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG;oBAC1B,KAAK,EAAE,UAAU;iBAClB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACK,qBAAqB,CAC3B,KAAiB,EACjB,SAAS,GAAG,IAAI;QAEhB,MAAM,KAAK,GAAsB,EAAE,CAAC;QAEpC,IAAI,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,2EAA2E;oBAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrD,KAAK,CAAC,IAAI,CAAC;wBACT,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE;4BACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM;yBACtC;qBACF,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,SAAS,EAAE,CAAC;oBAC9C,mEAAmE;oBACnE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACK,iBAAiB,CAAC,aAAqB;QAC7C,wCAAwC;QACxC,IAAI,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QACvD,oCAAoC;QACpC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YACjC,MAAc,CAAC,WAAW,GAAG,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,MAAM,CAAE,IAAS;QACf,0CAA0C;QAC1C,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED,gBAAgB,CAAE,IAAS;QACzB,4BAA4B;IAC9B,CAAC;IAED,cAAc;QACZ,4BAA4B;IAC9B,CAAC;IAED,cAAc,CAAE,MAAgB,EAAE,QAAiB;QACjD,uCAAuC;QACvC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;CACF;AAED,gDAAgD;AAChD,kBAAe,iBAAiB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Type definitions for test reporting.
|
|
3
3
|
*
|
|
4
4
|
* Matches the SQL on FHIR test report schema:
|
|
5
|
-
* https://raw.githubusercontent.com/FHIR/sql-on-fhir
|
|
5
|
+
* https://raw.githubusercontent.com/FHIR/sql-on-fhir.js/refs/heads/main/test_report/test-report.schema.json
|
|
6
6
|
*/
|
|
7
7
|
export interface TestReportEntry {
|
|
8
8
|
/** The name/description of the test case. */
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Type definitions for test reporting.
|
|
4
4
|
*
|
|
5
5
|
* Matches the SQL on FHIR test report schema:
|
|
6
|
-
* https://raw.githubusercontent.com/FHIR/sql-on-fhir
|
|
6
|
+
* https://raw.githubusercontent.com/FHIR/sql-on-fhir.js/refs/heads/main/test_report/test-report.schema.json
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
//# sourceMappingURL=types.js.map
|