@accordproject/template-engine 2.1.1 → 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/index.d.ts +53 -2
- package/dist/index.js +739 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +713 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +6 -2
- package/dist/Common.d.ts +0 -20
- package/dist/Common.js +0 -55
- package/dist/Common.js.map +0 -1
- package/dist/TemplateMarkInterpreter.d.ts +0 -34
- package/dist/TemplateMarkInterpreter.js +0 -402
- package/dist/TemplateMarkInterpreter.js.map +0 -1
- package/dist/TemplateMarkToJavaScriptCompiler.d.ts +0 -20
- package/dist/TemplateMarkToJavaScriptCompiler.js +0 -99
- package/dist/TemplateMarkToJavaScriptCompiler.js.map +0 -1
- package/dist/TemplateMarkToTypeScriptCompiler.d.ts +0 -77
- package/dist/TemplateMarkToTypeScriptCompiler.js +0 -311
- package/dist/TemplateMarkToTypeScriptCompiler.js.map +0 -1
- package/dist/TypeScriptCompilationContext.d.ts +0 -15
- package/dist/TypeScriptCompilationContext.js +0 -57
- package/dist/TypeScriptCompilationContext.js.map +0 -1
- package/dist/TypeScriptRuntime.d.ts +0 -14
- package/dist/TypeScriptRuntime.js +0 -79
- package/dist/TypeScriptRuntime.js.map +0 -1
- package/dist/TypeScriptToJavaScriptCompiler.d.ts +0 -16
- package/dist/TypeScriptToJavaScriptCompiler.js +0 -69
- package/dist/TypeScriptToJavaScriptCompiler.js.map +0 -1
- package/dist/compilers/Clause.d.ts +0 -14
- package/dist/compilers/Clause.js +0 -43
- package/dist/compilers/Clause.js.map +0 -1
- package/dist/compilers/Common.d.ts +0 -66
- package/dist/compilers/Common.js +0 -180
- package/dist/compilers/Common.js.map +0 -1
- package/dist/compilers/Conditional.d.ts +0 -12
- package/dist/compilers/Conditional.js +0 -36
- package/dist/compilers/Conditional.js.map +0 -1
- package/dist/compilers/ContractDefinition.d.ts +0 -8
- package/dist/compilers/ContractDefinition.js +0 -33
- package/dist/compilers/ContractDefinition.js.map +0 -1
- package/dist/compilers/EnumVariable.d.ts +0 -8
- package/dist/compilers/EnumVariable.js +0 -28
- package/dist/compilers/EnumVariable.js.map +0 -1
- package/dist/compilers/FormattedVariable.d.ts +0 -8
- package/dist/compilers/FormattedVariable.js +0 -29
- package/dist/compilers/FormattedVariable.js.map +0 -1
- package/dist/compilers/Formula.d.ts +0 -8
- package/dist/compilers/Formula.js +0 -24
- package/dist/compilers/Formula.js.map +0 -1
- package/dist/compilers/Join.d.ts +0 -8
- package/dist/compilers/Join.js +0 -23
- package/dist/compilers/Join.js.map +0 -1
- package/dist/compilers/ListBlock.d.ts +0 -11
- package/dist/compilers/ListBlock.js +0 -39
- package/dist/compilers/ListBlock.js.map +0 -1
- package/dist/compilers/NodeCompilers.d.ts +0 -7
- package/dist/compilers/NodeCompilers.js +0 -89
- package/dist/compilers/NodeCompilers.js.map +0 -1
- package/dist/compilers/Optional.d.ts +0 -11
- package/dist/compilers/Optional.js +0 -48
- package/dist/compilers/Optional.js.map +0 -1
- package/dist/compilers/Variable.d.ts +0 -8
- package/dist/compilers/Variable.js +0 -28
- package/dist/compilers/Variable.js.map +0 -1
- package/dist/compilers/With.d.ts +0 -10
- package/dist/compilers/With.js +0 -23
- package/dist/compilers/With.js.map +0 -1
- package/dist/drafting/Boolean/index.d.ts +0 -6
- package/dist/drafting/Boolean/index.js +0 -30
- package/dist/drafting/Boolean/index.js.map +0 -1
- package/dist/drafting/DateTime/index.d.ts +0 -7
- package/dist/drafting/DateTime/index.js +0 -33
- package/dist/drafting/DateTime/index.js.map +0 -1
- package/dist/drafting/Double/format.d.ts +0 -13
- package/dist/drafting/Double/format.js +0 -55
- package/dist/drafting/Double/format.js.map +0 -1
- package/dist/drafting/Double/index.d.ts +0 -7
- package/dist/drafting/Double/index.js +0 -33
- package/dist/drafting/Double/index.js.map +0 -1
- package/dist/drafting/Integer/format.d.ts +0 -13
- package/dist/drafting/Integer/format.js +0 -45
- package/dist/drafting/Integer/format.js.map +0 -1
- package/dist/drafting/Integer/index.d.ts +0 -7
- package/dist/drafting/Integer/index.js +0 -33
- package/dist/drafting/Integer/index.js.map +0 -1
- package/dist/drafting/Long/index.d.ts +0 -7
- package/dist/drafting/Long/index.js +0 -33
- package/dist/drafting/Long/index.js.map +0 -1
- package/dist/drafting/MonetaryAmount/currencycode.d.ts +0 -35
- package/dist/drafting/MonetaryAmount/currencycode.js +0 -53
- package/dist/drafting/MonetaryAmount/currencycode.js.map +0 -1
- package/dist/drafting/MonetaryAmount/index.d.ts +0 -12
- package/dist/drafting/MonetaryAmount/index.js +0 -67
- package/dist/drafting/MonetaryAmount/index.js.map +0 -1
- package/dist/drafting/String/index.d.ts +0 -6
- package/dist/drafting/String/index.js +0 -25
- package/dist/drafting/String/index.js.map +0 -1
- package/dist/drafting/index.d.ts +0 -1
- package/dist/drafting/index.js +0 -40
- package/dist/drafting/index.js.map +0 -1
- package/dist/model-gen/concerto.d.ts +0 -13
- package/dist/model-gen/concerto.js +0 -5
- package/dist/model-gen/concerto.js.map +0 -1
- package/dist/model-gen/concerto.metamodel@1.0.0.d.ts +0 -196
- package/dist/model-gen/concerto.metamodel@1.0.0.js +0 -5
- package/dist/model-gen/concerto.metamodel@1.0.0.js.map +0 -1
- package/dist/model-gen/concerto@1.0.0.d.ts +0 -19
- package/dist/model-gen/concerto@1.0.0.js +0 -5
- package/dist/model-gen/concerto@1.0.0.js.map +0 -1
- package/dist/model-gen/org.accordproject.ciceromark@0.6.0.d.ts +0 -49
- package/dist/model-gen/org.accordproject.ciceromark@0.6.0.js +0 -5
- package/dist/model-gen/org.accordproject.ciceromark@0.6.0.js.map +0 -1
- package/dist/model-gen/org.accordproject.commonmark@0.5.0.d.ts +0 -89
- package/dist/model-gen/org.accordproject.commonmark@0.5.0.js +0 -5
- package/dist/model-gen/org.accordproject.commonmark@0.5.0.js.map +0 -1
- package/dist/model-gen/org.accordproject.templatemark@0.5.0.d.ts +0 -76
- package/dist/model-gen/org.accordproject.templatemark@0.5.0.js +0 -12
- package/dist/model-gen/org.accordproject.templatemark@0.5.0.js.map +0 -1
- package/dist/runtime/declarations.d.ts +0 -2
- package/dist/runtime/declarations.js +0 -21
- package/dist/runtime/declarations.js.map +0 -1
- package/dist/runtime/runtime.d.ts +0 -1
- package/dist/runtime/runtime.js +0 -20
- package/dist/runtime/runtime.js.map +0 -1
- package/dist/runtime.tgz +0 -0
- package/dist/utils.d.ts +0 -5
- package/dist/utils.js +0 -43
- package/dist/utils.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,21 +1,739 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Object.
|
|
21
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jp = require('jsonpath');
|
|
4
|
+
var traverse = require('traverse');
|
|
5
|
+
var concertoCore = require('@accordproject/concerto-core');
|
|
6
|
+
var dayjs = require('dayjs');
|
|
7
|
+
var utc = require('dayjs/plugin/utc');
|
|
8
|
+
var markdownCommon = require('@accordproject/markdown-common');
|
|
9
|
+
var vfs = require('@typescript/vfs');
|
|
10
|
+
var twoslash = require('@typescript/twoslash');
|
|
11
|
+
var concertoCodegen = require('@accordproject/concerto-codegen');
|
|
12
|
+
var concertoUtil = require('@accordproject/concerto-util');
|
|
13
|
+
var markdownTemplate = require('@accordproject/markdown-template');
|
|
14
|
+
var fs = require('fs');
|
|
15
|
+
var lzstring = require('lz-string');
|
|
16
|
+
|
|
17
|
+
function _interopNamespaceDefault(e) {
|
|
18
|
+
var n = Object.create(null);
|
|
19
|
+
if (e) {
|
|
20
|
+
Object.keys(e).forEach(function (k) {
|
|
21
|
+
if (k !== 'default') {
|
|
22
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
23
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
get: function () { return e[k]; }
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
n.default = e;
|
|
31
|
+
return Object.freeze(n);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
var lzstring__namespace = /*#__PURE__*/_interopNamespaceDefault(lzstring);
|
|
35
|
+
|
|
36
|
+
function booleanDrafter(value) {
|
|
37
|
+
if (value) {
|
|
38
|
+
return "true";
|
|
39
|
+
} else {
|
|
40
|
+
return "false";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
dayjs.extend(utc);
|
|
45
|
+
function dateTimeDrafter(value, format) {
|
|
46
|
+
const f = format ? format : "MM/DD/YYYY";
|
|
47
|
+
return dayjs.utc(value).format(f);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function draftDoubleIEEE(value) {
|
|
51
|
+
if (Math.floor(value) === value) {
|
|
52
|
+
return new Number(value).toFixed(1);
|
|
53
|
+
} else {
|
|
54
|
+
return "" + value;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function draftDoubleFormat(value, format) {
|
|
58
|
+
return format.replace(/0(.)0((.)(0+))?/gi, function(_a, sep1, _b, sep2, digits) {
|
|
59
|
+
const len = digits ? digits.length : 0;
|
|
60
|
+
const vs = value.toFixed(len);
|
|
61
|
+
let res = "";
|
|
62
|
+
if (sep2) {
|
|
63
|
+
const d = vs.substring(vs.length - len);
|
|
64
|
+
res += sep2 + d;
|
|
65
|
+
}
|
|
66
|
+
let i = vs.substring(0, vs.length - (len === 0 ? 0 : len + 1));
|
|
67
|
+
while (i.length > 3) {
|
|
68
|
+
res = sep1 + i.substring(i.length - 3) + res;
|
|
69
|
+
i = i.substring(0, i.length - 3);
|
|
70
|
+
}
|
|
71
|
+
return i + res;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function doubleDrafter(value, format) {
|
|
76
|
+
if (format) {
|
|
77
|
+
return draftDoubleFormat(value, format);
|
|
78
|
+
} else {
|
|
79
|
+
return draftDoubleIEEE(value);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function draftInteger(value) {
|
|
84
|
+
return "" + value;
|
|
85
|
+
}
|
|
86
|
+
function draftIntegerFormat(value, format) {
|
|
87
|
+
return format.replace(/0(.)0/gi, function(_a, sep1) {
|
|
88
|
+
const vs = value.toFixed(0);
|
|
89
|
+
let res = "";
|
|
90
|
+
let i = vs.substring(0, vs.length);
|
|
91
|
+
while (i.length > 3) {
|
|
92
|
+
res = sep1 + i.substring(i.length - 3) + res;
|
|
93
|
+
i = i.substring(0, i.length - 3);
|
|
94
|
+
}
|
|
95
|
+
return i + res;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function integerDrafter(value, format) {
|
|
100
|
+
if (format) {
|
|
101
|
+
return draftIntegerFormat(value, format);
|
|
102
|
+
} else {
|
|
103
|
+
return draftInteger(value);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function longDrafter(value, format) {
|
|
108
|
+
if (format) {
|
|
109
|
+
return draftIntegerFormat(value, format);
|
|
110
|
+
} else {
|
|
111
|
+
return draftInteger(value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var CurrencyCode = /* @__PURE__ */ ((CurrencyCode2) => {
|
|
116
|
+
CurrencyCode2["USD"] = "$";
|
|
117
|
+
CurrencyCode2["EUR"] = "\u20AC";
|
|
118
|
+
CurrencyCode2["JPY"] = "\xA5";
|
|
119
|
+
CurrencyCode2["GBP"] = "\xA3";
|
|
120
|
+
CurrencyCode2["AUD"] = "A$";
|
|
121
|
+
CurrencyCode2["CAD"] = "C$";
|
|
122
|
+
CurrencyCode2["CHF"] = "CHF";
|
|
123
|
+
CurrencyCode2["CNY"] = "\u5143";
|
|
124
|
+
CurrencyCode2["HKD"] = "HK$";
|
|
125
|
+
CurrencyCode2["NZD"] = "NZ$";
|
|
126
|
+
CurrencyCode2["KRW"] = "\u20A9";
|
|
127
|
+
CurrencyCode2["SGD"] = "S$";
|
|
128
|
+
CurrencyCode2["MXN"] = "MEX$";
|
|
129
|
+
CurrencyCode2["INR"] = "\u20B9";
|
|
130
|
+
CurrencyCode2["RUB"] = "\u20BD";
|
|
131
|
+
CurrencyCode2["ZAR"] = "R";
|
|
132
|
+
CurrencyCode2["TRY"] = "\u20BA";
|
|
133
|
+
CurrencyCode2["BRL"] = "R$";
|
|
134
|
+
CurrencyCode2["TWD"] = "NT$";
|
|
135
|
+
CurrencyCode2["PLN"] = "z\u0142";
|
|
136
|
+
CurrencyCode2["THB"] = "\u0E3F";
|
|
137
|
+
CurrencyCode2["IDR"] = "Rp";
|
|
138
|
+
CurrencyCode2["HUF"] = "Ft";
|
|
139
|
+
CurrencyCode2["CZK"] = "K\u010D";
|
|
140
|
+
CurrencyCode2["ILS"] = "\u20AA";
|
|
141
|
+
CurrencyCode2["CLP"] = "CLP$";
|
|
142
|
+
CurrencyCode2["PHP"] = "\u20B1";
|
|
143
|
+
CurrencyCode2["AED"] = "\u062F.\u0625";
|
|
144
|
+
CurrencyCode2["COP"] = "COL$";
|
|
145
|
+
CurrencyCode2["SAR"] = "\uFDFC";
|
|
146
|
+
CurrencyCode2["MYR"] = "RM";
|
|
147
|
+
CurrencyCode2["RON"] = "L";
|
|
148
|
+
CurrencyCode2["BGN"] = "\u043B\u0432.";
|
|
149
|
+
return CurrencyCode2;
|
|
150
|
+
})(CurrencyCode || {});
|
|
151
|
+
|
|
152
|
+
function monetaryAmountDefaultDrafter(value) {
|
|
153
|
+
return "" + draftDoubleIEEE(value.doubleValue) + " " + value.currencyCode;
|
|
154
|
+
}
|
|
155
|
+
function codeSymbol(c) {
|
|
156
|
+
const index = Object.keys(CurrencyCode).indexOf(c);
|
|
157
|
+
if (index >= 0) {
|
|
158
|
+
return Object.values(CurrencyCode)[index];
|
|
159
|
+
} else {
|
|
160
|
+
return c;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function monetaryAmountFormatDrafter(value, format) {
|
|
164
|
+
return draftDoubleFormat(
|
|
165
|
+
value.doubleValue,
|
|
166
|
+
format.replace(/K/gi, codeSymbol(value.currencyCode)).replace(/CCC/gi, value.currencyCode)
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
function monetaryAmountDrafter(value, format) {
|
|
170
|
+
if (format) {
|
|
171
|
+
return monetaryAmountFormatDrafter(value, format);
|
|
172
|
+
} else {
|
|
173
|
+
return monetaryAmountDefaultDrafter(value);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function stringDrafter(value) {
|
|
178
|
+
return value;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function getDrafter(typeName) {
|
|
182
|
+
switch (typeName) {
|
|
183
|
+
case "Boolean":
|
|
184
|
+
return booleanDrafter;
|
|
185
|
+
case "DateTime":
|
|
186
|
+
return dateTimeDrafter;
|
|
187
|
+
case "Double":
|
|
188
|
+
return doubleDrafter;
|
|
189
|
+
case "Integer":
|
|
190
|
+
return integerDrafter;
|
|
191
|
+
case "Long":
|
|
192
|
+
return longDrafter;
|
|
193
|
+
case "org.accordproject.money@0.3.0.MonetaryAmount":
|
|
194
|
+
return monetaryAmountDrafter;
|
|
195
|
+
case "String":
|
|
196
|
+
return stringDrafter;
|
|
197
|
+
default:
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const TEMPLATEMARK_RE = /^(org\.accordproject\.templatemark)@(.+)\.(\w+)Definition$/;
|
|
203
|
+
const FORMULA_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormulaDefinition$/;
|
|
204
|
+
const VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.VariableDefinition$/;
|
|
205
|
+
const CONDITIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ConditionalDefinition$/;
|
|
206
|
+
const ENUM_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.EnumVariableDefinition$/;
|
|
207
|
+
const FORMATTED_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormattedVariableDefinition$/;
|
|
208
|
+
const WITH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.WithDefinition$/;
|
|
209
|
+
const LISTBLOCK_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ListBlockDefinition$/;
|
|
210
|
+
const JOIN_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.JoinDefinition$/;
|
|
211
|
+
const OPTIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.OptionalDefinition$/;
|
|
212
|
+
const CLAUSE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ClauseDefinition$/;
|
|
213
|
+
const CONTRACT_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ContractDefinition$/;
|
|
214
|
+
const NAVIGATION_NODES = [
|
|
215
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ListBlockDefinition`,
|
|
216
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.WithDefinition`,
|
|
217
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.JoinDefinition`,
|
|
218
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.OptionalDefinition`,
|
|
219
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`
|
|
220
|
+
];
|
|
221
|
+
|
|
222
|
+
function ensureDirSync(path) {
|
|
223
|
+
!fs.existsSync(path) && fs.mkdirSync(path, { recursive: true });
|
|
224
|
+
}
|
|
225
|
+
function removeSync(path) {
|
|
226
|
+
fs.rmSync(path, { recursive: true, force: true });
|
|
227
|
+
}
|
|
228
|
+
function writeFunctionToString(templateClass, functionName, returnType, code) {
|
|
229
|
+
let result = "";
|
|
230
|
+
result += "/// ---cut---\n";
|
|
231
|
+
result += `export function ${functionName}(data:TemplateModel.I${templateClass.getName()}, library:any, options:GenerationOptions) : ${returnType} {
|
|
232
|
+
`;
|
|
233
|
+
result += " const now = dayjs(options?.now);\n";
|
|
234
|
+
result += " const locale = options?.locale;\n";
|
|
235
|
+
templateClass.getProperties().forEach((p) => {
|
|
236
|
+
result += ` const ${p.getName()} = data.${p.getName()};
|
|
237
|
+
`;
|
|
238
|
+
});
|
|
239
|
+
result += " " + code.trim() + "\n";
|
|
240
|
+
result += "}\n";
|
|
241
|
+
result += "\n";
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
function nameUserCode(templateMarkDom) {
|
|
245
|
+
return traverse(templateMarkDom).map(function(x) {
|
|
246
|
+
if (x && (x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition` && x.condition || `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition` && x.condition)) {
|
|
247
|
+
x.functionName = `condition_${this.path.join("_")}`;
|
|
248
|
+
}
|
|
249
|
+
this.update(x);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function getTemplateClassDeclaration(modelManager, templateConceptFqn) {
|
|
253
|
+
const introspector = new concertoCore.Introspector(modelManager);
|
|
254
|
+
try {
|
|
255
|
+
return markdownTemplate.templatemarkutil.findTemplateConcept(introspector, "clause", templateConceptFqn);
|
|
256
|
+
} catch (err) {
|
|
257
|
+
console.log(err);
|
|
258
|
+
throw err;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
class TypeScriptCompilationContext {
|
|
263
|
+
modelManager;
|
|
264
|
+
templateClass;
|
|
265
|
+
constructor(modelManager, templateConceptFqn) {
|
|
266
|
+
this.modelManager = modelManager;
|
|
267
|
+
this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
|
|
268
|
+
}
|
|
269
|
+
getTypeScriptFiles() {
|
|
270
|
+
const result = {};
|
|
271
|
+
const visitor = new concertoCodegen.CodeGen.TypescriptVisitor();
|
|
272
|
+
const writer = new concertoUtil.InMemoryWriter();
|
|
273
|
+
const params = {
|
|
274
|
+
fileWriter: writer
|
|
275
|
+
};
|
|
276
|
+
this.modelManager.accept(visitor, params);
|
|
277
|
+
writer.getFilesInMemory().forEach((value, key) => {
|
|
278
|
+
result[key] = value;
|
|
279
|
+
});
|
|
280
|
+
return result;
|
|
281
|
+
}
|
|
282
|
+
getCompilationContext() {
|
|
283
|
+
const files = this.getTypeScriptFiles();
|
|
284
|
+
let result = "";
|
|
285
|
+
Object.keys(files).forEach((key) => {
|
|
286
|
+
const content = files[key];
|
|
287
|
+
result += `
|
|
288
|
+
// @filename: ${key}
|
|
289
|
+
${content}
|
|
290
|
+
`;
|
|
291
|
+
});
|
|
292
|
+
result += `
|
|
293
|
+
// @filename: code.ts
|
|
294
|
+
import * as TemplateModel from './${this.templateClass.getNamespace()}';
|
|
295
|
+
import dayjs from 'dayjs';
|
|
296
|
+
import jp from 'jsonpath';
|
|
297
|
+
|
|
298
|
+
type GenerationOptions = {
|
|
299
|
+
now?:string,
|
|
300
|
+
locale?:string
|
|
301
|
+
}
|
|
302
|
+
`;
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
const DAYJS_BASE64 = "Ly8vIDxyZWZlcmVuY2UgcGF0aD0iLi9sb2NhbGUvaW5kZXguZC50cyIgLz4KCmV4cG9ydCA9IGRheWpzOwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUpOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIHN0cmljdD86IGJvb2xlYW4pOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIGxvY2FsZT86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IGRheWpzLkRheWpzCgpkZWNsYXJlIG5hbWVzcGFjZSBkYXlqcyB7CiAgaW50ZXJmYWNlIENvbmZpZ1R5cGVNYXAgewogICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IERheWpzIHwgbnVsbCB8IHVuZGVmaW5lZAogIH0KCiAgZXhwb3J0IHR5cGUgQ29uZmlnVHlwZSA9IENvbmZpZ1R5cGVNYXBba2V5b2YgQ29uZmlnVHlwZU1hcF0KCiAgZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPYmplY3QgeyBsb2NhbGU/OiBzdHJpbmcsIGZvcm1hdD86IHN0cmluZywgdXRjPzogYm9vbGVhbiB9CgogIGV4cG9ydCB0eXBlIE9wdGlvblR5cGUgPSBGb3JtYXRPYmplY3QgfCBzdHJpbmcgfCBzdHJpbmdbXQoKICBleHBvcnQgdHlwZSBVbml0VHlwZVNob3J0ID0gJ2QnIHwgJ0QnIHwgJ00nIHwgJ3knIHwgJ2gnIHwgJ20nIHwgJ3MnIHwgJ21zJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmcgPSAnbWlsbGlzZWNvbmQnIHwgJ3NlY29uZCcgfCAnbWludXRlJyB8ICdob3VyJyB8ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyB8ICdkYXRlJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmdQbHVyYWwgPSAnbWlsbGlzZWNvbmRzJyB8ICdzZWNvbmRzJyB8ICdtaW51dGVzJyB8ICdob3VycycgfCAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycgfCAnZGF0ZXMnCiAgCiAgZXhwb3J0IHR5cGUgVW5pdFR5cGUgPSBVbml0VHlwZUxvbmcgfCBVbml0VHlwZUxvbmdQbHVyYWwgfCBVbml0VHlwZVNob3J0OwoKICBleHBvcnQgdHlwZSBPcFVuaXRUeXBlID0gVW5pdFR5cGUgfCAid2VlayIgfCAid2Vla3MiIHwgJ3cnOwogIGV4cG9ydCB0eXBlIFFVbml0VHlwZSA9IFVuaXRUeXBlIHwgInF1YXJ0ZXIiIHwgInF1YXJ0ZXJzIiB8ICdRJzsKICBleHBvcnQgdHlwZSBNYW5pcHVsYXRlVHlwZSA9IEV4Y2x1ZGU8T3BVbml0VHlwZSwgJ2RhdGUnIHwgJ2RhdGVzJz47CiAgY2xhc3MgRGF5anMgewogICAgY29uc3RydWN0b3IgKGNvbmZpZz86IENvbmZpZ1R5cGUpCiAgICAvKioKICAgICAqIEFsbCBEYXkuanMgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBTdGlsbCwgYGRheWpzI2Nsb25lYCBjYW4gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGlmIHlvdSBuZWVkIG9uZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5jbG9uZSgpLy8gPT4gRGF5anMKICAgICAqIGRheWpzKGRheWpzKCcyMDE5LTAxLTI1JykpIC8vIHBhc3NpbmcgYSBEYXlqcyBvYmplY3QgdG8gYSBjb25zdHJ1Y3RvciB3aWxsIGFsc28gY2xvbmUgaXQKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvZGF5anMtY2xvbmUKICAgICAqLwogICAgY2xvbmUoKTogRGF5anMKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBjb250YWlucyBhIHZhbGlkIGRhdGUgb3Igbm90LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzVmFsaWQoKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvaXMtdmFsaWQKICAgICAqLwogICAgaXNWYWxpZCgpOiBib29sZWFuCiAgICAvKioKICAgICAqIEdldCB0aGUgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS55ZWFyKCkvLyA9PiAyMDIwCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHllYXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkueWVhcigyMDAwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1vbnRoLgogICAgICoKICAgICAqIE1vbnRocyBhcmUgemVybyBpbmRleGVkLCBzbyBKYW51YXJ5IGlzIG1vbnRoIDAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubW9udGgoKS8vID0+IDAtMTEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9tb250aAogICAgICovCiAgICBtb250aCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtb250aC4KICAgICAqCiAgICAgKiBNb250aHMgYXJlIHplcm8gaW5kZXhlZCwgc28gSmFudWFyeSBpcyBtb250aCAwLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMTEuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5tb250aCgwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbW9udGgKICAgICAqLwogICAgbW9udGgodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF0ZSBvZiB0aGUgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF0ZSgpLy8gPT4gMS0zMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RhdGUKICAgICAqLwogICAgZGF0ZSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXRlIG9mIHRoZSBtb250aC4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAxIHRvIDMxLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1vbnRocy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXRlKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXRlCiAgICAgKi8KICAgIGRhdGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIFJldHVybnMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmRheSgpLy8gMC02CiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZGF5CiAgICAgKi8KICAgIGRheSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCAoU3VuZGF5KSB0byA2IChTYXR1cmRheSkuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gbmV4dCB3ZWVrcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXkoMCkvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RheQogICAgICovCiAgICBkYXkodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgaG91ci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5ob3VyKCkvLyA9PiAwLTIzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvaG91cgogICAgICovCiAgICBob3VyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIGhvdXIuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byAyMy4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBkYXkuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaG91cigxMikvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2hvdXIKICAgICAqLwogICAgaG91cih2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogR2V0IHRoZSBtaW51dGVzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbnV0ZSgpLy8gPT4gMC01OQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbnV0ZQogICAgICovCiAgICBtaW51dGUoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFNldCB0aGUgbWludXRlcy4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAwIHRvIDU5LiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IGhvdXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubWludXRlKDU5KS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbWludXRlCiAgICAgKi8KICAgIG1pbnV0ZSh2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogR2V0IHRoZSBzZWNvbmRzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNlY29uZCgpLy8gPT4gMC01OQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L3NlY29uZAogICAgICovCiAgICBzZWNvbmQoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFNldCB0aGUgc2Vjb25kcy4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAwIHRvIDU5LiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1pbnV0ZXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc2Vjb25kKDEpLy8gRGF5anMKICAgICAqIGBgYAogICAgICovCiAgICBzZWNvbmQodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbGxpc2Vjb25kKCkvLyA9PiAwLTk5OQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbGxpc2Vjb25kCiAgICAgKi8KICAgIG1pbGxpc2Vjb25kKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1pbGxpc2Vjb25kcy4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAwIHRvIDk5OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBzZWNvbmRzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbGxpc2Vjb25kKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taWxsaXNlY29uZAogICAgICovCiAgICBtaWxsaXNlY29uZCh2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogR2VuZXJpYyBzZXR0ZXIsIGFjY2VwdGluZyB1bml0IGFzIGZpcnN0IGFyZ3VtZW50LCBhbmQgdmFsdWUgYXMgc2Vjb25kLCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIGFwcGxpZWQgY2hhbmdlcy4KICAgICAqCiAgICAgKiBJbiBnZW5lcmFsOgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNldCh1bml0LCB2YWx1ZSkgPT09IGRheWpzKClbdW5pdF0odmFsdWUpCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNldCgnZGF0ZScsIDEpCiAgICAgKiBkYXlqcygpLnNldCgnbW9udGgnLCAzKSAvLyBBcHJpbAogICAgICogZGF5anMoKS5zZXQoJ3NlY29uZCcsIDMwKQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L3NldAogICAgICovCiAgICBzZXQodW5pdDogVW5pdFR5cGUsIHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBTdHJpbmcgZ2V0dGVyLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uIGdldHRpbmcgZnJvbSBEYXkuanMgb2JqZWN0LgogICAgICoKICAgICAqIEluIGdlbmVyYWw6CiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZ2V0KHVuaXQpID09PSBkYXlqcygpW3VuaXRdKCkKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZ2V0KCd5ZWFyJykKICAgICAqIGRheWpzKCkuZ2V0KCdtb250aCcpIC8vIHN0YXJ0IDAKICAgICAqIGRheWpzKCkuZ2V0KCdkYXRlJykKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9nZXQKICAgICAqLwogICAgZ2V0KHVuaXQ6IFVuaXRUeXBlKTogbnVtYmVyCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjbG9uZWQgRGF5LmpzIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGFkZGVkLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmFkZCg3LCAnZGF5JykvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9tYW5pcHVsYXRlL2FkZAogICAgICovCiAgICBhZGQodmFsdWU6IG51bWJlciwgdW5pdD86IE1hbmlwdWxhdGVUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IHdpdGggYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgc3VidHJhY3RlZC4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zdWJ0cmFjdCg3LCAneWVhcicpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9zdWJ0cmFjdAogICAgICovCiAgICBzdWJ0cmFjdCh2YWx1ZTogbnVtYmVyLCB1bml0PzogTWFuaXB1bGF0ZVR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3QgYW5kIHNldCBpdCB0byB0aGUgc3RhcnQgb2YgYSB1bml0IG9mIHRpbWUuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc3RhcnRPZigneWVhcicpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9zdGFydC1vZgogICAgICovCiAgICBzdGFydE9mKHVuaXQ6IE9wVW5pdFR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3QgYW5kIHNldCBpdCB0byB0aGUgZW5kIG9mIGEgdW5pdCBvZiB0aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmVuZE9mKCdtb250aCcpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9lbmQtb2YKICAgICAqLwogICAgZW5kT2YodW5pdDogT3BVbml0VHlwZSk6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZm9ybWF0dGVkIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBzdHJpbmcgb2YgdG9rZW5zIHBhc3NlZCBpbi4KICAgICAqCiAgICAgKiBUbyBlc2NhcGUgY2hhcmFjdGVycywgd3JhcCB0aGVtIGluIHNxdWFyZSBicmFja2V0cyAoZS5nLiBbTU1dKS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5mb3JtYXQoKS8vID0+IGN1cnJlbnQgZGF0ZSBpbiBJU084NjAxLCB3aXRob3V0IGZyYWN0aW9uIHNlY29uZHMgZS5nLiAnMjAyMC0wNC0wMlQwODowMjoxNy0wNTowMCcKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZm9ybWF0KCdbWVlZWWVzY2FwZV0gWVlZWS1NTS1ERFRISDptbTpzc1pbWl0nKS8vICdZWVlZZXNjYXBlIDIwMTktMDEtMjVUMDA6MDA6MDAtMDI6MDBaJwogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS5mb3JtYXQoJ0REL01NL1lZWVknKSAvLyAnMjUvMDEvMjAxOScKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9mb3JtYXQKICAgICAqLwogICAgZm9ybWF0KHRlbXBsYXRlPzogc3RyaW5nKTogc3RyaW5nCiAgICAvKioKICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGUtdGltZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCiAgICAgKgogICAgICogVG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcywgdXNlIGBkYXlqcyNkaWZmYAogICAgICogYGBgCiAgICAgKiBjb25zdCBkYXRlMSA9IGRheWpzKCcyMDE5LTAxLTI1JykKICAgICAqIGNvbnN0IGRhdGUyID0gZGF5anMoJzIwMTgtMDYtMDUnKQogICAgICogZGF0ZTEuZGlmZihkYXRlMikgLy8gMjAyMTQwMDAwMDAgZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGRhdGUxLmRpZmYoKSAvLyBtaWxsaXNlY29uZHMgdG8gY3VycmVudCB0aW1lCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUbyBnZXQgdGhlIGRpZmZlcmVuY2UgaW4gYW5vdGhlciB1bml0IG9mIG1lYXN1cmVtZW50LCBwYXNzIHRoYXQgbWVhc3VyZW1lbnQgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqIGBgYAogICAgICogY29uc3QgZGF0ZTEgPSBkYXlqcygnMjAxOS0wMS0yNScpCiAgICAgKiBkYXRlMS5kaWZmKCcyMDE4LTA2LTA1JywgJ21vbnRoJykgLy8gNwogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2RpZmZlcmVuY2UKICAgICAqLwogICAgZGlmZihkYXRlPzogQ29uZmlnVHlwZSwgdW5pdD86IFFVbml0VHlwZSB8IE9wVW5pdFR5cGUsIGZsb2F0PzogYm9vbGVhbik6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiAqKm1pbGxpc2Vjb25kcyoqIHNpbmNlIHRoZSBVbml4IEVwb2NoIG9mIHRoZSBEYXkuanMgb2JqZWN0LgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnZhbHVlT2YoKSAvLyAxNTQ4MzgxNjAwMDAwCiAgICAgKiArZGF5anMoMTU0ODM4MTYwMDAwMCkgLy8gMTU0ODM4MTYwMDAwMAogICAgICogYGBgCiAgICAgKiBUbyBnZXQgYSBVbml4IHRpbWVzdGFtcCAodGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCkgZnJvbSBhIERheS5qcyBvYmplY3QsIHlvdSBzaG91bGQgdXNlIFVuaXggVGltZXN0YW1wIGBkYXlqcyN1bml4KClgLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvdW5peC10aW1lc3RhbXAtbWlsbGlzZWNvbmRzCiAgICAgKi8KICAgIHZhbHVlT2YoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFRoaXMgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgKHRoZSBudW1iZXIgb2YgKipzZWNvbmRzKiogc2luY2UgdGhlIFVuaXggRXBvY2gpIG9mIHRoZSBEYXkuanMgb2JqZWN0LgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnVuaXgoKSAvLyAxNTQ4MzgxNjAwCiAgICAgKiBgYGAKICAgICAqIFRoaXMgdmFsdWUgaXMgZmxvb3JlZCB0byB0aGUgbmVhcmVzdCBzZWNvbmQsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGEgbWlsbGlzZWNvbmRzIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L3VuaXgtdGltZXN0YW1wCiAgICAgKi8KICAgIHVuaXgoKTogbnVtYmVyCiAgICAvKioKICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhlIGN1cnJlbnQgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZGF5c0luTW9udGgoKSAvLyAzMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2RheXMtaW4tbW9udGgKICAgICAqLwogICAgZGF5c0luTW9udGgoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFRvIGdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSBgRGF0ZWAgb2JqZWN0IHBhcnNlZCBmcm9tIHRoZSBEYXkuanMgb2JqZWN0IHVzZSBgZGF5anMjdG9EYXRlYC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS50b0RhdGUoKS8vID0+IERhdGUKICAgICAqIGBgYAogICAgICovCiAgICB0b0RhdGUoKTogRGF0ZQogICAgLyoqCiAgICAgKiBUbyBzZXJpYWxpemUgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvSlNPTigpIC8vICcyMDE5LTAxLTI1VDAyOjAwOjAwLjAwMFonCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvYXMtanNvbgogICAgICovCiAgICB0b0pTT04oKTogc3RyaW5nCiAgICAvKioKICAgICAqIFRvIGZvcm1hdCBhcyBhbiBJU08gODYwMSBzdHJpbmcuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9JU09TdHJpbmcoKSAvLyAnMjAxOS0wMS0yNVQwMjowMDowMC4wMDBaJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLWlzby1zdHJpbmcKICAgICAqLwogICAgdG9JU09TdHJpbmcoKTogc3RyaW5nCiAgICAvKioKICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGUuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9TdHJpbmcoKSAvLyAnRnJpLCAyNSBKYW4gMjAxOSAwMjowMDowMCBHTVQnCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvYXMtc3RyaW5nCiAgICAgKi8KICAgIHRvU3RyaW5nKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgaW4gbWludXRlcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS51dGNPZmZzZXQoKQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9tYW5pcHVsYXRlL3V0Yy1vZmZzZXQKICAgICAqLwogICAgdXRjT2Zmc2V0KCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBEYXkuanMgb2JqZWN0IGlzIGJlZm9yZSB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQmVmb3JlKGRheWpzKCcyMDExLTAxLTAxJykpIC8vIGRlZmF1bHQgbWlsbGlzZWNvbmRzCiAgICAgKiBgYGAKICAgICAqIElmIHlvdSB3YW50IHRvIGxpbWl0IHRoZSBncmFudWxhcml0eSB0byBhIHVuaXQgb3RoZXIgdGhhbiBtaWxsaXNlY29uZHMsIHBhc3MgaXQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaXNCZWZvcmUoJzIwMTEtMDEtMDEnLCAneWVhcicpLy8gPT4gYm9vbGVhbgogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9xdWVyeS9pcy1iZWZvcmUKICAgICAqLwogICAgaXNCZWZvcmUoZGF0ZTogQ29uZmlnVHlwZSwgdW5pdD86IE9wVW5pdFR5cGUpOiBib29sZWFuCiAgICAvKioKICAgICAqIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIERheS5qcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIG90aGVyIHN1cHBsaWVkIGRhdGUtdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc1NhbWUoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc1NhbWUoJzIwMTEtMDEtMDEnLCAneWVhcicpLy8gPT4gYm9vbGVhbgogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9xdWVyeS9pcy1zYW1lCiAgICAgKi8KICAgIGlzU2FtZShkYXRlOiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBhZnRlciB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQWZ0ZXIoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0FmdGVyKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYWZ0ZXIKICAgICAqLwogICAgaXNBZnRlcihkYXRlOiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KCiAgICBsb2NhbGUoKTogc3RyaW5nCgogICAgbG9jYWxlKHByZXNldDogc3RyaW5nIHwgSUxvY2FsZSwgb2JqZWN0PzogUGFydGlhbDxJTG9jYWxlPik6IERheWpzCiAgfQoKICBleHBvcnQgdHlwZSBQbHVnaW5GdW5jPFQgPSB1bmtub3duPiA9IChvcHRpb246IFQsIGM6IHR5cGVvZiBEYXlqcywgZDogdHlwZW9mIGRheWpzKSA9PiB2b2lkCgogIGV4cG9ydCBmdW5jdGlvbiBleHRlbmQ8VCA9IHVua25vd24+KHBsdWdpbjogUGx1Z2luRnVuYzxUPiwgb3B0aW9uPzogVCk6IERheWpzCgogIGV4cG9ydCBmdW5jdGlvbiBsb2NhbGUocHJlc2V0Pzogc3RyaW5nIHwgSUxvY2FsZSwgb2JqZWN0PzogUGFydGlhbDxJTG9jYWxlPiwgaXNMb2NhbD86IGJvb2xlYW4pOiBzdHJpbmcKCiAgZXhwb3J0IGZ1bmN0aW9uIGlzRGF5anMoZDogYW55KTogZCBpcyBEYXlqcwoKICBleHBvcnQgZnVuY3Rpb24gdW5peCh0OiBudW1iZXIpOiBEYXlqcwoKICBjb25zdCBMcyA6IHsgW2tleTogc3RyaW5nXSA6ICBJTG9jYWxlIH0KfQo=";
|
|
308
|
+
const JSONPATH_BASE64 = "Ly8gVHlwZSBkZWZpbml0aW9ucyBmb3IganNvbnBhdGggMC4yLjExDQovLyBQcm9qZWN0OiBodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9qc29ucGF0aA0KLy8gRGVmaW5pdGlvbnMgYnk6IEhpcm9raSBIb3JpdWNoaSA8aHR0cHM6Ly9naXRodWIuY29tL2hvcml1Y2hpPiwgSWthIDxodHRwczovL2dpdGh1Yi5jb20vaWthdHlhbmc+DQovLyBEZWZpbml0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL0RlZmluaXRlbHlUeXBlZC9EZWZpbml0ZWx5VHlwZWQNCg0KdHlwZSBQYXRoQ29tcG9uZW50ID0gc3RyaW5nIHwgbnVtYmVyOw0KDQovKioNCiAqIEZpbmQgZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0DQogKiBzYXRpc2Z5IHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uLG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUgd2VyZSBtYXRjaGVkLg0KICogUmV0dXJucyBvbmx5IGZpcnN0IGBjb3VudGAgZWxlbWVudHMgaWYgc3BlY2lmaWVkLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBxdWVyeShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBhbnlbXTsNCg0KLyoqDQogKiBGaW5kIHBhdGhzIHRvIGVsZW1lbnRzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuIFJldHVybnMgYW4gYXJyYXkgb2YNCiAqIGVsZW1lbnQgcGF0aHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uLiBFYWNoIHBhdGggaXMgaXRzZWxmIGFuDQogKiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LiBSZXR1cm5zDQogKiBvbmx5IGZpcnN0IGBjb3VudGAgcGF0aHMgaWYgc3BlY2lmaWVkLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXRocyhvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBQYXRoQ29tcG9uZW50W11bXTsNCg0KLyoqDQogKiBGaW5kIGVsZW1lbnRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHBhdGhzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuDQogKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vZGUgb2JqZWN0cyB3aGVyZSBlYWNoIG5vZGUgaGFzIGEgYHBhdGhgIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YNCiAqIGtleXMgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiB3aXRoaW4gYG9iamAsIGFuZCBhIGB2YWx1ZWAgcG9pbnRpbmcgdG8gdGhlIG1hdGNoZWQNCiAqIGVsZW1lbnQuIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIG5vZGVzIGlmIHNwZWNpZmllZC4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gbm9kZXMob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcsIGNvdW50PzogbnVtYmVyKTogeyBwYXRoOiBQYXRoQ29tcG9uZW50W107IHZhbHVlOiBhbnk7IH1bXTsNCg0KLyoqDQogKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyBgcGF0aEV4cHJlc3Npb25gLiBJZiBgbmV3VmFsdWVgIGlzDQogKiBwcm92aWRlZCwgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyB2YWx1ZS4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gdmFsdWUob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnk7DQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB2YWx1ZTxUPihvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgbmV3VmFsdWU6IFQpOiBUOw0KDQovKioNCiAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudC4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gcGFyZW50KG9iajogYW55LCBwYXRoRXhwcmVzc2lvbjogc3RyaW5nKTogYW55Ow0KDQovKioNCiAqIFJ1bnMgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGBmbmAgb24gZWFjaCBtYXRjaGluZyBlbGVtZW50LCBhbmQgcmVwbGFjZXMgZWFjaA0KICogbWF0Y2hpbmcgZWxlbWVudCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBhY2NlcHRzIHRoZQ0KICogdmFsdWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgYXMgaXRzIG9ubHkgcGFyYW1ldGVyLiBSZXR1cm5zIG1hdGNoaW5nIG5vZGVzIHdpdGgNCiAqIHRoZWlyIHVwZGF0ZWQgdmFsdWVzLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBhcHBseShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgZm46ICh4OiBhbnkpID0+IGFueSk6IHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55OyB9W107DQoNCi8qKg0KICogUGFyc2UgdGhlIHByb3ZpZGVkIEpTT05QYXRoIGV4cHJlc3Npb24gaW50byBwYXRoIGNvbXBvbmVudHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQNCiAqIG9wZXJhdGlvbnMuDQogKi8NCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHBhcnNlKHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnlbXTsNCg0KLyoqDQogKiBSZXR1cm5zIGEgcGF0aCBleHByZXNzaW9uIGluIHN0cmluZyBmb3JtLCBnaXZlbiBhIHBhdGguIFRoZSBzdXBwbGllZCBwYXRoIG1heSBlaXRoZXINCiAqIGJlIGEgZmxhdCBhcnJheSBvZiBrZXlzLCBhcyByZXR1cm5lZCBieSBganAubm9kZXNgIGZvciBleGFtcGxlLCBvciBtYXkgYWx0ZXJuYXRpdmVseSBiZSBhDQogKiBmdWxseSBwYXJzZWQgcGF0aCBleHByZXNzaW9uIGluIHRoZSBmb3JtIG9mIGFuIGFycmF5IG9mIHBhdGggY29tcG9uZW50cyBhcyByZXR1cm5lZA0KICogYnkgYGpwLnBhcnNlYC4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gc3RyaW5naWZ5KHBhdGg6IFBhdGhDb21wb25lbnRbXSk6IHN0cmluZzsNCg0KZXhwb3J0IGFzIG5hbWVzcGFjZSBqc29ucGF0aDsNCg==";
|
|
309
|
+
|
|
310
|
+
class TypeScriptToJavaScriptCompiler {
|
|
311
|
+
context;
|
|
312
|
+
fsMap;
|
|
313
|
+
ts;
|
|
314
|
+
constructor(modelManager, templateConceptFqn) {
|
|
315
|
+
this.context = new TypeScriptCompilationContext(modelManager, templateConceptFqn).getCompilationContext();
|
|
316
|
+
}
|
|
317
|
+
async initialize() {
|
|
318
|
+
if (typeof window === "undefined") {
|
|
319
|
+
this.ts = await import('typescript');
|
|
320
|
+
this.fsMap = vfs.createDefaultMapFromNodeModules({
|
|
321
|
+
target: this.ts.ScriptTarget.ES2020
|
|
322
|
+
});
|
|
323
|
+
} else {
|
|
324
|
+
this.ts = (await import('https://cdn.jsdelivr.net/npm/typescript@4.8.4/+esm')).default;
|
|
325
|
+
if (!this.ts) {
|
|
326
|
+
throw new Error("Failed to dynamically load typescript");
|
|
327
|
+
}
|
|
328
|
+
this.fsMap = await vfs.createDefaultMapFromCDN({ target: this.ts.ScriptTarget.ES2020 }, this.ts.version, false, this.ts);
|
|
329
|
+
}
|
|
330
|
+
this.fsMap.set("/node_modules/@types/dayjs/index.d.ts", Buffer.from(DAYJS_BASE64, "base64").toString());
|
|
331
|
+
this.fsMap.set("/node_modules/@types/jsonpath/index.d.ts", Buffer.from(JSONPATH_BASE64, "base64").toString());
|
|
332
|
+
}
|
|
333
|
+
compile(typescript) {
|
|
334
|
+
if (!this.fsMap) {
|
|
335
|
+
throw new Error("initialize must be awaited before compile is called.");
|
|
336
|
+
}
|
|
337
|
+
const twoSlashCode = `
|
|
338
|
+
${this.context}
|
|
339
|
+
${typescript}
|
|
340
|
+
`;
|
|
341
|
+
const options = {
|
|
342
|
+
fsMap: this.fsMap,
|
|
343
|
+
tsModule: this.ts,
|
|
344
|
+
lzstringModule: lzstring__namespace,
|
|
345
|
+
defaultOptions: {
|
|
346
|
+
showEmit: true,
|
|
347
|
+
noErrorValidation: true,
|
|
348
|
+
showEmittedFile: "code.js"
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
const result = twoslash.twoslasher(twoSlashCode, "ts", options);
|
|
352
|
+
return result;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
var CodeType = /* @__PURE__ */ ((CodeType2) => {
|
|
357
|
+
CodeType2["TYPESCRIPT"] = "TYPESCRIPT";
|
|
358
|
+
CodeType2["ES_2020"] = "ES_2020";
|
|
359
|
+
return CodeType2;
|
|
360
|
+
})(CodeType || {});
|
|
361
|
+
|
|
362
|
+
const CODE_NODES = [
|
|
363
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.FormulaDefinition`,
|
|
364
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition`,
|
|
365
|
+
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`
|
|
366
|
+
];
|
|
367
|
+
function checkCode$1(code) {
|
|
368
|
+
if (code.type !== CodeType.TYPESCRIPT) {
|
|
369
|
+
throw new Error(`Cannot compile ${code.contents} as it is not Typescript.`);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
class TemplateMarkToJavaScriptCompiler {
|
|
373
|
+
modelManager;
|
|
374
|
+
compiler;
|
|
375
|
+
templateClass;
|
|
376
|
+
constructor(modelManager, templateConceptFqn) {
|
|
377
|
+
this.modelManager = modelManager;
|
|
378
|
+
this.compiler = new TypeScriptToJavaScriptCompiler(modelManager, templateConceptFqn);
|
|
379
|
+
this.templateClass = getTemplateClassDeclaration(modelManager, templateConceptFqn);
|
|
380
|
+
}
|
|
381
|
+
async initialize() {
|
|
382
|
+
await this.compiler.initialize();
|
|
383
|
+
}
|
|
384
|
+
compile(templateJson) {
|
|
385
|
+
const namedTemplateMark = nameUserCode(templateJson);
|
|
386
|
+
const that = this;
|
|
387
|
+
const errors = Array();
|
|
388
|
+
const compiled = traverse(namedTemplateMark).map(function(x) {
|
|
389
|
+
if (x && CODE_NODES.includes(x.$class)) {
|
|
390
|
+
if (x.code) {
|
|
391
|
+
checkCode$1(x.code);
|
|
392
|
+
const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.name, "any", x.code.contents));
|
|
393
|
+
if (result.errors.length === 0) {
|
|
394
|
+
x.code.contents = result.code;
|
|
395
|
+
x.code.type = CodeType.ES_2020;
|
|
396
|
+
this.update(x);
|
|
397
|
+
} else {
|
|
398
|
+
errors.push({
|
|
399
|
+
nodeId: x.name,
|
|
400
|
+
code: x.code.contents,
|
|
401
|
+
errors: result.errors
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
} else if (x.condition) {
|
|
405
|
+
checkCode$1(x.condition);
|
|
406
|
+
const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.functionName, "boolean", x.condition.contents));
|
|
407
|
+
if (result.errors.length === 0) {
|
|
408
|
+
x.condition.contents = result.code;
|
|
409
|
+
x.condition.type = CodeType.ES_2020;
|
|
410
|
+
this.update(x);
|
|
411
|
+
} else {
|
|
412
|
+
errors.push({
|
|
413
|
+
nodeId: x.functionName,
|
|
414
|
+
code: x.condition.contents,
|
|
415
|
+
errors: result.errors
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
if (errors.length === 0) {
|
|
422
|
+
return compiled;
|
|
423
|
+
} else {
|
|
424
|
+
throw errors;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function joinList(data, joinDef, options) {
|
|
430
|
+
if (joinDef.separator) {
|
|
431
|
+
return data.join(joinDef.separator);
|
|
432
|
+
} else {
|
|
433
|
+
const formatter = new Intl.ListFormat(
|
|
434
|
+
joinDef.locale ? joinDef.locale : options?.locale,
|
|
435
|
+
{
|
|
436
|
+
style: joinDef.style,
|
|
437
|
+
type: joinDef.type
|
|
438
|
+
}
|
|
439
|
+
);
|
|
440
|
+
return formatter.format(data);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function checkCode(code) {
|
|
445
|
+
if (code.type !== CodeType.ES_2020) {
|
|
446
|
+
throw new Error(`Cannot run ${code.contents} as it is not ES_2020 JavaScript.`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function evaluateJavaScript(clauseLibrary, data, fn, options) {
|
|
450
|
+
if (!data || !fn) {
|
|
451
|
+
throw new Error(`Cannot evaluate JS ${fn} against ${data}`);
|
|
452
|
+
}
|
|
453
|
+
const functionArgNames = new Array();
|
|
454
|
+
functionArgNames.push("data");
|
|
455
|
+
functionArgNames.push("library");
|
|
456
|
+
functionArgNames.push("options");
|
|
457
|
+
functionArgNames.push("dayjs");
|
|
458
|
+
functionArgNames.push("jp");
|
|
459
|
+
const functionArgValues = new Array();
|
|
460
|
+
functionArgValues.push(data);
|
|
461
|
+
functionArgValues.push(clauseLibrary);
|
|
462
|
+
functionArgValues.push(options);
|
|
463
|
+
functionArgValues.push(dayjs);
|
|
464
|
+
functionArgValues.push(jp);
|
|
465
|
+
const expression = fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));
|
|
466
|
+
if (expression.trim().length === 0) {
|
|
467
|
+
throw new Error("Empty expression");
|
|
468
|
+
}
|
|
469
|
+
try {
|
|
470
|
+
const fun = new Function(...functionArgNames, expression);
|
|
471
|
+
const result = fun(...functionArgValues);
|
|
472
|
+
return result;
|
|
473
|
+
} catch (err) {
|
|
474
|
+
throw new Error(`Caught error ${err} evaluating ${expression} with arguments ${functionArgValues}`);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
function getJsonPath(rootData, currentNode, paths) {
|
|
478
|
+
if (!currentNode) {
|
|
479
|
+
throw new Error("Node must be supplied");
|
|
480
|
+
}
|
|
481
|
+
if (!currentNode.name) {
|
|
482
|
+
throw new Error(`Node must have a name: ${JSON.stringify(currentNode)}`);
|
|
483
|
+
}
|
|
484
|
+
if (currentNode.name.indexOf(".") >= 0) {
|
|
485
|
+
throw new Error(`Invalid name property ${currentNode.name}`);
|
|
486
|
+
}
|
|
487
|
+
if (!paths || !paths.length || paths.length < 1) {
|
|
488
|
+
throw new Error("Paths must be supplied");
|
|
489
|
+
}
|
|
490
|
+
const withPath = [];
|
|
491
|
+
for (let n = 1; n < paths.length; n++) {
|
|
492
|
+
const sub = paths.slice(0, n);
|
|
493
|
+
const obj = traverse.get(rootData, sub);
|
|
494
|
+
if (obj && obj.$class) {
|
|
495
|
+
if (NAVIGATION_NODES.indexOf(obj.$class) >= 0) {
|
|
496
|
+
withPath.push(`['${obj.name}']`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
if (currentNode.name !== "this") {
|
|
501
|
+
withPath.push(`['${currentNode.name}']`);
|
|
502
|
+
}
|
|
503
|
+
return withPath.length > 0 ? `$${withPath.join("")}` : "$";
|
|
504
|
+
}
|
|
505
|
+
function generateAgreement(modelManager, clauseLibrary, templateMark, data, options) {
|
|
506
|
+
const introspector = new concertoCore.Introspector(modelManager);
|
|
507
|
+
return traverse(templateMark).map(function(context) {
|
|
508
|
+
let stopHere = false;
|
|
509
|
+
if (typeof context === "object" && context.$class && typeof context.$class === "string") {
|
|
510
|
+
const nodeClass = context.$class;
|
|
511
|
+
const match = nodeClass.match(TEMPLATEMARK_RE);
|
|
512
|
+
if (match && match.length > 1) {
|
|
513
|
+
context.$class = `${markdownCommon.CiceroMarkModel.NAMESPACE}.${match[3]}`;
|
|
514
|
+
}
|
|
515
|
+
if (CONTRACT_DEFINITION_RE.test(nodeClass)) {
|
|
516
|
+
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`;
|
|
517
|
+
delete context.name;
|
|
518
|
+
delete context.elementType;
|
|
519
|
+
}
|
|
520
|
+
if (WITH_DEFINITION_RE.test(nodeClass)) {
|
|
521
|
+
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`;
|
|
522
|
+
delete context.name;
|
|
523
|
+
delete context.elementType;
|
|
524
|
+
} else if (FORMULA_DEFINITION_RE.test(nodeClass)) {
|
|
525
|
+
if (context.code) {
|
|
526
|
+
checkCode(context.code);
|
|
527
|
+
const result = evaluateJavaScript(clauseLibrary, data, context.code.contents, options);
|
|
528
|
+
if (result === null) {
|
|
529
|
+
context.value = "<null>";
|
|
530
|
+
} else if (typeof result === "string") {
|
|
531
|
+
context.value = result;
|
|
532
|
+
} else {
|
|
533
|
+
context.value = JSON.stringify(result);
|
|
534
|
+
}
|
|
535
|
+
delete context.code;
|
|
536
|
+
} else {
|
|
537
|
+
throw new Error("Formula node is missing code.");
|
|
538
|
+
}
|
|
539
|
+
} else if (LISTBLOCK_DEFINITION_RE.test(nodeClass)) {
|
|
540
|
+
const path = getJsonPath(templateMark, context, this.path);
|
|
541
|
+
const variableValues = jp.query(data, path, 1);
|
|
542
|
+
if (variableValues.length === 0) {
|
|
543
|
+
throw new Error(`No values found for path '${path}' in data ${data}.`);
|
|
544
|
+
} else {
|
|
545
|
+
const arrayData = variableValues[0];
|
|
546
|
+
if (!Array.isArray(arrayData)) {
|
|
547
|
+
throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
|
|
548
|
+
} else {
|
|
549
|
+
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.List`;
|
|
550
|
+
delete context.elementType;
|
|
551
|
+
delete context.name;
|
|
552
|
+
context.nodes = arrayData.map((arrayItem) => {
|
|
553
|
+
const subResult = generateAgreement(modelManager, clauseLibrary, context.nodes[0].nodes[0], arrayItem);
|
|
554
|
+
return {
|
|
555
|
+
$class: `${markdownCommon.CommonMarkModel.NAMESPACE}.Item`,
|
|
556
|
+
nodes: subResult.nodes ? subResult.nodes : []
|
|
557
|
+
};
|
|
558
|
+
});
|
|
559
|
+
stopHere = true;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
} else if (JOIN_DEFINITION_RE.test(nodeClass)) {
|
|
563
|
+
const path = getJsonPath(templateMark, context, this.path);
|
|
564
|
+
const variableValues = jp.query(data, path, 1);
|
|
565
|
+
if (variableValues.length === 0) {
|
|
566
|
+
throw new Error(`No values found for path '${path}' in data ${data}.`);
|
|
567
|
+
} else {
|
|
568
|
+
const arrayData = variableValues[0];
|
|
569
|
+
if (!Array.isArray(arrayData)) {
|
|
570
|
+
throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
|
|
571
|
+
} else {
|
|
572
|
+
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Text`;
|
|
573
|
+
const drafter = getDrafter(context.elementType);
|
|
574
|
+
context.text = joinList(arrayData.map((arrayItem) => {
|
|
575
|
+
return drafter ? drafter(arrayItem, context.format) : arrayItem;
|
|
576
|
+
}), context, options);
|
|
577
|
+
delete context.elementType;
|
|
578
|
+
delete context.name;
|
|
579
|
+
delete context.separator;
|
|
580
|
+
delete context.locale;
|
|
581
|
+
delete context.type;
|
|
582
|
+
delete context.style;
|
|
583
|
+
delete context.nodes;
|
|
584
|
+
stopHere = true;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
} else if (VARIABLE_DEFINITION_RE.test(nodeClass) || ENUM_VARIABLE_DEFINITION_RE.test(nodeClass) || FORMATTED_VARIABLE_DEFINITION_RE.test(nodeClass)) {
|
|
588
|
+
if (typeof data === "object") {
|
|
589
|
+
const path = getJsonPath(templateMark, context, this.path);
|
|
590
|
+
const variableValues = jp.query(data, path, 1);
|
|
591
|
+
if (variableValues.length === 0) {
|
|
592
|
+
throw new Error(`No values found for path '${path}' in data ${data}.`);
|
|
593
|
+
} else {
|
|
594
|
+
const variableValue = variableValues[0];
|
|
595
|
+
const type = concertoCore.ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
|
|
596
|
+
const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
|
|
597
|
+
context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
|
|
598
|
+
}
|
|
599
|
+
} else {
|
|
600
|
+
const variableValue = data;
|
|
601
|
+
const type = concertoCore.ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
|
|
602
|
+
const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
|
|
603
|
+
context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
|
|
604
|
+
}
|
|
605
|
+
} else if (CONDITIONAL_DEFINITION_RE.test(nodeClass)) {
|
|
606
|
+
if (context.condition) {
|
|
607
|
+
checkCode(context.condition);
|
|
608
|
+
context.isTrue = !!evaluateJavaScript(clauseLibrary, data, context.condition.contents, options);
|
|
609
|
+
} else {
|
|
610
|
+
const path = getJsonPath(templateMark, context, this.path);
|
|
611
|
+
const variableValues = jp.query(data, path, 1);
|
|
612
|
+
if (variableValues && variableValues.length) {
|
|
613
|
+
if (variableValues.length === 1) {
|
|
614
|
+
context.isTrue = !!variableValues[0];
|
|
615
|
+
} else {
|
|
616
|
+
throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
|
|
617
|
+
}
|
|
618
|
+
} else {
|
|
619
|
+
context.isTrue = false;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
context.nodes = context.isTrue ? context.whenTrue : context.whenFalse;
|
|
623
|
+
delete context.condition;
|
|
624
|
+
delete context.dependencies;
|
|
625
|
+
delete context.functionName;
|
|
626
|
+
} else if (CLAUSE_DEFINITION_RE.test(nodeClass)) {
|
|
627
|
+
if (context.condition) {
|
|
628
|
+
checkCode(context.condition);
|
|
629
|
+
const result = !!evaluateJavaScript(clauseLibrary, data, context.condition.contents, options);
|
|
630
|
+
if (!result) {
|
|
631
|
+
delete context.nodes;
|
|
632
|
+
stopHere = true;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
delete context.condition;
|
|
636
|
+
delete context.functionName;
|
|
637
|
+
} else if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
|
|
638
|
+
const path = getJsonPath(templateMark, context, this.path);
|
|
639
|
+
const variableValues = jp.query(data, path, 1);
|
|
640
|
+
if (variableValues && variableValues.length) {
|
|
641
|
+
if (variableValues.length === 1) {
|
|
642
|
+
context.hasSome = true;
|
|
643
|
+
context.whenNone = [];
|
|
644
|
+
} else {
|
|
645
|
+
throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
|
|
646
|
+
}
|
|
647
|
+
} else {
|
|
648
|
+
context.hasSome = false;
|
|
649
|
+
context.whenSome = [];
|
|
650
|
+
}
|
|
651
|
+
context.nodes = context.hasSome ? context.whenSome : context.whenNone;
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
this.update(context, stopHere);
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
class TemplateMarkInterpreter {
|
|
658
|
+
modelManager;
|
|
659
|
+
templateClass;
|
|
660
|
+
clauseLibrary;
|
|
661
|
+
constructor(modelManager, clauseLibrary, templateConceptFqn) {
|
|
662
|
+
this.modelManager = modelManager;
|
|
663
|
+
this.clauseLibrary = clauseLibrary;
|
|
664
|
+
this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Checks that a TemplateMark JSON document is valid with respect to the
|
|
668
|
+
* TemplateMark model, as well as the template model.
|
|
669
|
+
*
|
|
670
|
+
* Checks:
|
|
671
|
+
* 1. Variable names are valid properties in the template model
|
|
672
|
+
* 2. Optional properties have guards
|
|
673
|
+
* @param {*} templateMark the TemplateMark JSON object
|
|
674
|
+
* @returns {*} TemplateMark JSON that has been typed checked and has type metadata added
|
|
675
|
+
* @throws {Error} if the templateMark document is invalid
|
|
676
|
+
*/
|
|
677
|
+
checkTypes(templateMark) {
|
|
678
|
+
const modelManager = new concertoCore.ModelManager({ strict: true });
|
|
679
|
+
modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
|
|
680
|
+
modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
|
|
681
|
+
modelManager.addCTOModel(markdownCommon.TemplateMarkModel.MODEL, "templatemark.cto");
|
|
682
|
+
const factory = new concertoCore.Factory(modelManager);
|
|
683
|
+
const serializer = new concertoCore.Serializer(factory, modelManager);
|
|
684
|
+
try {
|
|
685
|
+
serializer.fromJSON(templateMark);
|
|
686
|
+
return templateMark;
|
|
687
|
+
} catch (err) {
|
|
688
|
+
throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(templateMark, null, 2)}`);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
/**
|
|
692
|
+
* Compiles the code nodes containing TS to code nodes containing JS.
|
|
693
|
+
* @param {*} templateMark the TemplateMark JSON object
|
|
694
|
+
* @returns {*} TemplateMark JSON with JS nodes
|
|
695
|
+
* @throws {Error} if the templateMark document is invalid
|
|
696
|
+
*/
|
|
697
|
+
async compileTypeScriptToJavaScript(templateMark) {
|
|
698
|
+
const templateConcept = templateMark.nodes[0].elementType;
|
|
699
|
+
if (!templateConcept) {
|
|
700
|
+
throw new Error("TemplateMark is not typed");
|
|
701
|
+
}
|
|
702
|
+
const compiler = new TemplateMarkToJavaScriptCompiler(this.modelManager, templateConcept);
|
|
703
|
+
await compiler.initialize();
|
|
704
|
+
return compiler.compile(templateMark);
|
|
705
|
+
}
|
|
706
|
+
validateCiceroMark(ciceroMark) {
|
|
707
|
+
const modelManager = new concertoCore.ModelManager({ strict: true });
|
|
708
|
+
modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
|
|
709
|
+
modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
|
|
710
|
+
modelManager.addCTOModel(markdownCommon.CiceroMarkModel.MODEL, "ciceromark.cto");
|
|
711
|
+
const factory = new concertoCore.Factory(modelManager);
|
|
712
|
+
const serializer = new concertoCore.Serializer(factory, modelManager);
|
|
713
|
+
try {
|
|
714
|
+
return serializer.fromJSON(ciceroMark);
|
|
715
|
+
} catch (err) {
|
|
716
|
+
throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(ciceroMark, null, 2)}`);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
async generate(templateMark, data, options) {
|
|
720
|
+
const factory = new concertoCore.Factory(this.modelManager);
|
|
721
|
+
const serializer = new concertoCore.Serializer(factory, this.modelManager);
|
|
722
|
+
const templateData = serializer.fromJSON(data);
|
|
723
|
+
if (templateData.getFullyQualifiedType() !== this.templateClass.getFullyQualifiedName()) {
|
|
724
|
+
throw new Error(`Template data must be of type '${this.templateClass.getFullyQualifiedName()}'.`);
|
|
725
|
+
}
|
|
726
|
+
const typedTemplateMark = this.checkTypes(templateMark);
|
|
727
|
+
const jsTemplateMark = await this.compileTypeScriptToJavaScript(typedTemplateMark);
|
|
728
|
+
const ciceroMark = generateAgreement(this.modelManager, this.clauseLibrary, jsTemplateMark, data, options);
|
|
729
|
+
return this.validateCiceroMark(ciceroMark);
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
exports.TemplateMarkInterpreter = TemplateMarkInterpreter;
|
|
734
|
+
exports.ensureDirSync = ensureDirSync;
|
|
735
|
+
exports.getTemplateClassDeclaration = getTemplateClassDeclaration;
|
|
736
|
+
exports.nameUserCode = nameUserCode;
|
|
737
|
+
exports.removeSync = removeSync;
|
|
738
|
+
exports.writeFunctionToString = writeFunctionToString;
|
|
739
|
+
//# sourceMappingURL=index.js.map
|