@checkdigit/eslint-plugin 7.17.1 → 7.18.0-PR.143-9946
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-mjs/athena/api-locator.mjs +30 -0
- package/dist-mjs/athena/api-matcher.mjs +108 -0
- package/dist-mjs/athena/athena.mjs +328 -0
- package/dist-mjs/athena/column.mjs +1 -0
- package/dist-mjs/athena/context.mjs +21 -0
- package/dist-mjs/athena/index.mjs +1 -0
- package/dist-mjs/athena/service-table.mjs +32 -0
- package/dist-mjs/athena/types.mjs +1 -0
- package/dist-mjs/athena/visitor.mjs +258 -0
- package/dist-mjs/index.mjs +8 -4
- package/dist-mjs/no-status-code-assert.mjs +1 -1
- package/dist-mjs/openapi/deref-schema.mjs +14 -0
- package/dist-mjs/openapi/generate-schema.mjs +273 -0
- package/dist-mjs/openapi/service-schema-generator.mjs +147 -0
- package/dist-mjs/peggy/athena-peggy.mjs +20629 -0
- package/dist-types/athena/api-locator.d.ts +2 -0
- package/dist-types/athena/api-matcher.d.ts +14 -0
- package/dist-types/athena/athena.d.ts +6 -0
- package/dist-types/athena/column.d.ts +1 -0
- package/dist-types/athena/context.d.ts +21 -0
- package/dist-types/athena/index.d.ts +8 -0
- package/dist-types/athena/service-table.d.ts +8 -0
- package/dist-types/athena/types.d.ts +474 -0
- package/dist-types/athena/visitor.d.ts +63 -0
- package/dist-types/no-status-code-assert.d.ts +1 -1
- package/dist-types/openapi/deref-schema.d.ts +1 -0
- package/dist-types/openapi/generate-schema.d.ts +33 -0
- package/dist-types/openapi/service-schema-generator.d.ts +5 -0
- package/dist-types/peggy/athena-peggy.d.ts +13 -0
- package/package.json +1 -96
- package/src/athena/ATHENA.md +387 -0
- package/src/athena/PLAN.md +355 -0
- package/src/athena/api-locator.ts +39 -0
- package/src/athena/api-matcher.ts +169 -0
- package/src/athena/athena.ts +488 -0
- package/src/athena/column.ts +2 -0
- package/src/athena/context.ts +47 -0
- package/src/athena/index.ts +11 -0
- package/src/athena/service-table.ts +55 -0
- package/src/athena/types.ts +526 -0
- package/src/athena/visitor.ts +365 -0
- package/src/index.ts +4 -0
- package/src/no-side-effects.ts +1 -1
- package/src/no-status-code-assert.ts +2 -2
- package/src/openapi/deref-schema.ts +14 -0
- package/src/openapi/generate-schema.ts +422 -0
- package/src/openapi/service-schema-generator.ts +189 -0
- package/src/peggy/athena-chat.peggy +608 -0
- package/src/peggy/athena-peggy.ts +22078 -0
- package/src/peggy/athena.peggy +2967 -0
- package/src/require-service-call-response-declaration.ts +2 -2
- package/src/services/interchange/v1/swagger.schema.deref.json +849 -0
- package/src/services/interchange/v1/swagger.schema.json +473 -0
- package/src/services/interchange/v1/swagger.yml +414 -0
- package/src/services/ledger/v1/swagger.schema.deref.json +6694 -0
- package/src/services/ledger/v1/swagger.schema.json +1820 -0
- package/src/services/ledger/v1/swagger.yml +1094 -0
- package/src/services/link/v1/swagger.schema.deref.json +648 -0
- package/src/services/link/v1/swagger.schema.json +444 -0
- package/src/services/link/v1/swagger.yml +343 -0
- package/src/services/message/v1/swagger.schema.deref.json +22049 -0
- package/src/services/message/v1/swagger.schema.json +3470 -0
- package/src/services/message/v1/swagger.yml +2798 -0
- package/src/services/message/v2/swagger.schema.deref.json +72221 -0
- package/src/services/message/v2/swagger.schema.json +3558 -0
- package/src/services/message/v2/swagger.yml +3009 -0
- package/src/services/paymentCard/v1/swagger.schema.deref.json +4346 -0
- package/src/services/paymentCard/v1/swagger.schema.json +2181 -0
- package/src/services/paymentCard/v1/swagger.yml +1161 -0
- package/src/services/paymentCard/v2/swagger.schema.deref.json +4336 -0
- package/src/services/paymentCard/v2/swagger.schema.json +2155 -0
- package/src/services/paymentCard/v2/swagger.yml +1149 -0
- package/src/services/person/v1/swagger.schema.deref.json +6786 -0
- package/src/services/person/v1/swagger.schema.json +1445 -0
- package/src/services/person/v1/swagger.yml +1157 -0
- package/src/services/teampayApproval/v1/swagger.schema.deref.json +9898 -0
- package/src/services/teampayCardManagement/v1/swagger.schema.deref.json +6187 -0
- package/src/services/teampayClientManagement/v1/swagger.schema.deref.json +4914 -0
- package/src/services/teampayClientManagement/v1/swagger.schema.json +1964 -0
- package/src/services/teampayClientManagement/v1/swagger.yml +1376 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
// src/athena/visitor.ts
|
|
2
|
+
import debug from "debug";
|
|
3
|
+
var log = debug("athena:visitor");
|
|
4
|
+
function isUnnestFrom(node) {
|
|
5
|
+
return typeof node === "object" && node !== null && node.type === "unnest";
|
|
6
|
+
}
|
|
7
|
+
function isDual(node) {
|
|
8
|
+
return typeof node === "object" && node !== null && node.type === "dual";
|
|
9
|
+
}
|
|
10
|
+
function isTableExpr(node) {
|
|
11
|
+
if (typeof node !== "object" || node === null) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
const expr = node.expr;
|
|
15
|
+
return typeof expr === "object" && expr !== null && "ast" in expr;
|
|
16
|
+
}
|
|
17
|
+
function isJoin(node) {
|
|
18
|
+
return !isUnnestFrom(node) && !isDual(node) && !isTableExpr(node) && typeof node === "object" && node !== null && "join" in node;
|
|
19
|
+
}
|
|
20
|
+
function isBaseFrom(node) {
|
|
21
|
+
return !isUnnestFrom(node) && !isDual(node) && !isTableExpr(node) && !isJoin(node) && typeof node === "object" && node !== null && "table" in node;
|
|
22
|
+
}
|
|
23
|
+
function hasArrayIndex(node) {
|
|
24
|
+
const typed = node;
|
|
25
|
+
return Array.isArray(typed.array_index) && typed.array_index.length > 0;
|
|
26
|
+
}
|
|
27
|
+
function walkExpr(node, visitor) {
|
|
28
|
+
if (typeof node !== "object" || node === null) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const typed = node;
|
|
32
|
+
switch (typed["type"]) {
|
|
33
|
+
case "select": {
|
|
34
|
+
walk(node, visitor);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case "expr": {
|
|
38
|
+
walkExpr(node.expr, visitor);
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case "binary_expr": {
|
|
42
|
+
const bin = node;
|
|
43
|
+
visitor.visitBinary?.(bin);
|
|
44
|
+
walkExpr(bin.left, visitor);
|
|
45
|
+
walkExpr(bin.right, visitor);
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
case "column_ref": {
|
|
49
|
+
visitor.visitColumnRef?.(node);
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
case "function": {
|
|
53
|
+
const fn = node;
|
|
54
|
+
visitor.visitFunction?.(fn);
|
|
55
|
+
if (fn.args !== void 0) {
|
|
56
|
+
walkExpr(fn.args, visitor);
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case "aggr_func": {
|
|
61
|
+
const agg = node;
|
|
62
|
+
visitor.visitAggrFunc?.(agg);
|
|
63
|
+
walkExpr(agg.args.expr, visitor);
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case "cast": {
|
|
67
|
+
const cast = node;
|
|
68
|
+
visitor.visitCast?.(cast);
|
|
69
|
+
walkExpr(cast.expr, visitor);
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case "case": {
|
|
73
|
+
const caseNode = node;
|
|
74
|
+
visitor.visitCase?.(caseNode);
|
|
75
|
+
for (const arm of caseNode.args) {
|
|
76
|
+
if ("cond" in arm) {
|
|
77
|
+
walkExpr(arm.cond, visitor);
|
|
78
|
+
}
|
|
79
|
+
walkExpr(arm.result, visitor);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case "expr_list": {
|
|
84
|
+
const list = node;
|
|
85
|
+
visitor.visitExprList?.(list);
|
|
86
|
+
for (const item of list.value) {
|
|
87
|
+
walkExpr(item, visitor);
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
default: {
|
|
92
|
+
if (typed["type"] === void 0 && "expr" in typed) {
|
|
93
|
+
walkExpr(typed["expr"], visitor);
|
|
94
|
+
} else {
|
|
95
|
+
visitor.visitValue?.(node);
|
|
96
|
+
}
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function walkFrom(node, visitor) {
|
|
102
|
+
if (isDual(node)) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (isUnnestFrom(node)) {
|
|
106
|
+
visitor.visitUnnest?.(node);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (isTableExpr(node)) {
|
|
110
|
+
visitor.visitTableExpr?.(node);
|
|
111
|
+
walk(node.expr.ast, visitor);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (isJoin(node)) {
|
|
115
|
+
visitor.visitJoin?.(node);
|
|
116
|
+
if (node.on !== void 0) {
|
|
117
|
+
walkExpr(node.on, visitor);
|
|
118
|
+
}
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
visitor.visitBaseFrom?.(node);
|
|
122
|
+
}
|
|
123
|
+
function walk(node, visitor) {
|
|
124
|
+
if (typeof node !== "object" || node === null) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const typed = node;
|
|
128
|
+
if (typed["type"] === "select") {
|
|
129
|
+
const sel = node;
|
|
130
|
+
visitor.visitSelect?.(sel);
|
|
131
|
+
for (const withItem of sel.with ?? []) {
|
|
132
|
+
visitor.visitWith?.(withItem);
|
|
133
|
+
walk(withItem.stmt.ast, visitor);
|
|
134
|
+
}
|
|
135
|
+
let fromItems;
|
|
136
|
+
if (Array.isArray(sel.from)) {
|
|
137
|
+
fromItems = sel.from;
|
|
138
|
+
} else if (sel.from !== null) {
|
|
139
|
+
fromItems = [sel.from];
|
|
140
|
+
} else {
|
|
141
|
+
fromItems = [];
|
|
142
|
+
}
|
|
143
|
+
for (const fromItem of fromItems) {
|
|
144
|
+
walkFrom(fromItem, visitor);
|
|
145
|
+
}
|
|
146
|
+
for (const col of sel.columns) {
|
|
147
|
+
walkExpr(col, visitor);
|
|
148
|
+
}
|
|
149
|
+
if (sel.where !== null) {
|
|
150
|
+
walkExpr(sel.where, visitor);
|
|
151
|
+
}
|
|
152
|
+
if (sel._next !== void 0) {
|
|
153
|
+
walk(sel._next, visitor);
|
|
154
|
+
}
|
|
155
|
+
} else {
|
|
156
|
+
walkExpr(node, visitor);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function extractColumnRefs(expr) {
|
|
160
|
+
const refs = [];
|
|
161
|
+
walkExpr(expr, {
|
|
162
|
+
visitColumnRef(node) {
|
|
163
|
+
refs.push(node);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return refs;
|
|
167
|
+
}
|
|
168
|
+
function extractJsonExtractPath(expr) {
|
|
169
|
+
let path;
|
|
170
|
+
walkExpr(expr, {
|
|
171
|
+
visitFunction(node) {
|
|
172
|
+
if (path !== void 0) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const fnName = node.name.name[0]?.value;
|
|
176
|
+
if (fnName === "json_extract_scalar" || fnName === "json_extract") {
|
|
177
|
+
const pathArg = node.args?.value[1];
|
|
178
|
+
if (pathArg !== void 0) {
|
|
179
|
+
const val = pathArg.value;
|
|
180
|
+
if (typeof val === "string") {
|
|
181
|
+
path = val;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
log("extractJsonExtractPath, function:", fnName, path);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
return path;
|
|
189
|
+
}
|
|
190
|
+
function extractJsonExtractCalls(expr) {
|
|
191
|
+
const calls = [];
|
|
192
|
+
walkExpr(expr, {
|
|
193
|
+
visitFunction(node) {
|
|
194
|
+
const fnName = node.name.name[0]?.value;
|
|
195
|
+
if (fnName !== "json_extract_scalar" && fnName !== "json_extract") {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const sourceArg = node.args?.value[0];
|
|
199
|
+
const pathArg = node.args?.value[1];
|
|
200
|
+
if (sourceArg === void 0 || pathArg === void 0) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const sourceRefs = extractColumnRefs(sourceArg);
|
|
204
|
+
if (sourceRefs.length !== 1) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const [ref] = sourceRefs;
|
|
208
|
+
const path = pathArg.value;
|
|
209
|
+
if (ref === void 0 || typeof path !== "string") {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
calls.push({ ref, path });
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
return calls;
|
|
216
|
+
}
|
|
217
|
+
function extractBracketAccessorPath(expr) {
|
|
218
|
+
let path;
|
|
219
|
+
walkExpr(expr, {
|
|
220
|
+
visitColumnRef(node) {
|
|
221
|
+
if (path !== void 0 || !hasArrayIndex(node)) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const indexValue = node.array_index[0]?.index.value;
|
|
225
|
+
if (typeof indexValue === "string") {
|
|
226
|
+
path = `$["${indexValue}"]`;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
return path;
|
|
231
|
+
}
|
|
232
|
+
function hasFunctionCalls(expr) {
|
|
233
|
+
let found = false;
|
|
234
|
+
walkExpr(expr, {
|
|
235
|
+
visitFunction() {
|
|
236
|
+
found = true;
|
|
237
|
+
},
|
|
238
|
+
visitAggrFunc() {
|
|
239
|
+
found = true;
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
return found;
|
|
243
|
+
}
|
|
244
|
+
export {
|
|
245
|
+
extractBracketAccessorPath,
|
|
246
|
+
extractColumnRefs,
|
|
247
|
+
extractJsonExtractCalls,
|
|
248
|
+
extractJsonExtractPath,
|
|
249
|
+
hasArrayIndex,
|
|
250
|
+
hasFunctionCalls,
|
|
251
|
+
isBaseFrom,
|
|
252
|
+
isDual,
|
|
253
|
+
isJoin,
|
|
254
|
+
isTableExpr,
|
|
255
|
+
isUnnestFrom,
|
|
256
|
+
walk
|
|
257
|
+
};
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2F0aGVuYS92aXNpdG9yLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLE9BQU8sV0FBVztBQUVsQixJQUFNLE1BQU0sTUFBTSxnQkFBZ0I7QUFpRTNCLFNBQVMsYUFBYSxNQUFtQztBQUM5RCxTQUFPLE9BQU8sU0FBUyxZQUFZLFNBQVMsUUFBUyxLQUE0QixTQUFTO0FBQzVGO0FBRU8sU0FBUyxPQUFPLE1BQTZCO0FBQ2xELFNBQU8sT0FBTyxTQUFTLFlBQVksU0FBUyxRQUFTLEtBQTRCLFNBQVM7QUFDNUY7QUFFTyxTQUFTLFlBQVksTUFBa0M7QUFDNUQsTUFBSSxPQUFPLFNBQVMsWUFBWSxTQUFTLE1BQU07QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFDQSxRQUFNLE9BQVEsS0FBNEI7QUFDMUMsU0FBTyxPQUFPLFNBQVMsWUFBWSxTQUFTLFFBQVEsU0FBUztBQUMvRDtBQUVPLFNBQVMsT0FBTyxNQUE2QjtBQUNsRCxTQUNFLENBQUMsYUFBYSxJQUFJLEtBQ2xCLENBQUMsT0FBTyxJQUFJLEtBQ1osQ0FBQyxZQUFZLElBQUksS0FDakIsT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxVQUFVO0FBRWQ7QUFFTyxTQUFTLFdBQVcsTUFBaUM7QUFDMUQsU0FDRSxDQUFDLGFBQWEsSUFBSSxLQUNsQixDQUFDLE9BQU8sSUFBSSxLQUNaLENBQUMsWUFBWSxJQUFJLEtBQ2pCLENBQUMsT0FBTyxJQUFJLEtBQ1osT0FBTyxTQUFTLFlBQ2hCLFNBQVMsUUFDVCxXQUFXO0FBRWY7QUFFTyxTQUFTLGNBQWMsTUFBaUQ7QUFDN0UsUUFBTSxRQUFRO0FBQ2QsU0FBTyxNQUFNLFFBQVEsTUFBTSxXQUFXLEtBQUssTUFBTSxZQUFZLFNBQVM7QUFDeEU7QUFPQSxTQUFTLFNBQVMsTUFBZSxTQUEyQjtBQUMxRCxNQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVMsTUFBTTtBQUM3QztBQUFBLEVBQ0Y7QUFDQSxRQUFNLFFBQVE7QUFFZCxVQUFRLE1BQU0s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
|
package/dist-mjs/index.mjs
CHANGED
|
@@ -20,6 +20,7 @@ import requireServiceCallResponseDeclaration, {
|
|
|
20
20
|
import requireAwsConfig, { ruleId as requireAwsConfigRuleId } from "./aws/require-aws-config.mjs";
|
|
21
21
|
import requireAWSBareBones, { ruleId as requireAWSBareBonesRuleId } from "./aws/require-aws-bare-bones.mjs";
|
|
22
22
|
import requireConsistentRead, { ruleId as requireConsistentReadRuleId } from "./aws/require-consistent-read.mjs";
|
|
23
|
+
import athena, { ruleId as athenaRuleId } from "./athena/athena.mjs";
|
|
23
24
|
import filePathComment from "./file-path-comment.mjs";
|
|
24
25
|
import noCardNumbers from "./no-card-numbers.mjs";
|
|
25
26
|
import noEnum from "./no-enum.mjs";
|
|
@@ -64,7 +65,8 @@ var rules = {
|
|
|
64
65
|
[requireFixedServicesImportRuleId]: requireFixedServicesImport,
|
|
65
66
|
[requireTypeOutOfTypeOnlyImportsRuleId]: requireTypeOutOfTypeOnlyImports,
|
|
66
67
|
[requireAWSBareBonesRuleId]: requireAWSBareBones,
|
|
67
|
-
[requireConsistentReadRuleId]: requireConsistentRead
|
|
68
|
+
[requireConsistentReadRuleId]: requireConsistentRead,
|
|
69
|
+
[athenaRuleId]: athena
|
|
68
70
|
};
|
|
69
71
|
var plugin = {
|
|
70
72
|
rules
|
|
@@ -104,7 +106,8 @@ var configs = {
|
|
|
104
106
|
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "error",
|
|
105
107
|
[`@checkdigit/${requireConsistentReadRuleId}`]: "error",
|
|
106
108
|
[`@checkdigit/${requireAwsConfigRuleId}`]: "error",
|
|
107
|
-
[`@checkdigit/${requireAWSBareBonesRuleId}`]: "error"
|
|
109
|
+
[`@checkdigit/${requireAWSBareBonesRuleId}`]: "error",
|
|
110
|
+
[`@checkdigit/${athenaRuleId}`]: "error"
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
113
|
],
|
|
@@ -142,7 +145,8 @@ var configs = {
|
|
|
142
145
|
[`@checkdigit/${requireServiceCallResponseDeclarationRuleId}`]: "off",
|
|
143
146
|
[`@checkdigit/${requireConsistentReadRuleId}`]: "off",
|
|
144
147
|
[`@checkdigit/${requireAwsConfigRuleId}`]: "off",
|
|
145
|
-
[`@checkdigit/${requireAWSBareBonesRuleId}`]: "off"
|
|
148
|
+
[`@checkdigit/${requireAWSBareBonesRuleId}`]: "off",
|
|
149
|
+
[`@checkdigit/${athenaRuleId}`]: "off"
|
|
146
150
|
}
|
|
147
151
|
}
|
|
148
152
|
]
|
|
@@ -156,4 +160,4 @@ export {
|
|
|
156
160
|
index_default as default,
|
|
157
161
|
default2 as isAwsSdkV3Used
|
|
158
162
|
};
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,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
|
|
@@ -60,4 +60,4 @@ export {
|
|
|
60
60
|
no_status_code_assert_default as default,
|
|
61
61
|
ruleId
|
|
62
62
|
};
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25vLXN0YXR1cy1jb2RlLWFzc2VydC50cyJdLAogICJtYXBwaW5ncyI6ICI7QUFRQSxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLGdCQUFnQixtQkFBaUQ7QUFDMUUsT0FBTyx5QkFBeUI7QUFFekIsSUFBTSxTQUFTO0FBQ3RCLElBQU0sd0JBQXdCO0FBRTlCLElBQU0sYUFBYSxZQUFZLFlBQVksQ0FBQyxTQUFTLG9CQUFvQixJQUFJLENBQUM7QUFHOUUsSUFBTSx1QkFBdUIsQ0FBQyxRQUFnQztBQUM1RCxVQUFRLElBQUksTUFBTTtBQUFBLElBQ2hCLEtBQUssZUFBZSxrQkFBa0I7QUFDcEMsWUFBTSxTQUFTLElBQUk7QUFDbkIsWUFBTSxXQUFXLElBQUk7QUFDckIsVUFDRSxPQUFPLFNBQVMsZUFBZSxjQUMvQixPQUFPLFNBQVMsaUJBQ2hCLFNBQVMsU0FBUyxlQUFlLFlBQ2pDO0FBQ0EsZUFBTztBQUFBLE1BQ1Q7QUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUssZUFBZTtBQUNsQixVQUFJLE9BQU8sSUFBSSxVQUFVLFlBQVksT0FBTyxPQUFPLFdBQVcsRUFBRSxTQUFTLElBQUksS0FBSyxHQUFHO0FBQ25GLGVBQU87QUFBQSxNQUNUO0FBQ0E7QUFBQSxJQUNGLEtBQUssZUFBZTtBQUNsQixhQUFPLHFCQUFxQixJQUFJLElBQUksS0FBSyxxQkFBcUIsSUFBSSxLQUFLO0FBQUEsRUFDM0U7QUFDQSxTQUFPO0FBQ1Q7QUFHQSxJQUFNLHFCQUFxQixDQUFDLFNBQzFCLEtBQUssU0FBUyxlQUFlLGNBQWMsS0FBSyxTQUFTO0FBRzNELElBQU0sMkJBQTJCLENBQUMsU0FDaEMsS0FBSyxTQUFTLGVBQWUsb0JBQzdCLEtBQUssT0FBTyxTQUFTLGVBQWUsY0FDcEMsS0FBSyxPQUFPLFNBQVMsWUFDckIsS0FBSyxTQUFTLFNBQVMsZUFBZTtBQUV4QyxJQUFNLDZCQUE2QixDQUFDLFFBQXVCLFVBQ3hELG1CQUFtQixNQUFNLEtBQUsseUJBQXlCLE1BQU0sTUFBTSxLQUFLLEtBQUssQ0FBQyxRQUFRLHFCQUFxQixHQUFHLENBQUM7QUFFbEgsSUFBTSxPQUEwRCxXQUFXO0FBQUEsRUFDekUsTUFBTTtBQUFBLEVBQ04sTUFBTTtBQUFBLElBQ0osTUFBTTtBQUFBLElBQ04sTUFBTTtBQUFBLE1BQ0osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFFBQVEsQ0FBQztBQUFBLElBQ1QsVUFBVTtBQUFBLE1BQ1IsQ0FBQyxxQkFBcUIsR0FBRztBQUFBLElBQzNCO0FBQUEsRUFDRjtBQUFBLEVBQ0EsZ0JBQWdCLENBQUM7QUFBQSxFQUNqQixPQUFPLFNBQVM7QUFDZCxXQUFPO0FBQUEsTUFDTCxlQUFlLE1BQStCO0FBQzVDLGNBQU0sU0FBUyxLQUFLO0FBQ3BCLFlBQUksMkJBQTJCLFFBQVEsS0FBSyxTQUFTLEdBQUc7QUFDdEQsa0JBQVEsT0FBTztBQUFBLFlBQ2I7QUFBQSxZQUNBLFdBQVc7QUFBQSxVQUNiLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQUVELElBQU8sZ0NBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/openapi/deref-schema.ts
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import { dereference } from "@apidevtools/json-schema-ref-parser";
|
|
4
|
+
async function derefSchema(schemaFileName) {
|
|
5
|
+
const schemaFile = await fs.readFile(`${schemaFileName}.json`, "utf-8");
|
|
6
|
+
const adjustedSchemaFileForDeref = schemaFile.replace(/"\$ref": ".*\/definitions\//gu, '"$ref": "#/definitions/');
|
|
7
|
+
const json = JSON.parse(adjustedSchemaFileForDeref);
|
|
8
|
+
const deref = await dereference(json);
|
|
9
|
+
await fs.writeFile(`${schemaFileName}.deref.json`, JSON.stringify(deref, null, 2));
|
|
10
|
+
}
|
|
11
|
+
export {
|
|
12
|
+
derefSchema
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvZGVyZWYtc2NoZW1hLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsWUFBWSxVQUFVO0FBRS9CLFNBQVMsbUJBQW1CO0FBRTVCLGVBQXNCLFlBQVksZ0JBQXVDO0FBQ3ZFLFFBQU0sYUFBYSxNQUFNLEdBQUcsU0FBUyxHQUFHLGNBQWMsU0FBUyxPQUFPO0FBQ3RFLFFBQU0sNkJBQTZCLFdBQVcsUUFBUSxpQ0FBaUMseUJBQXlCO0FBRWhILFFBQU0sT0FBTyxLQUFLLE1BQU0sMEJBQTBCO0FBQ2xELFFBQU0sUUFBUSxNQUFNLFlBQVksSUFBSTtBQUNwQyxRQUFNLEdBQUcsVUFBVSxHQUFHLGNBQWMsZUFBZSxLQUFLLFVBQVUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUNuRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// src/openapi/generate-schema.ts
|
|
2
|
+
import { strict as assert } from "node:assert";
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import debug from "debug";
|
|
5
|
+
import { getReasonPhrase } from "http-status-codes";
|
|
6
|
+
import pointer from "json-pointer";
|
|
7
|
+
import jsYaml from "js-yaml";
|
|
8
|
+
import { generateSchemasForService } from "./service-schema-generator.mjs";
|
|
9
|
+
var commandName = "generate-schema";
|
|
10
|
+
var log = debug("openapi-cli:generate-schema");
|
|
11
|
+
var ALL_OPERATION_METHODS = ["get", "put", "post", "head", "trace", "patch", "delete", "options"];
|
|
12
|
+
var JSON_SCHEMA_META_2020_URL = "https://json-schema.org/draft/2020-12/schema";
|
|
13
|
+
var OPENAPI_SCHEMA_DEFINITIONS_REFERENCE_URI_BASE = "#/components/schemas/";
|
|
14
|
+
var SWAGGER_SCHEMA_FILENAME = "swagger.schema.json";
|
|
15
|
+
function isRequestBodyAllowed(method) {
|
|
16
|
+
return ["post", "put", "patch"].includes(method);
|
|
17
|
+
}
|
|
18
|
+
function isReferenceObject(schema) {
|
|
19
|
+
return Object.hasOwn(schema, "$ref");
|
|
20
|
+
}
|
|
21
|
+
function resolve(document, reference) {
|
|
22
|
+
if (!isReferenceObject(reference)) {
|
|
23
|
+
return reference;
|
|
24
|
+
}
|
|
25
|
+
const referencePointer = reference.$ref.slice(1);
|
|
26
|
+
const resolvedReference = pointer.get(document, referencePointer);
|
|
27
|
+
return resolve(document, resolvedReference);
|
|
28
|
+
}
|
|
29
|
+
function getParameters(parameters, document) {
|
|
30
|
+
return parameters.map((parameter) => resolve(document, parameter));
|
|
31
|
+
}
|
|
32
|
+
function getRequestParametersSchema(operation, parameterType, document) {
|
|
33
|
+
if (operation.parameters === void 0) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let parameters = getParameters(operation.parameters, document);
|
|
37
|
+
parameters = parameters.filter((parameter) => parameter.in === parameterType);
|
|
38
|
+
if (parameters.length === 0) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const parametersSchema = Object.fromEntries(
|
|
42
|
+
parameters.map((parameter) => [
|
|
43
|
+
parameterType === "header" ? parameter.name.toLowerCase() : parameter.name,
|
|
44
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
45
|
+
parameter.schema ?? { type: "string" }
|
|
46
|
+
])
|
|
47
|
+
);
|
|
48
|
+
const requiredParameterNames = parameters.filter((parameter) => parameter.required === true).map((parameter) => parameter.name);
|
|
49
|
+
const schema = {
|
|
50
|
+
type: "object",
|
|
51
|
+
// header parameters can have additional properties, we allow them in the runtime validation
|
|
52
|
+
additionalProperties: parameterType === "header",
|
|
53
|
+
properties: parametersSchema,
|
|
54
|
+
...requiredParameterNames.length > 0 ? { required: requiredParameterNames } : {}
|
|
55
|
+
};
|
|
56
|
+
return schema;
|
|
57
|
+
}
|
|
58
|
+
function getBodySchema(contents) {
|
|
59
|
+
if (contents === void 0) {
|
|
60
|
+
return void 0;
|
|
61
|
+
}
|
|
62
|
+
const schema = Object.values(contents)[0]?.schema;
|
|
63
|
+
if (schema !== void 0 && Object.keys(schema).length === 0) {
|
|
64
|
+
return void 0;
|
|
65
|
+
}
|
|
66
|
+
return schema;
|
|
67
|
+
}
|
|
68
|
+
function getRequestBodySchema(operation, document) {
|
|
69
|
+
if (!Object.hasOwn(operation, "requestBody")) {
|
|
70
|
+
return {
|
|
71
|
+
isRequestBodyRequired: false,
|
|
72
|
+
requestBodySchema: void 0
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const requestBody = resolve(document, operation.requestBody);
|
|
76
|
+
return {
|
|
77
|
+
isRequestBodyRequired: requestBody?.required,
|
|
78
|
+
requestBodySchema: getBodySchema(requestBody?.content)
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function getRequestContextSchema(method, operation, operationId, document, apiSchemasBaseUri) {
|
|
82
|
+
const requestPathParametersSchema = getRequestParametersSchema(operation, "path", document);
|
|
83
|
+
const requestQueryParametersSchema = getRequestParametersSchema(operation, "query", document);
|
|
84
|
+
const requestHeadersSchema = getRequestParametersSchema(operation, "header", document);
|
|
85
|
+
const { requestBodySchema, isRequestBodyRequired } = getRequestBodySchema(operation, document);
|
|
86
|
+
if (requestBodySchema !== void 0 && !isRequestBodyAllowed(method)) {
|
|
87
|
+
throw new Error(`Request body is not allowed for ${method} method`);
|
|
88
|
+
}
|
|
89
|
+
const responseContextSchemaName = `${operationId}RequestContext`;
|
|
90
|
+
const requestContextSchema = {
|
|
91
|
+
$schema: JSON_SCHEMA_META_2020_URL,
|
|
92
|
+
$id: `${apiSchemasBaseUri}/${responseContextSchemaName}`,
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: {
|
|
95
|
+
...requestPathParametersSchema ? { params: requestPathParametersSchema } : {},
|
|
96
|
+
...requestQueryParametersSchema ? { params: requestQueryParametersSchema } : {},
|
|
97
|
+
headers: requestHeadersSchema ?? { type: "object", additionalProperties: true },
|
|
98
|
+
...requestBodySchema ? { body: requestBodySchema } : {}
|
|
99
|
+
},
|
|
100
|
+
required: [
|
|
101
|
+
...requestPathParametersSchema?.required ? ["params"] : [],
|
|
102
|
+
...requestQueryParametersSchema?.required ? ["query"] : [],
|
|
103
|
+
...requestHeadersSchema?.required ? ["headers"] : [],
|
|
104
|
+
...isRequestBodyRequired === true ? ["body"] : []
|
|
105
|
+
],
|
|
106
|
+
additionalProperties: false
|
|
107
|
+
};
|
|
108
|
+
return requestContextSchema;
|
|
109
|
+
}
|
|
110
|
+
function getResponseReason(status) {
|
|
111
|
+
return status === "default" ? `Default` : getReasonPhrase(status).replaceAll(/\s/gu, "");
|
|
112
|
+
}
|
|
113
|
+
function getResponseBodySchema(response) {
|
|
114
|
+
return getBodySchema(response.content);
|
|
115
|
+
}
|
|
116
|
+
function getResponseHeadersSchema(headers, document) {
|
|
117
|
+
if (headers === void 0 || Object.keys(headers).length === 0) {
|
|
118
|
+
return void 0;
|
|
119
|
+
}
|
|
120
|
+
const resolvedHeaders = Object.fromEntries(
|
|
121
|
+
Object.entries(headers).map(([name, header]) => [name.toLowerCase(), resolve(document, header)])
|
|
122
|
+
);
|
|
123
|
+
const resolvedHeaderSchemas = Object.fromEntries(
|
|
124
|
+
Object.entries(resolvedHeaders).map(([name, header]) => [
|
|
125
|
+
name,
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
|
|
127
|
+
header.schema ?? { type: "string" }
|
|
128
|
+
])
|
|
129
|
+
);
|
|
130
|
+
const requiredHeaderNames = Object.entries(resolvedHeaders).filter(([_name, header]) => header.required === true).map(([name]) => name);
|
|
131
|
+
return {
|
|
132
|
+
type: "object",
|
|
133
|
+
properties: resolvedHeaderSchemas,
|
|
134
|
+
...requiredHeaderNames.length === 0 ? {} : { required: requiredHeaderNames }
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
function getResponseSchema(status, response, document, apiSchemasBaseUri, operationId) {
|
|
138
|
+
const resolvedResponse = resolve(document, response);
|
|
139
|
+
const responseBodySchema = getResponseBodySchema(resolvedResponse);
|
|
140
|
+
const responseHeadersSchema = getResponseHeadersSchema(resolvedResponse.headers, document);
|
|
141
|
+
const schemaName = `${operationId}Response${getResponseReason(status)}`;
|
|
142
|
+
return {
|
|
143
|
+
$schema: JSON_SCHEMA_META_2020_URL,
|
|
144
|
+
$id: `${apiSchemasBaseUri}/${schemaName}`,
|
|
145
|
+
type: "object",
|
|
146
|
+
properties: {
|
|
147
|
+
headers: responseHeadersSchema ?? { type: "object", additionalProperties: true },
|
|
148
|
+
...responseBodySchema ? { body: responseBodySchema } : {}
|
|
149
|
+
},
|
|
150
|
+
required: [
|
|
151
|
+
...responseHeadersSchema?.required !== void 0 && responseHeadersSchema.required.length > 0 ? ["headers"] : [],
|
|
152
|
+
...responseBodySchema ? ["body"] : []
|
|
153
|
+
],
|
|
154
|
+
additionalProperties: false
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function getResponseContextSchemas(operation, operationId, document, apiSchemasBaseUri) {
|
|
158
|
+
assert.ok(operation.responses !== void 0, "Operation responses must be defined");
|
|
159
|
+
return Object.fromEntries(
|
|
160
|
+
Object.entries(operation.responses).map(([status, response]) => [
|
|
161
|
+
status.toLowerCase(),
|
|
162
|
+
getResponseSchema(status.toLowerCase(), response, document, apiSchemasBaseUri, operationId)
|
|
163
|
+
])
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
function getOperationId(path, method, operation, operationIds) {
|
|
167
|
+
const operationIdBase = operation.operationId ?? `${path}-${method}`;
|
|
168
|
+
const parts = operationIdBase.split(/[-=/]/u);
|
|
169
|
+
const operationId = parts.filter((part) => part.trim() !== "" && !/\{.*\}/u.test(part)).map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`).join("");
|
|
170
|
+
if (!operationIds.has(operationId)) {
|
|
171
|
+
return operationId;
|
|
172
|
+
}
|
|
173
|
+
let operationIdIndex = 1;
|
|
174
|
+
while (operationIds.has(`${operationId}${operationIdIndex}`)) {
|
|
175
|
+
operationIdIndex += 1;
|
|
176
|
+
}
|
|
177
|
+
return `${operationId}${operationIdIndex}`;
|
|
178
|
+
}
|
|
179
|
+
function updateOpenapiSchemaDefinitionsReferences(value, relativeSchemaDefinitionReferenceUri, key) {
|
|
180
|
+
if (typeof value === "string" && key === "$ref" && value.startsWith(OPENAPI_SCHEMA_DEFINITIONS_REFERENCE_URI_BASE)) {
|
|
181
|
+
return value.replace(OPENAPI_SCHEMA_DEFINITIONS_REFERENCE_URI_BASE, relativeSchemaDefinitionReferenceUri);
|
|
182
|
+
}
|
|
183
|
+
if (Array.isArray(value)) {
|
|
184
|
+
return value.map((item) => updateOpenapiSchemaDefinitionsReferences(item, relativeSchemaDefinitionReferenceUri));
|
|
185
|
+
}
|
|
186
|
+
if (typeof value === "object" && value !== null) {
|
|
187
|
+
return Object.fromEntries(
|
|
188
|
+
Object.entries(value).map(([childKey, childValue]) => [
|
|
189
|
+
childKey,
|
|
190
|
+
updateOpenapiSchemaDefinitionsReferences(childValue, relativeSchemaDefinitionReferenceUri, childKey)
|
|
191
|
+
])
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
return value;
|
|
195
|
+
}
|
|
196
|
+
function buildApiSchemaFromDocument(document, organization, serviceName) {
|
|
197
|
+
if (document.paths === void 0) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
const serverUri = document.servers?.[0]?.url;
|
|
201
|
+
if (serverUri === void 0) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
const serverPathname = serverUri.startsWith("http") ? new URL(serverUri).pathname : serverUri;
|
|
205
|
+
const endpointSchemasBaseUri = `https://${serviceName}.${organization}${serverPathname}/schemas`;
|
|
206
|
+
const apiSchemasBaseUri = `${endpointSchemasBaseUri}/api`;
|
|
207
|
+
const apiSchemas = {};
|
|
208
|
+
const allSchemas = { apis: apiSchemas };
|
|
209
|
+
const operationIds = /* @__PURE__ */ new Set();
|
|
210
|
+
for (const [path, pathItems] of Object.entries(document.paths)) {
|
|
211
|
+
const koaPath = path.replaceAll(/\{([^}]+)\}/gu, ":$1");
|
|
212
|
+
const pathSchemas = {};
|
|
213
|
+
apiSchemas[`${serverPathname}${koaPath}`] = pathSchemas;
|
|
214
|
+
for (const method of ALL_OPERATION_METHODS) {
|
|
215
|
+
const operation = pathItems?.[method];
|
|
216
|
+
if (operation !== void 0) {
|
|
217
|
+
const operationId = getOperationId(path, method, operation, operationIds);
|
|
218
|
+
operationIds.add(operationId);
|
|
219
|
+
pathSchemas[method] = {
|
|
220
|
+
request: getRequestContextSchema(method, operation, operationId, document, apiSchemasBaseUri),
|
|
221
|
+
responses: getResponseContextSchemas(operation, operationId, document, apiSchemasBaseUri)
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (document.components?.schemas !== void 0) {
|
|
227
|
+
allSchemas.definitions = Object.fromEntries(
|
|
228
|
+
Object.entries(document.components.schemas).map(([name, schema]) => [
|
|
229
|
+
name,
|
|
230
|
+
{ $schema: JSON_SCHEMA_META_2020_URL, $id: `${endpointSchemasBaseUri}/definitions/${name}`, ...schema }
|
|
231
|
+
])
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
const relativeSchemaDefinitionReferenceUri = `${serverPathname}/schemas/definitions/`;
|
|
235
|
+
return updateOpenapiSchemaDefinitionsReferences(
|
|
236
|
+
structuredClone(allSchemas),
|
|
237
|
+
relativeSchemaDefinitionReferenceUri
|
|
238
|
+
);
|
|
239
|
+
}
|
|
240
|
+
function buildApiSchemaFromYaml(yamlContent, organization, serviceName) {
|
|
241
|
+
const document = jsYaml.load(yamlContent);
|
|
242
|
+
return buildApiSchemaFromDocument(document, organization, serviceName);
|
|
243
|
+
}
|
|
244
|
+
async function generateEndpointSchemas(organization, serviceName, root, endpoint) {
|
|
245
|
+
const documentContents = await fs.readFile(`${root}/${endpoint}/swagger.yml`, "utf8");
|
|
246
|
+
const document = await jsYaml.load(documentContents);
|
|
247
|
+
const normalizedApiSchemas = buildApiSchemaFromDocument(document, organization, serviceName);
|
|
248
|
+
if (normalizedApiSchemas === null) {
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
const swaggerSchemaFilename = `${root}/${endpoint}/${SWAGGER_SCHEMA_FILENAME}`;
|
|
252
|
+
await fs.writeFile(swaggerSchemaFilename, JSON.stringify(normalizedApiSchemas, void 0, 2));
|
|
253
|
+
log(`Generated schema ${swaggerSchemaFilename}`);
|
|
254
|
+
}
|
|
255
|
+
async function generateSchemas() {
|
|
256
|
+
const serviceJsonPackageFile = await fs.readFile(`./package.json`, "utf8");
|
|
257
|
+
const packageJson = JSON.parse(serviceJsonPackageFile);
|
|
258
|
+
const [organization, serviceName] = packageJson.name.slice(1).split("/");
|
|
259
|
+
assert.ok(organization !== void 0 && serviceName !== void 0, "Invalid package name");
|
|
260
|
+
await Promise.all(
|
|
261
|
+
packageJson.service.api.endpoints.map(
|
|
262
|
+
(endpoint) => generateEndpointSchemas(organization, serviceName, packageJson.service.api.root, endpoint)
|
|
263
|
+
)
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
export {
|
|
267
|
+
SWAGGER_SCHEMA_FILENAME,
|
|
268
|
+
buildApiSchemaFromYaml,
|
|
269
|
+
commandName,
|
|
270
|
+
generateSchemas,
|
|
271
|
+
generateSchemasForService
|
|
272
|
+
};
|
|
273
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL29wZW5hcGkvZ2VuZXJhdGUtc2NoZW1hLnRzIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVBLFNBQVMsVUFBVSxjQUFjO0FBQ2pDLFNBQVMsWUFBWSxVQUFVO0FBRS9CLE9BQU8sV0FBVztBQUNsQixTQUFTLHVCQUF1QjtBQUNoQyxPQUFPLGFBQWE7QUFDcEIsT0FBTyxZQUFZO0FBS25CLFNBQVMsaUNBQWlDO0FBRG5DLElBQU0sY0FBYztBQUczQixJQUFNLE1BQU0sTUFBTSw2QkFBNkI7QUFFL0MsSUFBTSx3QkFBd0IsQ0FBQyxPQUFPLE9BQU8sUUFBUSxRQUFRLFNBQVMsU0FBUyxVQUFVLFNBQVM7QUFDbEcsSUFBTSw0QkFBNEI7QUFDbEMsSUFBTSxnREFBZ0Q7QUFDL0MsSUFBTSwwQkFBMEI7QUFrQ3ZDLFNBQVMscUJBQXFCLFFBQXlCO0FBQ3JELFNBQU8sQ0FBQyxRQUFRLE9BQU8sT0FBTyxFQUFFLFNBQVMsTUFBTTtBQUNqRDtBQUVBLFNBQVMsa0JBQWtCLFFBQWdEO0FBQ3pFLFNBQU8sT0FBTyxPQUFPLFFBQStCLE1BQU07QUFDNUQ7QUFFQSxTQUFTLFFBQVcsVUFBd0IsV0FBdUM7QUFDakYsTUFBSSxDQUFDLGtCQUFrQixTQUFTLEdBQUc7QUFDakMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixVQUFVLEtBQUssTUFBTSxDQUFDO0FBQy9DLFFBQU0sb0JBQW9CLFFBQVEsSUFBSSxVQUFVLGdCQUFnQjtBQUNoRSxTQUFPLFFBQVEsVUFBVSxpQkFBaUI7QUFDNUM7QUFFQSxTQUFTLGNBQ1AsWUFDQSxVQUN1QjtBQUN2QixTQUFPLFdBQVcsSUFBSSxDQUFDLGNBQWMsUUFBUSxVQUFVLFNBQVMsQ0FBQztBQUNuRTtBQUVBLFNBQVMsMkJBQ1AsV0FDQSxlQUNBLFVBQzhCO0FBQzlCLE1BQUksVUFBVSxlQUFlLFFBQVc7QUFDdEM7QUFBQSxFQUNGO0FBRUEsTUFBSSxhQUFhLGNBQWMsVUFBVSxZQUFZLFFBQVE7QUFD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
|