@accordproject/template-engine 3.1.0 → 4.2.1
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/README.md +41 -0
- package/lib/JavaScriptEvaluator.d.ts +71 -0
- package/lib/JavaScriptEvaluator.js +245 -0
- package/lib/JavaScriptEvaluator.js.map +1 -0
- package/lib/TemplateArchiveProcessor.d.ts +151 -0
- package/lib/TemplateArchiveProcessor.js +447 -0
- package/lib/TemplateArchiveProcessor.js.map +1 -0
- package/lib/TemplateMarkInterpreter.d.ts +34 -0
- package/lib/TemplateMarkInterpreter.js +689 -0
- package/lib/TemplateMarkInterpreter.js.map +1 -0
- package/lib/TemplateMarkNodes.d.ts +19 -0
- package/lib/TemplateMarkNodes.js +45 -0
- package/lib/TemplateMarkNodes.js.map +1 -0
- package/lib/TemplateMarkToJavaScriptCompiler.d.ts +20 -0
- package/lib/TemplateMarkToJavaScriptCompiler.js +99 -0
- package/lib/TemplateMarkToJavaScriptCompiler.js.map +1 -0
- package/lib/TypeScriptCompilationContext.d.ts +42 -0
- package/lib/TypeScriptCompilationContext.js +170 -0
- package/lib/TypeScriptCompilationContext.js.map +1 -0
- package/lib/TypeScriptRuntime.d.ts +17 -0
- package/lib/TypeScriptRuntime.js +84 -0
- package/lib/TypeScriptRuntime.js.map +1 -0
- package/lib/TypeScriptToJavaScriptCompiler.d.ts +11 -0
- package/lib/TypeScriptToJavaScriptCompiler.js +169 -0
- package/lib/TypeScriptToJavaScriptCompiler.js.map +1 -0
- package/lib/drafting/Boolean/index.d.ts +6 -0
- package/lib/drafting/Boolean/index.js +30 -0
- package/lib/drafting/Boolean/index.js.map +1 -0
- package/lib/drafting/DateTime/index.d.ts +8 -0
- package/lib/drafting/DateTime/index.js +33 -0
- package/lib/drafting/DateTime/index.js.map +1 -0
- package/lib/drafting/Double/format.d.ts +14 -0
- package/lib/drafting/Double/format.js +62 -0
- package/lib/drafting/Double/format.js.map +1 -0
- package/lib/drafting/Double/index.d.ts +8 -0
- package/lib/drafting/Double/index.js +33 -0
- package/lib/drafting/Double/index.js.map +1 -0
- package/lib/drafting/DraftFormat.d.ts +5 -0
- package/lib/drafting/DraftFormat.js +18 -0
- package/lib/drafting/DraftFormat.js.map +1 -0
- package/lib/drafting/Duration/index.d.ts +6 -0
- package/lib/drafting/Duration/index.js +39 -0
- package/lib/drafting/Duration/index.js.map +1 -0
- package/lib/drafting/Integer/format.d.ts +14 -0
- package/lib/drafting/Integer/format.js +52 -0
- package/lib/drafting/Integer/format.js.map +1 -0
- package/lib/drafting/Integer/index.d.ts +8 -0
- package/lib/drafting/Integer/index.js +33 -0
- package/lib/drafting/Integer/index.js.map +1 -0
- package/lib/drafting/Long/index.d.ts +8 -0
- package/lib/drafting/Long/index.js +33 -0
- package/lib/drafting/Long/index.js.map +1 -0
- package/lib/drafting/MonetaryAmount/currencycode.d.ts +35 -0
- package/lib/drafting/MonetaryAmount/currencycode.js +53 -0
- package/lib/drafting/MonetaryAmount/currencycode.js.map +1 -0
- package/lib/drafting/MonetaryAmount/formatTokens.d.ts +13 -0
- package/lib/drafting/MonetaryAmount/formatTokens.js +44 -0
- package/lib/drafting/MonetaryAmount/formatTokens.js.map +1 -0
- package/lib/drafting/MonetaryAmount/index.d.ts +13 -0
- package/lib/drafting/MonetaryAmount/index.js +51 -0
- package/lib/drafting/MonetaryAmount/index.js.map +1 -0
- package/lib/drafting/PreciseAmount/index.d.ts +17 -0
- package/lib/drafting/PreciseAmount/index.js +113 -0
- package/lib/drafting/PreciseAmount/index.js.map +1 -0
- package/lib/drafting/String/index.d.ts +6 -0
- package/lib/drafting/String/index.js +25 -0
- package/lib/drafting/String/index.js.map +1 -0
- package/lib/drafting/index.d.ts +2 -0
- package/lib/drafting/index.js +63 -0
- package/lib/drafting/index.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +42 -0
- package/lib/index.js.map +1 -0
- package/lib/llm/LLMConfig.d.ts +121 -0
- package/lib/llm/LLMConfig.js +30 -0
- package/lib/llm/LLMConfig.js.map +1 -0
- package/lib/llm/LLMExecutor.d.ts +77 -0
- package/lib/llm/LLMExecutor.js +603 -0
- package/lib/llm/LLMExecutor.js.map +1 -0
- package/lib/llm/ModelManagerSchema.d.ts +14 -0
- package/lib/llm/ModelManagerSchema.js +67 -0
- package/lib/llm/ModelManagerSchema.js.map +1 -0
- package/lib/llm/Reasoners.d.ts +190 -0
- package/lib/llm/Reasoners.js +643 -0
- package/lib/llm/Reasoners.js.map +1 -0
- package/lib/model-gen/concerto.d.ts +13 -0
- package/lib/model-gen/concerto.js +4 -0
- package/lib/model-gen/concerto.js.map +1 -0
- package/lib/model-gen/concerto.metamodel@1.0.0.d.ts +196 -0
- package/lib/model-gen/concerto.metamodel@1.0.0.js +4 -0
- package/lib/model-gen/concerto.metamodel@1.0.0.js.map +1 -0
- package/lib/model-gen/concerto@1.0.0.d.ts +19 -0
- package/lib/model-gen/concerto@1.0.0.js +4 -0
- package/lib/model-gen/concerto@1.0.0.js.map +1 -0
- package/lib/model-gen/org.accordproject.ciceromark@0.6.0.d.ts +49 -0
- package/lib/model-gen/org.accordproject.ciceromark@0.6.0.js +4 -0
- package/lib/model-gen/org.accordproject.ciceromark@0.6.0.js.map +1 -0
- package/lib/model-gen/org.accordproject.commonmark@0.5.0.d.ts +89 -0
- package/lib/model-gen/org.accordproject.commonmark@0.5.0.js +4 -0
- package/lib/model-gen/org.accordproject.commonmark@0.5.0.js.map +1 -0
- package/lib/model-gen/org.accordproject.templatemark@0.5.0.d.ts +76 -0
- package/lib/model-gen/org.accordproject.templatemark@0.5.0.js +11 -0
- package/lib/model-gen/org.accordproject.templatemark@0.5.0.js.map +1 -0
- package/lib/runtime/declarations.d.ts +2 -0
- package/lib/runtime/declarations.js +21 -0
- package/lib/runtime/declarations.js.map +1 -0
- package/lib/slc/model-gen/concerto.d.ts +13 -0
- package/lib/slc/model-gen/concerto.decorator@1.0.0.d.ts +6 -0
- package/lib/slc/model-gen/concerto.decorator@1.0.0.js +5 -0
- package/lib/slc/model-gen/concerto.decorator@1.0.0.js.map +1 -0
- package/lib/slc/model-gen/concerto.js +5 -0
- package/lib/slc/model-gen/concerto.js.map +1 -0
- package/lib/slc/model-gen/concerto@1.0.0.d.ts +24 -0
- package/lib/slc/model-gen/concerto@1.0.0.js +6 -0
- package/lib/slc/model-gen/concerto@1.0.0.js.map +1 -0
- package/lib/slc/model-gen/org.accordproject.contract@0.2.0.d.ts +7 -0
- package/lib/slc/model-gen/org.accordproject.contract@0.2.0.js +5 -0
- package/lib/slc/model-gen/org.accordproject.contract@0.2.0.js.map +1 -0
- package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.d.ts +15 -0
- package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.js +4 -0
- package/lib/slc/model-gen/org.accordproject.runtime@0.2.0.js.map +1 -0
- package/lib/slc/model-gen/org.accordproject.time@0.3.0.d.ts +46 -0
- package/lib/slc/model-gen/org.accordproject.time@0.3.0.js +48 -0
- package/lib/slc/model-gen/org.accordproject.time@0.3.0.js.map +1 -0
- package/lib/utils.d.ts +35 -0
- package/lib/utils.js +122 -0
- package/lib/utils.js.map +1 -0
- package/lib/worker.d.ts +1 -0
- package/{dist → lib}/worker.js +12 -10
- package/lib/worker.js.map +1 -0
- package/package.json +46 -25
- package/umd/template-engine.js +13 -0
- package/umd/template-engine.js.LICENSE.txt +21 -0
- package/dist/index.d.ts +0 -186
- package/dist/index.js +0 -1275
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -1248
- package/dist/index.mjs.map +0 -1
- package/dist/worker.js.map +0 -1
package/dist/index.js
DELETED
|
@@ -1,1275 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var jp = require('jsonpath');
|
|
4
|
-
var traverse = require('traverse');
|
|
5
|
-
var browserOrNode = require('browser-or-node');
|
|
6
|
-
var os = require('os');
|
|
7
|
-
var concertoCore = require('@accordproject/concerto-core');
|
|
8
|
-
var dayjs = require('dayjs');
|
|
9
|
-
var utc = require('dayjs/plugin/utc');
|
|
10
|
-
var toWords = require('to-words');
|
|
11
|
-
var markdownCommon = require('@accordproject/markdown-common');
|
|
12
|
-
var vfs = require('@typescript/vfs');
|
|
13
|
-
var twoslash = require('@typescript/twoslash');
|
|
14
|
-
var concertoCodegen = require('@accordproject/concerto-codegen');
|
|
15
|
-
var concertoUtil = require('@accordproject/concerto-util');
|
|
16
|
-
var markdownTemplate = require('@accordproject/markdown-template');
|
|
17
|
-
var fs = require('fs');
|
|
18
|
-
var lzstring = require('lz-string');
|
|
19
|
-
var child_process = require('child_process');
|
|
20
|
-
var path = require('path');
|
|
21
|
-
var markdownTransform = require('@accordproject/markdown-transform');
|
|
22
|
-
|
|
23
|
-
function _interopNamespaceDefault(e) {
|
|
24
|
-
var n = Object.create(null);
|
|
25
|
-
if (e) {
|
|
26
|
-
Object.keys(e).forEach(function (k) {
|
|
27
|
-
if (k !== 'default') {
|
|
28
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
29
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
30
|
-
enumerable: true,
|
|
31
|
-
get: function () { return e[k]; }
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
n.default = e;
|
|
37
|
-
return Object.freeze(n);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
var lzstring__namespace = /*#__PURE__*/_interopNamespaceDefault(lzstring);
|
|
41
|
-
|
|
42
|
-
function booleanDrafter(value) {
|
|
43
|
-
if (value) {
|
|
44
|
-
return "true";
|
|
45
|
-
} else {
|
|
46
|
-
return "false";
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
dayjs.extend(utc);
|
|
51
|
-
function dateTimeDrafter(value, format) {
|
|
52
|
-
const f = format ? format : "MM/DD/YYYY";
|
|
53
|
-
return dayjs.utc(value).format(f);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function draftDoubleIEEE(value) {
|
|
57
|
-
if (Math.floor(value) === value) {
|
|
58
|
-
return new Number(value).toFixed(1);
|
|
59
|
-
} else {
|
|
60
|
-
return "" + value;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
function draftDoubleFormat(value, format) {
|
|
64
|
-
if (format === "text") {
|
|
65
|
-
const converter = new toWords.ToWords();
|
|
66
|
-
const res = converter.convert(value);
|
|
67
|
-
return res;
|
|
68
|
-
} else {
|
|
69
|
-
return format.replace(/0(.)0((.)(0+))?/gi, function(_a, sep1, _b, sep2, digits) {
|
|
70
|
-
const len = digits ? digits.length : 0;
|
|
71
|
-
const vs = value.toFixed(len);
|
|
72
|
-
let res = "";
|
|
73
|
-
if (sep2) {
|
|
74
|
-
const d = vs.substring(vs.length - len);
|
|
75
|
-
res += sep2 + d;
|
|
76
|
-
}
|
|
77
|
-
let i = vs.substring(0, vs.length - (len === 0 ? 0 : len + 1));
|
|
78
|
-
while (i.length > 3) {
|
|
79
|
-
res = sep1 + i.substring(i.length - 3) + res;
|
|
80
|
-
i = i.substring(0, i.length - 3);
|
|
81
|
-
}
|
|
82
|
-
return i + res;
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function doubleDrafter(value, format) {
|
|
88
|
-
if (format) {
|
|
89
|
-
return draftDoubleFormat(value, format);
|
|
90
|
-
} else {
|
|
91
|
-
return draftDoubleIEEE(value);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function draftInteger(value) {
|
|
96
|
-
return "" + value;
|
|
97
|
-
}
|
|
98
|
-
function draftIntegerFormat(value, format) {
|
|
99
|
-
if (format === "text") {
|
|
100
|
-
const converter = new toWords.ToWords();
|
|
101
|
-
const res = converter.convert(value);
|
|
102
|
-
return res;
|
|
103
|
-
} else {
|
|
104
|
-
return format.replace(/0(.)0/gi, function(_a, sep1) {
|
|
105
|
-
const vs = value.toFixed(0);
|
|
106
|
-
let res = "";
|
|
107
|
-
let i = vs.substring(0, vs.length);
|
|
108
|
-
while (i.length > 3) {
|
|
109
|
-
res = sep1 + i.substring(i.length - 3) + res;
|
|
110
|
-
i = i.substring(0, i.length - 3);
|
|
111
|
-
}
|
|
112
|
-
return i + res;
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
function integerDrafter(value, format) {
|
|
118
|
-
if (format) {
|
|
119
|
-
return draftIntegerFormat(value, format);
|
|
120
|
-
} else {
|
|
121
|
-
return draftInteger(value);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function isDuration(value) {
|
|
126
|
-
return value != null && typeof value === "object" && "amount" in value && "unit" in value && typeof value.amount === "number" && typeof value.unit === "string";
|
|
127
|
-
}
|
|
128
|
-
function durationDrafter(value) {
|
|
129
|
-
if (!isDuration(value)) {
|
|
130
|
-
return "0 unknown";
|
|
131
|
-
}
|
|
132
|
-
return `${value.amount} ${value.unit}`;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function longDrafter(value, format) {
|
|
136
|
-
if (format) {
|
|
137
|
-
return draftIntegerFormat(value, format);
|
|
138
|
-
} else {
|
|
139
|
-
return draftInteger(value);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
var CurrencyCode = /* @__PURE__ */ ((CurrencyCode2) => {
|
|
144
|
-
CurrencyCode2["USD"] = "$";
|
|
145
|
-
CurrencyCode2["EUR"] = "\u20AC";
|
|
146
|
-
CurrencyCode2["JPY"] = "\xA5";
|
|
147
|
-
CurrencyCode2["GBP"] = "\xA3";
|
|
148
|
-
CurrencyCode2["AUD"] = "A$";
|
|
149
|
-
CurrencyCode2["CAD"] = "C$";
|
|
150
|
-
CurrencyCode2["CHF"] = "CHF";
|
|
151
|
-
CurrencyCode2["CNY"] = "\u5143";
|
|
152
|
-
CurrencyCode2["HKD"] = "HK$";
|
|
153
|
-
CurrencyCode2["NZD"] = "NZ$";
|
|
154
|
-
CurrencyCode2["KRW"] = "\u20A9";
|
|
155
|
-
CurrencyCode2["SGD"] = "S$";
|
|
156
|
-
CurrencyCode2["MXN"] = "MEX$";
|
|
157
|
-
CurrencyCode2["INR"] = "\u20B9";
|
|
158
|
-
CurrencyCode2["RUB"] = "\u20BD";
|
|
159
|
-
CurrencyCode2["ZAR"] = "R";
|
|
160
|
-
CurrencyCode2["TRY"] = "\u20BA";
|
|
161
|
-
CurrencyCode2["BRL"] = "R$";
|
|
162
|
-
CurrencyCode2["TWD"] = "NT$";
|
|
163
|
-
CurrencyCode2["PLN"] = "z\u0142";
|
|
164
|
-
CurrencyCode2["THB"] = "\u0E3F";
|
|
165
|
-
CurrencyCode2["IDR"] = "Rp";
|
|
166
|
-
CurrencyCode2["HUF"] = "Ft";
|
|
167
|
-
CurrencyCode2["CZK"] = "K\u010D";
|
|
168
|
-
CurrencyCode2["ILS"] = "\u20AA";
|
|
169
|
-
CurrencyCode2["CLP"] = "CLP$";
|
|
170
|
-
CurrencyCode2["PHP"] = "\u20B1";
|
|
171
|
-
CurrencyCode2["AED"] = "\u062F.\u0625";
|
|
172
|
-
CurrencyCode2["COP"] = "COL$";
|
|
173
|
-
CurrencyCode2["SAR"] = "\uFDFC";
|
|
174
|
-
CurrencyCode2["MYR"] = "RM";
|
|
175
|
-
CurrencyCode2["RON"] = "L";
|
|
176
|
-
CurrencyCode2["BGN"] = "\u043B\u0432.";
|
|
177
|
-
return CurrencyCode2;
|
|
178
|
-
})(CurrencyCode || {});
|
|
179
|
-
|
|
180
|
-
function monetaryAmountDefaultDrafter(value) {
|
|
181
|
-
return "" + draftDoubleIEEE(value.doubleValue) + " " + value.currencyCode;
|
|
182
|
-
}
|
|
183
|
-
function codeSymbol(c) {
|
|
184
|
-
const index = Object.keys(CurrencyCode).indexOf(c);
|
|
185
|
-
if (index >= 0) {
|
|
186
|
-
return Object.values(CurrencyCode)[index];
|
|
187
|
-
} else {
|
|
188
|
-
return c;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
function monetaryAmountFormatDrafter(value, format) {
|
|
192
|
-
return draftDoubleFormat(
|
|
193
|
-
value.doubleValue,
|
|
194
|
-
format.replace(/K/gi, codeSymbol(value.currencyCode)).replace(/CCC/gi, value.currencyCode)
|
|
195
|
-
);
|
|
196
|
-
}
|
|
197
|
-
function monetaryAmountDrafter(value, format) {
|
|
198
|
-
if (format) {
|
|
199
|
-
return monetaryAmountFormatDrafter(value, format);
|
|
200
|
-
} else {
|
|
201
|
-
return monetaryAmountDefaultDrafter(value);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
function stringDrafter(value) {
|
|
206
|
-
return value;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
function getDrafter(typeName) {
|
|
210
|
-
switch (typeName) {
|
|
211
|
-
case "Boolean":
|
|
212
|
-
return booleanDrafter;
|
|
213
|
-
case "DateTime":
|
|
214
|
-
return dateTimeDrafter;
|
|
215
|
-
case "Double":
|
|
216
|
-
return doubleDrafter;
|
|
217
|
-
case "Integer":
|
|
218
|
-
return integerDrafter;
|
|
219
|
-
case "Long":
|
|
220
|
-
return longDrafter;
|
|
221
|
-
case "org.accordproject.money@0.3.0.MonetaryAmount":
|
|
222
|
-
return monetaryAmountDrafter;
|
|
223
|
-
case "org.accordproject.time@0.3.0.Duration":
|
|
224
|
-
return durationDrafter;
|
|
225
|
-
case "org.accordproject.time@0.3.0.Period":
|
|
226
|
-
return durationDrafter;
|
|
227
|
-
case "String":
|
|
228
|
-
return stringDrafter;
|
|
229
|
-
default:
|
|
230
|
-
return null;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
const TEMPLATEMARK_RE = /^(org\.accordproject\.templatemark)@(.+)\.(\w+)Definition$/;
|
|
235
|
-
const FORMULA_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormulaDefinition$/;
|
|
236
|
-
const VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.VariableDefinition$/;
|
|
237
|
-
const CONDITIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ConditionalDefinition$/;
|
|
238
|
-
const ENUM_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.EnumVariableDefinition$/;
|
|
239
|
-
const FORMATTED_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormattedVariableDefinition$/;
|
|
240
|
-
const WITH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.WithDefinition$/;
|
|
241
|
-
const LISTBLOCK_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ListBlockDefinition$/;
|
|
242
|
-
const JOIN_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.JoinDefinition$/;
|
|
243
|
-
const OPTIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.OptionalDefinition$/;
|
|
244
|
-
const CLAUSE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ClauseDefinition$/;
|
|
245
|
-
const CONTRACT_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ContractDefinition$/;
|
|
246
|
-
const FOREACH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ForeachDefinition$/;
|
|
247
|
-
const NAVIGATION_NODES = [
|
|
248
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ListBlockDefinition`,
|
|
249
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.WithDefinition`,
|
|
250
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.JoinDefinition`,
|
|
251
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.OptionalDefinition`,
|
|
252
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`,
|
|
253
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ContractDefinition`,
|
|
254
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ForeachBlockDefinition`
|
|
255
|
-
];
|
|
256
|
-
|
|
257
|
-
function ensureDirSync(path) {
|
|
258
|
-
if (!fs.existsSync(path)) {
|
|
259
|
-
fs.mkdirSync(path, { recursive: true });
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
function removeSync(path) {
|
|
263
|
-
fs.rmSync(path, { recursive: true, force: true });
|
|
264
|
-
}
|
|
265
|
-
function writeFunctionToString(templateClass, functionName, returnType, code) {
|
|
266
|
-
let result = "";
|
|
267
|
-
result += "/// ---cut---\n";
|
|
268
|
-
result += `export function ${functionName}(data:TemplateModel.I${templateClass.getName()}, library:any, options:GenerationOptions) : ${returnType} {
|
|
269
|
-
`;
|
|
270
|
-
result += " const now = dayjs(options?.now);\n";
|
|
271
|
-
result += " const locale = options?.locale;\n";
|
|
272
|
-
templateClass.getProperties().forEach((p) => {
|
|
273
|
-
result += ` const ${p.getName()} = data.${p.getName()};
|
|
274
|
-
`;
|
|
275
|
-
});
|
|
276
|
-
result += " " + code.trim() + "\n";
|
|
277
|
-
result += "}\n";
|
|
278
|
-
result += "\n";
|
|
279
|
-
return result;
|
|
280
|
-
}
|
|
281
|
-
function nameUserCode(templateMarkDom) {
|
|
282
|
-
return traverse(templateMarkDom).map(function(x) {
|
|
283
|
-
if (x && (x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition` && x.condition || x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition` && x.condition)) {
|
|
284
|
-
x.functionName = `condition_${this.path.join("_")}`;
|
|
285
|
-
}
|
|
286
|
-
this.update(x);
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
function getTemplateClassDeclaration(modelManager, templateConceptFqn) {
|
|
290
|
-
const introspector = new concertoCore.Introspector(modelManager);
|
|
291
|
-
try {
|
|
292
|
-
return markdownTemplate.templatemarkutil.findTemplateConcept(introspector, "clause", templateConceptFqn);
|
|
293
|
-
} catch (err) {
|
|
294
|
-
console.log(err);
|
|
295
|
-
throw err;
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
class TypeScriptCompilationContext {
|
|
300
|
-
constructor(modelManager, templateConceptFqn) {
|
|
301
|
-
this.modelManager = modelManager;
|
|
302
|
-
this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
|
|
303
|
-
}
|
|
304
|
-
getTypeScriptFiles() {
|
|
305
|
-
const result = {};
|
|
306
|
-
const visitor = new concertoCodegen.CodeGen.TypescriptVisitor();
|
|
307
|
-
const writer = new concertoUtil.InMemoryWriter();
|
|
308
|
-
const params = {
|
|
309
|
-
fileWriter: writer
|
|
310
|
-
};
|
|
311
|
-
this.modelManager.accept(visitor, params);
|
|
312
|
-
writer.getFilesInMemory().forEach((value, key) => {
|
|
313
|
-
result[key] = value;
|
|
314
|
-
});
|
|
315
|
-
return result;
|
|
316
|
-
}
|
|
317
|
-
getCompilationContext() {
|
|
318
|
-
const files = this.getTypeScriptFiles();
|
|
319
|
-
let result = "";
|
|
320
|
-
Object.keys(files).forEach((key) => {
|
|
321
|
-
const content = files[key];
|
|
322
|
-
result += `
|
|
323
|
-
// @filename: ${key}
|
|
324
|
-
${content}
|
|
325
|
-
`;
|
|
326
|
-
});
|
|
327
|
-
result += `
|
|
328
|
-
// @filename: code.ts
|
|
329
|
-
import * as TemplateModel from './${this.templateClass.getNamespace()}';
|
|
330
|
-
import dayjs from 'dayjs';
|
|
331
|
-
import jp from 'jsonpath';
|
|
332
|
-
|
|
333
|
-
type GenerationOptions = {
|
|
334
|
-
now?:string,
|
|
335
|
-
locale?:string
|
|
336
|
-
}
|
|
337
|
-
`;
|
|
338
|
-
return result;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const DAYJS_BASE64 = "Ly8vIDxyZWZlcmVuY2UgcGF0aD0iLi9sb2NhbGUvaW5kZXguZC50cyIgLz4KCmV4cG9ydCA9IGRheWpzOwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUpOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIHN0cmljdD86IGJvb2xlYW4pOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIGxvY2FsZT86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IGRheWpzLkRheWpzCgpkZWNsYXJlIG5hbWVzcGFjZSBkYXlqcyB7CiAgaW50ZXJmYWNlIENvbmZpZ1R5cGVNYXAgewogICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IERheWpzIHwgbnVsbCB8IHVuZGVmaW5lZAogIH0KCiAgZXhwb3J0IHR5cGUgQ29uZmlnVHlwZSA9IENvbmZpZ1R5cGVNYXBba2V5b2YgQ29uZmlnVHlwZU1hcF0KCiAgZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPYmplY3QgeyBsb2NhbGU/OiBzdHJpbmcsIGZvcm1hdD86IHN0cmluZywgdXRjPzogYm9vbGVhbiB9CgogIGV4cG9ydCB0eXBlIE9wdGlvblR5cGUgPSBGb3JtYXRPYmplY3QgfCBzdHJpbmcgfCBzdHJpbmdbXQoKICBleHBvcnQgdHlwZSBVbml0VHlwZVNob3J0ID0gJ2QnIHwgJ0QnIHwgJ00nIHwgJ3knIHwgJ2gnIHwgJ20nIHwgJ3MnIHwgJ21zJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmcgPSAnbWlsbGlzZWNvbmQnIHwgJ3NlY29uZCcgfCAnbWludXRlJyB8ICdob3VyJyB8ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyB8ICdkYXRlJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmdQbHVyYWwgPSAnbWlsbGlzZWNvbmRzJyB8ICdzZWNvbmRzJyB8ICdtaW51dGVzJyB8ICdob3VycycgfCAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycgfCAnZGF0ZXMnCiAgCiAgZXhwb3J0IHR5cGUgVW5pdFR5cGUgPSBVbml0VHlwZUxvbmcgfCBVbml0VHlwZUxvbmdQbHVyYWwgfCBVbml0VHlwZVNob3J0OwoKICBleHBvcnQgdHlwZSBPcFVuaXRUeXBlID0gVW5pdFR5cGUgfCAid2VlayIgfCAid2Vla3MiIHwgJ3cnOwogIGV4cG9ydCB0eXBlIFFVbml0VHlwZSA9IFVuaXRUeXBlIHwgInF1YXJ0ZXIiIHwgInF1YXJ0ZXJzIiB8ICdRJzsKICBleHBvcnQgdHlwZSBNYW5pcHVsYXRlVHlwZSA9IEV4Y2x1ZGU8T3BVbml0VHlwZSwgJ2RhdGUnIHwgJ2RhdGVzJz47CiAgY2xhc3MgRGF5anMgewogICAgY29uc3RydWN0b3IgKGNvbmZpZz86IENvbmZpZ1R5cGUpCiAgICAvKioKICAgICAqIEFsbCBEYXkuanMgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBTdGlsbCwgYGRheWpzI2Nsb25lYCBjYW4gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGlmIHlvdSBuZWVkIG9uZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5jbG9uZSgpLy8gPT4gRGF5anMKICAgICAqIGRheWpzKGRheWpzKCcyMDE5LTAxLTI1JykpIC8vIHBhc3NpbmcgYSBEYXlqcyBvYmplY3QgdG8gYSBjb25zdHJ1Y3RvciB3aWxsIGFsc28gY2xvbmUgaXQKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvZGF5anMtY2xvbmUKICAgICAqLwogICAgY2xvbmUoKTogRGF5anMKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBjb250YWlucyBhIHZhbGlkIGRhdGUgb3Igbm90LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzVmFsaWQoKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvaXMtdmFsaWQKICAgICAqLwogICAgaXNWYWxpZCgpOiBib29sZWFuCiAgICAvKioKICAgICAqIEdldCB0aGUgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS55ZWFyKCkvLyA9PiAyMDIwCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHllYXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkueWVhcigyMDAwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1vbnRoLgogICAgICoKICAgICAqIE1vbnRocyBhcmUgemVybyBpbmRleGVkLCBzbyBKYW51YXJ5IGlzIG1vbnRoIDAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubW9udGgoKS8vID0+IDAtMTEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9tb250aAogICAgICovCiAgICBtb250aCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtb250aC4KICAgICAqCiAgICAgKiBNb250aHMgYXJlIHplcm8gaW5kZXhlZCwgc28gSmFudWFyeSBpcyBtb250aCAwLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMTEuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5tb250aCgwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbW9udGgKICAgICAqLwogICAgbW9udGgodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF0ZSBvZiB0aGUgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF0ZSgpLy8gPT4gMS0zMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RhdGUKICAgICAqLwogICAgZGF0ZSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXRlIG9mIHRoZSBtb250aC4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAxIHRvIDMxLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1vbnRocy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXRlKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXRlCiAgICAgKi8KICAgIGRhdGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIFJldHVybnMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmRheSgpLy8gMC02CiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZGF5CiAgICAgKi8KICAgIGRheSgpOiAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2CiAgICAvKioKICAgICAqIFNldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIG5leHQgd2Vla3MuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF5KDApLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXkKICAgICAqLwogICAgZGF5KHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGhvdXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaG91cigpLy8gPT4gMC0yMwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2hvdXIKICAgICAqLwogICAgaG91cigpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBob3VyLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMjMuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgZGF5LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmhvdXIoMTIpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9ob3VyCiAgICAgKi8KICAgIGhvdXIodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgbWludXRlcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taW51dGUoKS8vID0+IDAtNTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taW51dGUKICAgICAqLwogICAgbWludXRlKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1pbnV0ZXMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA1OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBob3VyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbnV0ZSg1OSkvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbnV0ZQogICAgICovCiAgICBtaW51dGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZWNvbmQoKS8vID0+IDAtNTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9zZWNvbmQKICAgICAqLwogICAgc2Vjb25kKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHNlY29uZHMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA1OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBtaW51dGVzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNlY29uZCgxKS8vIERheWpzCiAgICAgKiBgYGAKICAgICAqLwogICAgc2Vjb25kKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1pbGxpc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taWxsaXNlY29uZCgpLy8gPT4gMC05OTkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taWxsaXNlY29uZAogICAgICovCiAgICBtaWxsaXNlY29uZCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtaWxsaXNlY29uZHMuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byA5OTkuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgc2Vjb25kcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5taWxsaXNlY29uZCgxKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbWlsbGlzZWNvbmQKICAgICAqLwogICAgbWlsbGlzZWNvbmQodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdlbmVyaWMgc2V0dGVyLCBhY2NlcHRpbmcgdW5pdCBhcyBmaXJzdCBhcmd1bWVudCwgYW5kIHZhbHVlIGFzIHNlY29uZCwgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBhcHBsaWVkIGNoYW5nZXMuCiAgICAgKgogICAgICogSW4gZ2VuZXJhbDoKICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZXQodW5pdCwgdmFsdWUpID09PSBkYXlqcygpW3VuaXRdKHZhbHVlKQogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zZXQoJ2RhdGUnLCAxKQogICAgICogZGF5anMoKS5zZXQoJ21vbnRoJywgMykgLy8gQXByaWwKICAgICAqIGRheWpzKCkuc2V0KCdzZWNvbmQnLCAzMCkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9zZXQKICAgICAqLwogICAgc2V0KHVuaXQ6IFVuaXRUeXBlLCB2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogU3RyaW5nIGdldHRlciwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBpbmZvcm1hdGlvbiBnZXR0aW5nIGZyb20gRGF5LmpzIG9iamVjdC4KICAgICAqCiAgICAgKiBJbiBnZW5lcmFsOgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmdldCh1bml0KSA9PT0gZGF5anMoKVt1bml0XSgpCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmdldCgneWVhcicpCiAgICAgKiBkYXlqcygpLmdldCgnbW9udGgnKSAvLyBzdGFydCAwCiAgICAgKiBkYXlqcygpLmdldCgnZGF0ZScpCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZ2V0CiAgICAgKi8KICAgIGdldCh1bml0OiBVbml0VHlwZSk6IG51bWJlcgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3Qgd2l0aCBhIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSBhZGRlZC4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5hZGQoNywgJ2RheScpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9hZGQKICAgICAqLwogICAgYWRkKHZhbHVlOiBudW1iZXIsIHVuaXQ/OiBNYW5pcHVsYXRlVHlwZSk6IERheWpzCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjbG9uZWQgRGF5LmpzIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIHN1YnRyYWN0ZWQuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc3VidHJhY3QoNywgJ3llYXInKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvc3VidHJhY3QKICAgICAqLwogICAgc3VidHJhY3QodmFsdWU6IG51bWJlciwgdW5pdD86IE1hbmlwdWxhdGVUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IGFuZCBzZXQgaXQgdG8gdGhlIHN0YXJ0IG9mIGEgdW5pdCBvZiB0aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnN0YXJ0T2YoJ3llYXInKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvc3RhcnQtb2YKICAgICAqLwogICAgc3RhcnRPZih1bml0OiBPcFVuaXRUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IGFuZCBzZXQgaXQgdG8gdGhlIGVuZCBvZiBhIHVuaXQgb2YgdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5lbmRPZignbW9udGgnKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL21hbmlwdWxhdGUvZW5kLW9mCiAgICAgKi8KICAgIGVuZE9mKHVuaXQ6IE9wVW5pdFR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGZvcm1hdHRlZCBkYXRlIGFjY29yZGluZyB0byB0aGUgc3RyaW5nIG9mIHRva2VucyBwYXNzZWQgaW4uCiAgICAgKgogICAgICogVG8gZXNjYXBlIGNoYXJhY3RlcnMsIHdyYXAgdGhlbSBpbiBzcXVhcmUgYnJhY2tldHMgKGUuZy4gW01NXSkuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZm9ybWF0KCkvLyA9PiBjdXJyZW50IGRhdGUgaW4gSVNPODYwMSwgd2l0aG91dCBmcmFjdGlvbiBzZWNvbmRzIGUuZy4gJzIwMjAtMDQtMDJUMDg6MDI6MTctMDU6MDAnCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLmZvcm1hdCgnW1lZWVllc2NhcGVdIFlZWVktTU0tRERUSEg6bW06c3NaW1pdJykvLyAnWVlZWWVzY2FwZSAyMDE5LTAxLTI1VDAwOjAwOjAwLTAyOjAwWicKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZm9ybWF0KCdERC9NTS9ZWVlZJykgLy8gJzI1LzAxLzIwMTknCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvZm9ybWF0CiAgICAgKi8KICAgIGZvcm1hdCh0ZW1wbGF0ZT86IHN0cmluZyk6IHN0cmluZwogICAgLyoqCiAgICAgKiBUaGlzIGluZGljYXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRlLXRpbWUgaW4gdGhlIHNwZWNpZmllZCB1bml0LgogICAgICoKICAgICAqIFRvIGdldCB0aGUgZGlmZmVyZW5jZSBpbiBtaWxsaXNlY29uZHMsIHVzZSBgZGF5anMjZGlmZmAKICAgICAqIGBgYAogICAgICogY29uc3QgZGF0ZTEgPSBkYXlqcygnMjAxOS0wMS0yNScpCiAgICAgKiBjb25zdCBkYXRlMiA9IGRheWpzKCcyMDE4LTA2LTA1JykKICAgICAqIGRhdGUxLmRpZmYoZGF0ZTIpIC8vIDIwMjE0MDAwMDAwIGRlZmF1bHQgbWlsbGlzZWNvbmRzCiAgICAgKiBkYXRlMS5kaWZmKCkgLy8gbWlsbGlzZWNvbmRzIHRvIGN1cnJlbnQgdGltZQogICAgICogYGBgCiAgICAgKgogICAgICogVG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGluIGFub3RoZXIgdW5pdCBvZiBtZWFzdXJlbWVudCwgcGFzcyB0aGF0IG1lYXN1cmVtZW50IGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuCiAgICAgKiBgYGAKICAgICAqIGNvbnN0IGRhdGUxID0gZGF5anMoJzIwMTktMDEtMjUnKQogICAgICogZGF0ZTEuZGlmZignMjAxOC0wNi0wNScsICdtb250aCcpIC8vIDcKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9kaWZmZXJlbmNlCiAgICAgKi8KICAgIGRpZmYoZGF0ZT86IENvbmZpZ1R5cGUsIHVuaXQ/OiBRVW5pdFR5cGUgfCBPcFVuaXRUeXBlLCBmbG9hdD86IGJvb2xlYW4pOiBudW1iZXIKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgKiptaWxsaXNlY29uZHMqKiBzaW5jZSB0aGUgVW5peCBFcG9jaCBvZiB0aGUgRGF5LmpzIG9iamVjdC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS52YWx1ZU9mKCkgLy8gMTU0ODM4MTYwMDAwMAogICAgICogK2RheWpzKDE1NDgzODE2MDAwMDApIC8vIDE1NDgzODE2MDAwMDAKICAgICAqIGBgYAogICAgICogVG8gZ2V0IGEgVW5peCB0aW1lc3RhbXAgKHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gpIGZyb20gYSBEYXkuanMgb2JqZWN0LCB5b3Ugc2hvdWxkIHVzZSBVbml4IFRpbWVzdGFtcCBgZGF5anMjdW5peCgpYC4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L3VuaXgtdGltZXN0YW1wLW1pbGxpc2Vjb25kcwogICAgICovCiAgICB2YWx1ZU9mKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIHJldHVybnMgdGhlIFVuaXggdGltZXN0YW1wICh0aGUgbnVtYmVyIG9mICoqc2Vjb25kcyoqIHNpbmNlIHRoZSBVbml4IEVwb2NoKSBvZiB0aGUgRGF5LmpzIG9iamVjdC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS51bml4KCkgLy8gMTU0ODM4MTYwMAogICAgICogYGBgCiAgICAgKiBUaGlzIHZhbHVlIGlzIGZsb29yZWQgdG8gdGhlIG5lYXJlc3Qgc2Vjb25kLCBhbmQgZG9lcyBub3QgaW5jbHVkZSBhIG1pbGxpc2Vjb25kcyBjb21wb25lbnQuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS91bml4LXRpbWVzdGFtcAogICAgICovCiAgICB1bml4KCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBkYXlzIGluIHRoZSBjdXJyZW50IG1vbnRoLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLmRheXNJbk1vbnRoKCkgLy8gMzEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9kYXlzLWluLW1vbnRoCiAgICAgKi8KICAgIGRheXNJbk1vbnRoKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUbyBnZXQgYSBjb3B5IG9mIHRoZSBuYXRpdmUgYERhdGVgIG9iamVjdCBwYXJzZWQgZnJvbSB0aGUgRGF5LmpzIG9iamVjdCB1c2UgYGRheWpzI3RvRGF0ZWAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9EYXRlKCkvLyA9PiBEYXRlCiAgICAgKiBgYGAKICAgICAqLwogICAgdG9EYXRlKCk6IERhdGUKICAgIC8qKgogICAgICogVG8gc2VyaWFsaXplIGFzIGFuIElTTyA4NjAxIHN0cmluZy4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS50b0pTT04oKSAvLyAnMjAxOS0wMS0yNVQwMjowMDowMC4wMDBaJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLWpzb24KICAgICAqLwogICAgdG9KU09OKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBUbyBmb3JtYXQgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvSVNPU3RyaW5nKCkgLy8gJzIwMTktMDEtMjVUMDI6MDA6MDAuMDAwWicKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9hcy1pc28tc3RyaW5nCiAgICAgKi8KICAgIHRvSVNPU3RyaW5nKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRlLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvU3RyaW5nKCkgLy8gJ0ZyaSwgMjUgSmFuIDIwMTkgMDI6MDA6MDAgR01UJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLXN0cmluZwogICAgICovCiAgICB0b1N0cmluZygpOiBzdHJpbmcKICAgIC8qKgogICAgICogR2V0IHRoZSBVVEMgb2Zmc2V0IGluIG1pbnV0ZXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkudXRjT2Zmc2V0KCkKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS91dGMtb2Zmc2V0CiAgICAgKi8KICAgIHV0Y09mZnNldCgpOiBudW1iZXIKICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBiZWZvcmUgdGhlIG90aGVyIHN1cHBsaWVkIGRhdGUtdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0JlZm9yZShkYXlqcygnMjAxMS0wMS0wMScpKSAvLyBkZWZhdWx0IG1pbGxpc2Vjb25kcwogICAgICogYGBgCiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgZ3JhbnVsYXJpdHkgdG8gYSB1bml0IG90aGVyIHRoYW4gbWlsbGlzZWNvbmRzLCBwYXNzIGl0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQmVmb3JlKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYmVmb3JlCiAgICAgKi8KICAgIGlzQmVmb3JlKGRhdGU/OiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzU2FtZShkYXlqcygnMjAxMS0wMS0wMScpKSAvLyBkZWZhdWx0IG1pbGxpc2Vjb25kcwogICAgICogYGBgCiAgICAgKiBJZiB5b3Ugd2FudCB0byBsaW1pdCB0aGUgZ3JhbnVsYXJpdHkgdG8gYSB1bml0IG90aGVyIHRoYW4gbWlsbGlzZWNvbmRzLCBwYXNzIGl0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzU2FtZSgnMjAxMS0wMS0wMScsICd5ZWFyJykvLyA9PiBib29sZWFuCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL3F1ZXJ5L2lzLXNhbWUKICAgICAqLwogICAgaXNTYW1lKGRhdGU/OiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBhZnRlciB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQWZ0ZXIoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0FmdGVyKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYWZ0ZXIKICAgICAqLwogICAgaXNBZnRlcihkYXRlPzogQ29uZmlnVHlwZSwgdW5pdD86IE9wVW5pdFR5cGUpOiBib29sZWFuCgogICAgbG9jYWxlKCk6IHN0cmluZwoKICAgIGxvY2FsZShwcmVzZXQ6IHN0cmluZyB8IElMb2NhbGUsIG9iamVjdD86IFBhcnRpYWw8SUxvY2FsZT4pOiBEYXlqcwogIH0KCiAgZXhwb3J0IHR5cGUgUGx1Z2luRnVuYzxUID0gdW5rbm93bj4gPSAob3B0aW9uOiBULCBjOiB0eXBlb2YgRGF5anMsIGQ6IHR5cGVvZiBkYXlqcykgPT4gdm9pZAoKICBleHBvcnQgZnVuY3Rpb24gZXh0ZW5kPFQgPSB1bmtub3duPihwbHVnaW46IFBsdWdpbkZ1bmM8VD4sIG9wdGlvbj86IFQpOiBEYXlqcwoKICBleHBvcnQgZnVuY3Rpb24gbG9jYWxlKHByZXNldD86IHN0cmluZyB8IElMb2NhbGUsIG9iamVjdD86IFBhcnRpYWw8SUxvY2FsZT4sIGlzTG9jYWw/OiBib29sZWFuKTogc3RyaW5nCgogIGV4cG9ydCBmdW5jdGlvbiBpc0RheWpzKGQ6IGFueSk6IGQgaXMgRGF5anMKCiAgZXhwb3J0IGZ1bmN0aW9uIHVuaXgodDogbnVtYmVyKTogRGF5anMKCiAgY29uc3QgTHMgOiB7IFtrZXk6IHN0cmluZ10gOiAgSUxvY2FsZSB9Cn0K";
|
|
343
|
-
const JSONPATH_BASE64 = "dHlwZSBQYXRoQ29tcG9uZW50ID0gc3RyaW5nIHwgbnVtYmVyOwoKLyoqCiAqIEZpbmQgZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0CiAqIHNhdGlzZnkgdGhlIHByb3ZpZGVkIEpTT05QYXRoIGV4cHJlc3Npb24sb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZSB3ZXJlIG1hdGNoZWQuCiAqIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIGVsZW1lbnRzIGlmIHNwZWNpZmllZC4KICovCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHF1ZXJ5KG9iajogYW55LCBwYXRoRXhwcmVzc2lvbjogc3RyaW5nLCBjb3VudD86IG51bWJlcik6IGFueVtdOwoKLyoqCiAqIEZpbmQgcGF0aHMgdG8gZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZgogKiBlbGVtZW50IHBhdGhzIHRoYXQgc2F0aXNmeSB0aGUgcHJvdmlkZWQgSlNPTlBhdGggZXhwcmVzc2lvbi4gRWFjaCBwYXRoIGlzIGl0c2VsZiBhbgogKiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LiBSZXR1cm5zCiAqIG9ubHkgZmlyc3QgYGNvdW50YCBwYXRocyBpZiBzcGVjaWZpZWQuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXRocyhvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBQYXRoQ29tcG9uZW50W11bXTsKCi8qKgogKiBGaW5kIGVsZW1lbnRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHBhdGhzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuCiAqIFJldHVybnMgYW4gYXJyYXkgb2Ygbm9kZSBvYmplY3RzIHdoZXJlIGVhY2ggbm9kZSBoYXMgYSBgcGF0aGAgY29udGFpbmluZyBhbiBhcnJheSBvZgogKiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgLCBhbmQgYSBgdmFsdWVgIHBvaW50aW5nIHRvIHRoZSBtYXRjaGVkCiAqIGVsZW1lbnQuIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIG5vZGVzIGlmIHNwZWNpZmllZC4KICovCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIG5vZGVzKAogICAgb2JqOiBhbnksCiAgICBwYXRoRXhwcmVzc2lvbjogc3RyaW5nLAogICAgY291bnQ/OiBudW1iZXIsCik6IEFycmF5PHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55IH0+OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBlbGVtZW50IG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuIElmIGBuZXdWYWx1ZWAgaXMKICogcHJvdmlkZWQsIHNldHMgdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGFuZCByZXR1cm5zIHRoZSBuZXcgdmFsdWUuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB2YWx1ZShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZyk6IGFueTsKZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gdmFsdWU8VD4ob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTogVDsKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXJlbnQob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnk7CgovKioKICogUnVucyB0aGUgc3VwcGxpZWQgZnVuY3Rpb24gYGZuYCBvbiBlYWNoIG1hdGNoaW5nIGVsZW1lbnQsIGFuZCByZXBsYWNlcyBlYWNoCiAqIG1hdGNoaW5nIGVsZW1lbnQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyB0aGUKICogdmFsdWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgYXMgaXRzIG9ubHkgcGFyYW1ldGVyLiBSZXR1cm5zIG1hdGNoaW5nIG5vZGVzIHdpdGgKICogdGhlaXIgdXBkYXRlZCB2YWx1ZXMuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBhcHBseSgKICAgIG9iajogYW55LAogICAgcGF0aEV4cHJlc3Npb246IHN0cmluZywKICAgIGZuOiAoeDogYW55KSA9PiBhbnksCik6IEFycmF5PHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55IH0+OwoKLyoqCiAqIFBhcnNlIHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uIGludG8gcGF0aCBjb21wb25lbnRzIGFuZCB0aGVpciBhc3NvY2lhdGVkCiAqIG9wZXJhdGlvbnMuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXJzZShwYXRoRXhwcmVzc2lvbjogc3RyaW5nKTogYW55W107CgovKioKICogUmV0dXJucyBhIHBhdGggZXhwcmVzc2lvbiBpbiBzdHJpbmcgZm9ybSwgZ2l2ZW4gYSBwYXRoLiBUaGUgc3VwcGxpZWQgcGF0aCBtYXkgZWl0aGVyCiAqIGJlIGEgZmxhdCBhcnJheSBvZiBrZXlzLCBhcyByZXR1cm5lZCBieSBganAubm9kZXNgIGZvciBleGFtcGxlLCBvciBtYXkgYWx0ZXJuYXRpdmVseSBiZSBhCiAqIGZ1bGx5IHBhcnNlZCBwYXRoIGV4cHJlc3Npb24gaW4gdGhlIGZvcm0gb2YgYW4gYXJyYXkgb2YgcGF0aCBjb21wb25lbnRzIGFzIHJldHVybmVkCiAqIGJ5IGBqcC5wYXJzZWAuCiAqLwpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBzdHJpbmdpZnkocGF0aDogUGF0aENvbXBvbmVudFtdKTogc3RyaW5nOwoKZXhwb3J0IGFzIG5hbWVzcGFjZSBqc29ucGF0aDsK";
|
|
344
|
-
const SMART_LEGAL_CONTRACT_BASE64 = "LyoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAqLwoKLy8gd2UgZHVwbGljYXRlIHRoZXNlIGludGVyZmFjZXMgaGVyZSB0byBhdm9pZCBpbXBvcnRzIGludG8gdGhlIHJ1bnRpbWUKaW50ZXJmYWNlIElDb25jZXB0IHsKICAgICRjbGFzczogc3RyaW5nOwogfQoKaW50ZXJmYWNlIElUcmFuc2FjdGlvbiBleHRlbmRzIElDb25jZXB0IHsKICAgICR0aW1lc3RhbXA6IERhdGU7CiB9CgppbnRlcmZhY2UgSUV2ZW50IGV4dGVuZHMgSUNvbmNlcHQgewogICAkdGltZXN0YW1wOiBEYXRlOwp9CgppbnRlcmZhY2UgSVN0YXRlIHsKICAgICRpZGVudGlmaWVyOiBzdHJpbmc7Cn0KCmludGVyZmFjZSBFbmdpbmVSZXNwb25zZTxTIGV4dGVuZHMgSVN0YXRlPiB7CiAgICBzdGF0ZT86IFM7CiAgICBldmVudHM/OiBBcnJheTxJRXZlbnQ+Cn0KCmludGVyZmFjZSBJUmVxdWVzdCBleHRlbmRzIElUcmFuc2FjdGlvbiB7Cn0KCmludGVyZmFjZSBJUmVzcG9uc2UgZXh0ZW5kcyBJVHJhbnNhY3Rpb24gewp9CgppbnRlcmZhY2UgSUFzc2V0IGV4dGVuZHMgSUNvbmNlcHQgewogICAkaWRlbnRpZmllcjogc3RyaW5nOwp9CgppbnRlcmZhY2UgSUNvbnRyYWN0IGV4dGVuZHMgSUFzc2V0IHsKICAgY29udHJhY3RJZDogc3RyaW5nOwp9CgppbnRlcmZhY2UgSUNsYXVzZSBleHRlbmRzIElBc3NldCB7CiAgIGNsYXVzZUlkOiBzdHJpbmc7Cn0KCmludGVyZmFjZSBUcmlnZ2VyUmVzcG9uc2U8UyBleHRlbmRzIElTdGF0ZSA9IElTdGF0ZT4gZXh0ZW5kcyBFbmdpbmVSZXNwb25zZTxTPiB7CiAgICByZXN1bHQ6IElSZXNwb25zZTsKfQoKaW50ZXJmYWNlIEluaXRSZXNwb25zZTxTIGV4dGVuZHMgSVN0YXRlPiBleHRlbmRzIEVuZ2luZVJlc3BvbnNlPFM+IHt9Cgp0eXBlIFRlbXBsYXRlRGF0YSA9IElDb250cmFjdHxJQ2xhdXNlOwoKZXhwb3J0IGFic3RyYWN0IGNsYXNzIFRlbXBsYXRlTG9naWM8VCBleHRlbmRzIFRlbXBsYXRlRGF0YSwgUyBleHRlbmRzIElTdGF0ZSA9IElTdGF0ZT4gewogICAgYWJzdHJhY3QgdHJpZ2dlcihkYXRhOiBULCByZXF1ZXN0OiBJUmVxdWVzdCwgc3RhdGU6UykgOiBQcm9taXNlPFRyaWdnZXJSZXNwb25zZTxTPj47CiAgICBpbml0KGRhdGE6IFQpIDogUHJvbWlzZTxJbml0UmVzcG9uc2U8Uz58dW5kZWZpbmVkPjsKfQo=";
|
|
345
|
-
|
|
346
|
-
const TYPESCRIPT_URL = process.env.TYPESCRIPT_URL ? process.env.TYPESCRIPT_URL : "https://cdn.jsdelivr.net/npm/typescript@4.9.4/+esm";
|
|
347
|
-
const SCRIPT_TARGET = 9;
|
|
348
|
-
const MODULE_KIND = 6;
|
|
349
|
-
class TypeScriptToJavaScriptCompiler {
|
|
350
|
-
constructor(modelManager, templateConceptFqn) {
|
|
351
|
-
this.context = new TypeScriptCompilationContext(modelManager, templateConceptFqn).getCompilationContext();
|
|
352
|
-
this.typescriptUrl = TYPESCRIPT_URL;
|
|
353
|
-
}
|
|
354
|
-
async initialize(typescriptUrl) {
|
|
355
|
-
if (typescriptUrl) {
|
|
356
|
-
this.typescriptUrl = typescriptUrl;
|
|
357
|
-
}
|
|
358
|
-
if (typeof window === "undefined") {
|
|
359
|
-
this.ts = (await import('typescript')).default;
|
|
360
|
-
if (!this.ts) {
|
|
361
|
-
throw new Error("Failed to load typescript module");
|
|
362
|
-
}
|
|
363
|
-
this.fsMap = vfs.createDefaultMapFromNodeModules({
|
|
364
|
-
target: SCRIPT_TARGET
|
|
365
|
-
});
|
|
366
|
-
} else {
|
|
367
|
-
this.ts = (await import(this.typescriptUrl)).default;
|
|
368
|
-
if (!this.ts) {
|
|
369
|
-
throw new Error("Failed to dynamically load typescript");
|
|
370
|
-
}
|
|
371
|
-
this.fsMap = await vfs.createDefaultMapFromCDN({ target: SCRIPT_TARGET }, this.ts.version, false, this.ts);
|
|
372
|
-
}
|
|
373
|
-
this.fsMap.set("/node_modules/@types/dayjs/index.d.ts", Buffer.from(DAYJS_BASE64, "base64").toString());
|
|
374
|
-
this.fsMap.set("/node_modules/@types/jsonpath/index.d.ts", Buffer.from(JSONPATH_BASE64, "base64").toString());
|
|
375
|
-
}
|
|
376
|
-
compile(typescript) {
|
|
377
|
-
if (!this.fsMap) {
|
|
378
|
-
throw new Error("initialize must be awaited before compile is called.");
|
|
379
|
-
}
|
|
380
|
-
const twoSlashCode = `
|
|
381
|
-
${this.context}
|
|
382
|
-
${typescript}
|
|
383
|
-
`;
|
|
384
|
-
const options = {
|
|
385
|
-
fsMap: this.fsMap,
|
|
386
|
-
tsModule: this.ts,
|
|
387
|
-
defaultCompilerOptions: {
|
|
388
|
-
target: SCRIPT_TARGET,
|
|
389
|
-
module: MODULE_KIND
|
|
390
|
-
},
|
|
391
|
-
lzstringModule: lzstring__namespace,
|
|
392
|
-
defaultOptions: {
|
|
393
|
-
showEmit: true,
|
|
394
|
-
noErrorValidation: true,
|
|
395
|
-
showEmittedFile: "code.js"
|
|
396
|
-
}
|
|
397
|
-
};
|
|
398
|
-
const result = twoslash.twoslasher(twoSlashCode, "ts", options);
|
|
399
|
-
return result;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
var CodeType = /* @__PURE__ */ ((CodeType2) => {
|
|
404
|
-
CodeType2["TYPESCRIPT"] = "TYPESCRIPT";
|
|
405
|
-
CodeType2["ES_2020"] = "ES_2020";
|
|
406
|
-
return CodeType2;
|
|
407
|
-
})(CodeType || {});
|
|
408
|
-
|
|
409
|
-
const CODE_NODES = [
|
|
410
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.FormulaDefinition`,
|
|
411
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition`,
|
|
412
|
-
`${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`
|
|
413
|
-
];
|
|
414
|
-
function checkCode$1(code) {
|
|
415
|
-
if (code.type !== CodeType.TYPESCRIPT) {
|
|
416
|
-
throw new Error(`Cannot compile ${code.contents} as it is not Typescript.`);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
class TemplateMarkToJavaScriptCompiler {
|
|
420
|
-
constructor(modelManager, templateConceptFqn) {
|
|
421
|
-
this.modelManager = modelManager;
|
|
422
|
-
this.compiler = new TypeScriptToJavaScriptCompiler(modelManager, templateConceptFqn);
|
|
423
|
-
this.templateClass = getTemplateClassDeclaration(modelManager, templateConceptFqn);
|
|
424
|
-
}
|
|
425
|
-
async initialize() {
|
|
426
|
-
await this.compiler.initialize();
|
|
427
|
-
}
|
|
428
|
-
compile(templateJson) {
|
|
429
|
-
const namedTemplateMark = nameUserCode(templateJson);
|
|
430
|
-
const that = this;
|
|
431
|
-
const errors = Array();
|
|
432
|
-
const compiled = traverse(namedTemplateMark).map(function(x) {
|
|
433
|
-
if (x && CODE_NODES.includes(x.$class)) {
|
|
434
|
-
if (x.code) {
|
|
435
|
-
checkCode$1(x.code);
|
|
436
|
-
const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.name, "any", x.code.contents));
|
|
437
|
-
if (result.errors.length === 0) {
|
|
438
|
-
x.code.contents = result.code;
|
|
439
|
-
x.code.type = CodeType.ES_2020;
|
|
440
|
-
this.update(x);
|
|
441
|
-
} else {
|
|
442
|
-
errors.push({
|
|
443
|
-
nodeId: x.name,
|
|
444
|
-
code: x.code.contents,
|
|
445
|
-
errors: result.errors
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
} else if (x.condition) {
|
|
449
|
-
checkCode$1(x.condition);
|
|
450
|
-
const result = that.compiler.compile(writeFunctionToString(that.templateClass, x.functionName, "boolean", x.condition.contents));
|
|
451
|
-
if (result.errors.length === 0) {
|
|
452
|
-
x.condition.contents = result.code;
|
|
453
|
-
x.condition.type = CodeType.ES_2020;
|
|
454
|
-
this.update(x);
|
|
455
|
-
} else {
|
|
456
|
-
errors.push({
|
|
457
|
-
nodeId: x.functionName,
|
|
458
|
-
code: x.condition.contents,
|
|
459
|
-
errors: result.errors
|
|
460
|
-
});
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
});
|
|
465
|
-
if (errors.length === 0) {
|
|
466
|
-
return compiled;
|
|
467
|
-
} else {
|
|
468
|
-
throw errors;
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
function joinList(data, joinDef, options) {
|
|
474
|
-
if (joinDef.separator) {
|
|
475
|
-
return data.join(joinDef.separator);
|
|
476
|
-
} else {
|
|
477
|
-
const formatter = new Intl.ListFormat(
|
|
478
|
-
joinDef.locale ? joinDef.locale : options?.locale,
|
|
479
|
-
{
|
|
480
|
-
style: joinDef.style,
|
|
481
|
-
type: joinDef.type
|
|
482
|
-
}
|
|
483
|
-
);
|
|
484
|
-
return formatter.format(data);
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
async function sleep(msec) {
|
|
489
|
-
return new Promise((resolve) => setTimeout(resolve, msec));
|
|
490
|
-
}
|
|
491
|
-
const _import = async (path2) => new Function("specifier", "return import(specifier)")(path2);
|
|
492
|
-
const dynamicImport = async (path2, symbol) => {
|
|
493
|
-
const mod = await _import(path2);
|
|
494
|
-
return symbol ? mod.symbol : mod.default;
|
|
495
|
-
};
|
|
496
|
-
class JavaScriptEvaluator {
|
|
497
|
-
// queue of work to do
|
|
498
|
-
constructor(options = { waitInterval: 50, maxWorkers: 8, maxQueueDepth: 1e3 }) {
|
|
499
|
-
this.options = options;
|
|
500
|
-
this.workers = [];
|
|
501
|
-
this.queue = [];
|
|
502
|
-
}
|
|
503
|
-
/**
|
|
504
|
-
* Evaluates a JS function in process.
|
|
505
|
-
* @param {EvalRequest} request - the eval request
|
|
506
|
-
* @returns {Promise} a promise to the result
|
|
507
|
-
*/
|
|
508
|
-
async evalDangerously(request) {
|
|
509
|
-
return new Promise((resolve, reject) => {
|
|
510
|
-
try {
|
|
511
|
-
if (request.verbose) {
|
|
512
|
-
console.log(request.code);
|
|
513
|
-
}
|
|
514
|
-
const start = (/* @__PURE__ */ new Date()).getTime();
|
|
515
|
-
let result = null;
|
|
516
|
-
if (!request.templateLogic) {
|
|
517
|
-
const fun = new Function(...["dayjs", "jp", ...request.argumentNames], request.code);
|
|
518
|
-
result = fun(...[dayjs, jp, ...request.arguments]);
|
|
519
|
-
const end = (/* @__PURE__ */ new Date()).getTime();
|
|
520
|
-
resolve({ result, elapsed: end - start });
|
|
521
|
-
} else {
|
|
522
|
-
const dataUri = "data:text/javascript;base64," + btoa(request.code);
|
|
523
|
-
dynamicImport(dataUri).then((templateLogicConstructor) => {
|
|
524
|
-
const instance = new templateLogicConstructor();
|
|
525
|
-
if (!request.functionName) {
|
|
526
|
-
throw new Error("No function name specified for template logic");
|
|
527
|
-
}
|
|
528
|
-
result = instance[request.functionName](...request.arguments);
|
|
529
|
-
const end = (/* @__PURE__ */ new Date()).getTime();
|
|
530
|
-
resolve({ result, elapsed: end - start });
|
|
531
|
-
}).catch((err) => {
|
|
532
|
-
console.error(err);
|
|
533
|
-
if (err instanceof Error) {
|
|
534
|
-
reject({
|
|
535
|
-
message: err.message,
|
|
536
|
-
stack: err.stack
|
|
537
|
-
});
|
|
538
|
-
} else {
|
|
539
|
-
reject({
|
|
540
|
-
message: String(err)
|
|
541
|
-
});
|
|
542
|
-
}
|
|
543
|
-
});
|
|
544
|
-
}
|
|
545
|
-
} catch (err) {
|
|
546
|
-
console.error(err);
|
|
547
|
-
if (err instanceof Error) {
|
|
548
|
-
reject({
|
|
549
|
-
message: err.message,
|
|
550
|
-
stack: err.stack
|
|
551
|
-
});
|
|
552
|
-
} else {
|
|
553
|
-
reject({
|
|
554
|
-
message: String(err)
|
|
555
|
-
});
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
});
|
|
559
|
-
}
|
|
560
|
-
/**
|
|
561
|
-
* Evaluates a JS function using a node child process
|
|
562
|
-
* @param {EvalRequest} request the eval request
|
|
563
|
-
* @param {EvalOptions} options the options for the request
|
|
564
|
-
* @returns {Promise<EvalResponse>} the async result
|
|
565
|
-
*/
|
|
566
|
-
async evalChildProcess(request, options = { timeout: 1e4 }) {
|
|
567
|
-
return new Promise((resolve, reject) => {
|
|
568
|
-
const now = (/* @__PURE__ */ new Date()).getTime();
|
|
569
|
-
const workItem = {
|
|
570
|
-
startTime: now,
|
|
571
|
-
expireTime: now + options.timeout,
|
|
572
|
-
request,
|
|
573
|
-
resolve,
|
|
574
|
-
reject
|
|
575
|
-
};
|
|
576
|
-
if (this.queue.length >= this.options.maxQueueDepth) {
|
|
577
|
-
reject({ maxQueueDepthExceeded: true, elapsed: 0 });
|
|
578
|
-
return;
|
|
579
|
-
}
|
|
580
|
-
this.queue.push(workItem);
|
|
581
|
-
this.processQueue(options);
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
processQueue(options) {
|
|
585
|
-
const now = (/* @__PURE__ */ new Date()).getTime();
|
|
586
|
-
const notExpired = this.queue.filter((w) => now < w.expireTime);
|
|
587
|
-
const expired = this.queue.filter((w) => now >= w.expireTime);
|
|
588
|
-
this.queue = notExpired;
|
|
589
|
-
expired.forEach((w) => {
|
|
590
|
-
w.reject({ timeout: true, starvation: true, elapsed: now - w.startTime });
|
|
591
|
-
});
|
|
592
|
-
if (this.workers.length < this.options.maxWorkers) {
|
|
593
|
-
const next = this.queue.shift();
|
|
594
|
-
if (next) {
|
|
595
|
-
this.doWork(next, options).then((result) => next.resolve(result)).catch((error) => next.reject(error));
|
|
596
|
-
}
|
|
597
|
-
} else {
|
|
598
|
-
sleep(this.options.waitInterval).then(() => {
|
|
599
|
-
this.processQueue(options);
|
|
600
|
-
});
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
getWorkerPath() {
|
|
604
|
-
try {
|
|
605
|
-
const thisPath = require.resolve("@accordproject/template-engine");
|
|
606
|
-
return path.join(thisPath, "..", "worker.js");
|
|
607
|
-
} catch (err) {
|
|
608
|
-
return path.join(__dirname, "..", "dist", "worker.js");
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
doWork(work, options) {
|
|
612
|
-
return new Promise((resolve, reject) => {
|
|
613
|
-
const start = (/* @__PURE__ */ new Date()).getTime();
|
|
614
|
-
if (!child_process.fork) {
|
|
615
|
-
reject({ message: "Cannot use evalChildProcess because child_process.fork is not defined." });
|
|
616
|
-
}
|
|
617
|
-
const workerPath = this.getWorkerPath();
|
|
618
|
-
const worker = child_process.fork(workerPath, { timeout: options.timeout, env: {} });
|
|
619
|
-
if (worker.pid === void 0 || worker.pid === null) {
|
|
620
|
-
throw new Error("Failed to fork child process");
|
|
621
|
-
}
|
|
622
|
-
this.workers.push(worker);
|
|
623
|
-
work.pid = worker.pid;
|
|
624
|
-
let result;
|
|
625
|
-
worker.on("error", (err) => {
|
|
626
|
-
this.workers = this.workers.filter((w) => w.pid !== worker.pid);
|
|
627
|
-
const end = (/* @__PURE__ */ new Date()).getTime();
|
|
628
|
-
if (err instanceof Error) {
|
|
629
|
-
reject({
|
|
630
|
-
message: err.message,
|
|
631
|
-
stack: err.stack,
|
|
632
|
-
elapsed: end - start
|
|
633
|
-
});
|
|
634
|
-
} else {
|
|
635
|
-
reject({
|
|
636
|
-
message: String(err),
|
|
637
|
-
elapsed: end - start
|
|
638
|
-
});
|
|
639
|
-
}
|
|
640
|
-
});
|
|
641
|
-
worker.on("message", (msg) => {
|
|
642
|
-
result = msg;
|
|
643
|
-
});
|
|
644
|
-
worker.on("exit", (code) => {
|
|
645
|
-
if (code === null) {
|
|
646
|
-
this.workers = this.workers.filter((w) => w.pid !== worker.pid);
|
|
647
|
-
const end = (/* @__PURE__ */ new Date()).getTime();
|
|
648
|
-
reject({ timeout: true, elapsed: end - start });
|
|
649
|
-
} else if (code === 0 && result) {
|
|
650
|
-
this.workers = this.workers.filter((w) => w.pid !== worker.pid);
|
|
651
|
-
const end = (/* @__PURE__ */ new Date()).getTime();
|
|
652
|
-
resolve({ ...result, elapsed: end - start });
|
|
653
|
-
} else {
|
|
654
|
-
this.workers = this.workers.filter((w) => w.pid !== worker.pid);
|
|
655
|
-
const end = (/* @__PURE__ */ new Date()).getTime();
|
|
656
|
-
reject({ code, result, elapsed: end - start });
|
|
657
|
-
}
|
|
658
|
-
});
|
|
659
|
-
worker.send(work.request);
|
|
660
|
-
});
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
function checkCode(code) {
|
|
665
|
-
if (code.type !== CodeType.ES_2020) {
|
|
666
|
-
throw new Error(`Cannot run ${code.contents} as it is not ES_2020 JavaScript.`);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
const javaScriptEvaluator = browserOrNode.isBrowser ? new JavaScriptEvaluator() : new JavaScriptEvaluator({
|
|
670
|
-
maxWorkers: process.env.MAX_WORKERS ? Number.parseInt(process.env.MAX_WORKERS) : os.availableParallelism(),
|
|
671
|
-
// how many child processes
|
|
672
|
-
waitInterval: process.env.WAIT_INTERVAL ? Number.parseInt(process.env.WAIT_INTERVAL) : 50,
|
|
673
|
-
// how long to wait before rescheduling work
|
|
674
|
-
maxQueueDepth: process.env.MAX_QUEUE_DEPTH ? Number.parseInt(process.env.MAX_QUEUE_DEPTH) : 1e3
|
|
675
|
-
// max requests to queue
|
|
676
|
-
});
|
|
677
|
-
const TEMPLATEMARK_ROOT_NODES = [
|
|
678
|
-
"org.accordproject.templatemark@0.5.0.ClauseDefinition",
|
|
679
|
-
"org.accordproject.templatemark@0.5.0.ContractDefinition"
|
|
680
|
-
];
|
|
681
|
-
const DOCUMENT_ROOT = "org.accordproject.commonmark@0.5.0.Document";
|
|
682
|
-
async function evaluateJavaScript(clauseLibrary, data, fn, options) {
|
|
683
|
-
if (options?.disableJavaScriptEvaluation) {
|
|
684
|
-
throw new Error("JavaScript evaluation is disabled.");
|
|
685
|
-
}
|
|
686
|
-
if (!data || !fn) {
|
|
687
|
-
throw new Error(`Cannot evaluate JS ${fn} against ${data}`);
|
|
688
|
-
}
|
|
689
|
-
const functionArgNames = new Array();
|
|
690
|
-
functionArgNames.push("data");
|
|
691
|
-
functionArgNames.push("library");
|
|
692
|
-
functionArgNames.push("options");
|
|
693
|
-
const functionArgValues = new Array();
|
|
694
|
-
functionArgValues.push(data);
|
|
695
|
-
functionArgValues.push(clauseLibrary);
|
|
696
|
-
functionArgValues.push(options);
|
|
697
|
-
const expression = fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));
|
|
698
|
-
if (expression.trim().length === 0) {
|
|
699
|
-
throw new Error("Empty expression");
|
|
700
|
-
}
|
|
701
|
-
try {
|
|
702
|
-
const request = { code: expression, argumentNames: functionArgNames, arguments: functionArgValues };
|
|
703
|
-
if (options?.childProcessJavaScriptEvaluation) {
|
|
704
|
-
if (browserOrNode.isBrowser) {
|
|
705
|
-
throw new Error("Child process evaluation is not supported inside web browser");
|
|
706
|
-
}
|
|
707
|
-
const evalOptions = options?.timeout ? { timeout: options.timeout } : void 0;
|
|
708
|
-
const r = await javaScriptEvaluator.evalChildProcess(request, evalOptions);
|
|
709
|
-
return r;
|
|
710
|
-
} else {
|
|
711
|
-
const r = await javaScriptEvaluator.evalDangerously(request);
|
|
712
|
-
return r;
|
|
713
|
-
}
|
|
714
|
-
} catch (err) {
|
|
715
|
-
throw new Error(`Caught error ${JSON.stringify(err)} evaluating ${expression} with arguments ${JSON.stringify(functionArgValues)}`);
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
function getJsonPath(rootData, currentNode, paths) {
|
|
719
|
-
if (!currentNode) {
|
|
720
|
-
throw new Error("Node must be supplied");
|
|
721
|
-
}
|
|
722
|
-
if (!currentNode.name) {
|
|
723
|
-
throw new Error(`Node must have a name: ${JSON.stringify(currentNode)}`);
|
|
724
|
-
}
|
|
725
|
-
if (currentNode.name.indexOf(".") >= 0) {
|
|
726
|
-
throw new Error(`Invalid name property ${currentNode.name}`);
|
|
727
|
-
}
|
|
728
|
-
if (!paths || !paths.length || paths.length < 1) {
|
|
729
|
-
throw new Error("Paths must be supplied");
|
|
730
|
-
}
|
|
731
|
-
const withPath = [];
|
|
732
|
-
for (let n = 1; n < paths.length; n++) {
|
|
733
|
-
const sub = paths.slice(0, n);
|
|
734
|
-
const obj = traverse.get(rootData, sub);
|
|
735
|
-
if (obj && obj.$class) {
|
|
736
|
-
if (NAVIGATION_NODES.indexOf(obj.$class) >= 0) {
|
|
737
|
-
if (obj.name !== "top") {
|
|
738
|
-
withPath.push(`['${obj.name}']`);
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
}
|
|
743
|
-
if (currentNode.name !== "this" && currentNode.name !== "top") {
|
|
744
|
-
withPath.push(`['${currentNode.name}']`);
|
|
745
|
-
}
|
|
746
|
-
return withPath.length > 0 ? `$${withPath.join("")}` : "$";
|
|
747
|
-
}
|
|
748
|
-
async function evaluateUserCode(clauseLibrary, templateMark, data, options) {
|
|
749
|
-
const result = {};
|
|
750
|
-
const paths = traverse(templateMark).paths();
|
|
751
|
-
for (let n = 0; n < paths.length; n++) {
|
|
752
|
-
const path = paths[n];
|
|
753
|
-
const context = traverse(templateMark).get(path);
|
|
754
|
-
if (typeof context === "object" && context.$class && typeof context.$class === "string") {
|
|
755
|
-
const nodeClass = context.$class;
|
|
756
|
-
if (FORMULA_DEFINITION_RE.test(nodeClass)) {
|
|
757
|
-
if (context.code) {
|
|
758
|
-
checkCode(context.code);
|
|
759
|
-
const evalResponse = await evaluateJavaScript(clauseLibrary, data, context.code.contents, options);
|
|
760
|
-
result[path.join("/")] = JSON.stringify(evalResponse.result);
|
|
761
|
-
} else {
|
|
762
|
-
throw new Error("Formula node is missing code.");
|
|
763
|
-
}
|
|
764
|
-
} else if (CONDITIONAL_DEFINITION_RE.test(nodeClass) || CLAUSE_DEFINITION_RE.test(nodeClass)) {
|
|
765
|
-
if (context.condition) {
|
|
766
|
-
checkCode(context.condition);
|
|
767
|
-
const evalResponse = await evaluateJavaScript(clauseLibrary, data, context.condition.contents, options);
|
|
768
|
-
result[path.join("/")] = JSON.stringify(evalResponse.result);
|
|
769
|
-
}
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
return result;
|
|
774
|
-
}
|
|
775
|
-
async function generateOptionalBlocks(modelManager, clauseLibrary, templateMark, data, options) {
|
|
776
|
-
const result = {};
|
|
777
|
-
const paths = traverse(templateMark).paths();
|
|
778
|
-
for (let n = 0; n < paths.length; n++) {
|
|
779
|
-
const thisPath = paths[n];
|
|
780
|
-
const context = traverse(templateMark).get(thisPath);
|
|
781
|
-
if (typeof context === "object" && context.$class && typeof context.$class === "string") {
|
|
782
|
-
const nodeClass = context.$class;
|
|
783
|
-
if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
|
|
784
|
-
const path = getJsonPath(templateMark, context, thisPath);
|
|
785
|
-
const variableValues = jp.query(data, path, 1);
|
|
786
|
-
if (variableValues.length > 0) {
|
|
787
|
-
const optionalPropertyValue = variableValues[0];
|
|
788
|
-
if (context.whenSome && context.whenSome.length > 0) {
|
|
789
|
-
const whenSomeParagraph = {
|
|
790
|
-
$class: "org.accordproject.commonmark@0.5.0.Paragraph",
|
|
791
|
-
nodes: context.whenSome
|
|
792
|
-
};
|
|
793
|
-
const subResult = await generateAgreement(modelManager, clauseLibrary, whenSomeParagraph, optionalPropertyValue, options);
|
|
794
|
-
result[thisPath.join("/")] = subResult.nodes ? subResult.nodes : [];
|
|
795
|
-
} else {
|
|
796
|
-
result[thisPath.join("/")] = [];
|
|
797
|
-
}
|
|
798
|
-
}
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
}
|
|
802
|
-
return result;
|
|
803
|
-
}
|
|
804
|
-
async function generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, nodeRegExp, childNodeClass, options) {
|
|
805
|
-
const result = {};
|
|
806
|
-
const paths = traverse(templateMark).paths();
|
|
807
|
-
for (let n = 0; n < paths.length; n++) {
|
|
808
|
-
const thisPath = paths[n];
|
|
809
|
-
const context = traverse(templateMark).get(thisPath);
|
|
810
|
-
if (typeof context === "object" && context.$class && typeof context.$class === "string") {
|
|
811
|
-
const nodeClass = context.$class;
|
|
812
|
-
if (nodeRegExp.test(nodeClass)) {
|
|
813
|
-
const path = getJsonPath(templateMark, context, thisPath);
|
|
814
|
-
const variableValues = jp.query(data, path, 1);
|
|
815
|
-
if (variableValues.length === 0) {
|
|
816
|
-
throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
|
|
817
|
-
} else {
|
|
818
|
-
const arrayData = variableValues[0];
|
|
819
|
-
if (!Array.isArray(arrayData)) {
|
|
820
|
-
throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
|
|
821
|
-
} else {
|
|
822
|
-
const firstChild = context.nodes[0];
|
|
823
|
-
const hasListWrapper = firstChild && firstChild.$class === `${markdownCommon.CommonMarkModel.NAMESPACE}.List` && Array.isArray(firstChild.nodes) && firstChild.nodes.length > 0;
|
|
824
|
-
const itemTemplate = hasListWrapper ? firstChild.nodes[0] : firstChild;
|
|
825
|
-
const nodes = [];
|
|
826
|
-
for (let n2 = 0; n2 < arrayData.length; n2++) {
|
|
827
|
-
const arrayItem = arrayData[n2];
|
|
828
|
-
const subResult = await generateAgreement(modelManager, clauseLibrary, itemTemplate, arrayItem, options);
|
|
829
|
-
const childNodes = hasListWrapper ? subResult.nodes ? subResult.nodes : [] : [subResult];
|
|
830
|
-
nodes.push({
|
|
831
|
-
$class: childNodeClass,
|
|
832
|
-
nodes: childNodes
|
|
833
|
-
});
|
|
834
|
-
}
|
|
835
|
-
result[thisPath.join("/")] = nodes;
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
return result;
|
|
842
|
-
}
|
|
843
|
-
async function generateAgreement(modelManager, clauseLibrary, templateMark, data, options) {
|
|
844
|
-
const introspector = new concertoCore.Introspector(modelManager);
|
|
845
|
-
const userCodeResults = await evaluateUserCode(clauseLibrary, templateMark, data, options);
|
|
846
|
-
const listBlockResults = await generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, LISTBLOCK_DEFINITION_RE, `${markdownCommon.CommonMarkModel.NAMESPACE}.Item`, options);
|
|
847
|
-
const foreachBlockResults = await generateRecursiveBlocks(modelManager, clauseLibrary, templateMark, data, FOREACH_DEFINITION_RE, `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`, options);
|
|
848
|
-
const optionalBlockResults = await generateOptionalBlocks(modelManager, clauseLibrary, templateMark, data, options);
|
|
849
|
-
return traverse(templateMark).map(function(context) {
|
|
850
|
-
let stopHere = false;
|
|
851
|
-
if (typeof context === "object" && context.$class && typeof context.$class === "string") {
|
|
852
|
-
const nodeClass = context.$class;
|
|
853
|
-
const match = nodeClass.match(TEMPLATEMARK_RE);
|
|
854
|
-
if (match && match.length > 1) {
|
|
855
|
-
context.$class = `${markdownCommon.CiceroMarkModel.NAMESPACE}.${match[3]}`;
|
|
856
|
-
}
|
|
857
|
-
if (CONTRACT_DEFINITION_RE.test(nodeClass)) {
|
|
858
|
-
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`;
|
|
859
|
-
delete context.name;
|
|
860
|
-
delete context.elementType;
|
|
861
|
-
}
|
|
862
|
-
if (WITH_DEFINITION_RE.test(nodeClass)) {
|
|
863
|
-
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`;
|
|
864
|
-
delete context.name;
|
|
865
|
-
delete context.elementType;
|
|
866
|
-
} else if (FORMULA_DEFINITION_RE.test(nodeClass)) {
|
|
867
|
-
if (context.code) {
|
|
868
|
-
const result = userCodeResults[this.path.join("/")];
|
|
869
|
-
if (result === null) {
|
|
870
|
-
context.value = "<null>";
|
|
871
|
-
} else if (typeof result === "string") {
|
|
872
|
-
context.value = result;
|
|
873
|
-
} else {
|
|
874
|
-
context.value = JSON.stringify(result);
|
|
875
|
-
}
|
|
876
|
-
delete context.code;
|
|
877
|
-
} else {
|
|
878
|
-
throw new Error("Formula node is missing code.");
|
|
879
|
-
}
|
|
880
|
-
} else if (LISTBLOCK_DEFINITION_RE.test(nodeClass)) {
|
|
881
|
-
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.List`;
|
|
882
|
-
delete context.elementType;
|
|
883
|
-
delete context.name;
|
|
884
|
-
context.nodes = listBlockResults[this.path.join("/")];
|
|
885
|
-
stopHere = true;
|
|
886
|
-
} else if (JOIN_DEFINITION_RE.test(nodeClass)) {
|
|
887
|
-
const path = getJsonPath(templateMark, context, this.path);
|
|
888
|
-
const variableValues = jp.query(data, path, 1);
|
|
889
|
-
if (variableValues.length === 0) {
|
|
890
|
-
throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
|
|
891
|
-
} else {
|
|
892
|
-
const arrayData = variableValues[0];
|
|
893
|
-
if (!Array.isArray(arrayData)) {
|
|
894
|
-
throw new Error(`Values found for path '${path}' in data ${data} is not an array: ${arrayData}.`);
|
|
895
|
-
} else {
|
|
896
|
-
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Text`;
|
|
897
|
-
const drafter = getDrafter(context.elementType);
|
|
898
|
-
context.text = joinList(arrayData.map((arrayItem) => {
|
|
899
|
-
return drafter ? drafter(arrayItem, context.format) : arrayItem;
|
|
900
|
-
}), context, options);
|
|
901
|
-
delete context.elementType;
|
|
902
|
-
delete context.name;
|
|
903
|
-
delete context.separator;
|
|
904
|
-
delete context.locale;
|
|
905
|
-
delete context.type;
|
|
906
|
-
delete context.style;
|
|
907
|
-
delete context.nodes;
|
|
908
|
-
stopHere = true;
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
} else if (FOREACH_DEFINITION_RE.test(nodeClass)) {
|
|
912
|
-
context.$class = `${markdownCommon.CommonMarkModel.NAMESPACE}.Foreach`;
|
|
913
|
-
delete context.elementType;
|
|
914
|
-
delete context.name;
|
|
915
|
-
context.nodes = foreachBlockResults[this.path.join("/")];
|
|
916
|
-
stopHere = true;
|
|
917
|
-
} else if (VARIABLE_DEFINITION_RE.test(nodeClass) || ENUM_VARIABLE_DEFINITION_RE.test(nodeClass) || FORMATTED_VARIABLE_DEFINITION_RE.test(nodeClass)) {
|
|
918
|
-
if (typeof data === "object") {
|
|
919
|
-
const path = getJsonPath(templateMark, context, this.path);
|
|
920
|
-
const variableValues = jp.query(data, path, 1);
|
|
921
|
-
if (variableValues.length === 0) {
|
|
922
|
-
throw new Error(`No values found for path '${path}' in data ${JSON.stringify(data)}.`);
|
|
923
|
-
} else {
|
|
924
|
-
const variableValue = variableValues[0];
|
|
925
|
-
const type = concertoCore.ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
|
|
926
|
-
const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
|
|
927
|
-
context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
|
|
928
|
-
}
|
|
929
|
-
} else {
|
|
930
|
-
const variableValue = data;
|
|
931
|
-
const type = concertoCore.ModelUtil.isPrimitiveType(context.elementType) ? null : introspector.getClassDeclaration(context.elementType);
|
|
932
|
-
const drafter = getDrafter(type && type.isEnum() ? "String" : context.elementType);
|
|
933
|
-
context.value = drafter ? drafter(variableValue, context.format) : JSON.stringify(variableValue);
|
|
934
|
-
}
|
|
935
|
-
} else if (CONDITIONAL_DEFINITION_RE.test(nodeClass)) {
|
|
936
|
-
if (context.condition) {
|
|
937
|
-
const key = this.path.join("/");
|
|
938
|
-
const resultStr = userCodeResults[key];
|
|
939
|
-
if (resultStr === void 0 || resultStr === null) {
|
|
940
|
-
context.isTrue = false;
|
|
941
|
-
} else {
|
|
942
|
-
try {
|
|
943
|
-
context.isTrue = !!JSON.parse(resultStr);
|
|
944
|
-
} catch (err) {
|
|
945
|
-
throw new Error(`Invalid JSON boolean result for condition '${key}': ${String(err)}`);
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
} else {
|
|
949
|
-
const path = getJsonPath(templateMark, context, this.path);
|
|
950
|
-
const variableValues = jp.query(data, path, 1);
|
|
951
|
-
if (variableValues && variableValues.length) {
|
|
952
|
-
if (variableValues.length === 1) {
|
|
953
|
-
context.isTrue = !!variableValues[0];
|
|
954
|
-
} else {
|
|
955
|
-
throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
|
|
956
|
-
}
|
|
957
|
-
} else {
|
|
958
|
-
context.isTrue = false;
|
|
959
|
-
}
|
|
960
|
-
}
|
|
961
|
-
context.nodes = context.isTrue ? context.whenTrue : context.whenFalse;
|
|
962
|
-
delete context.condition;
|
|
963
|
-
delete context.dependencies;
|
|
964
|
-
delete context.functionName;
|
|
965
|
-
} else if (CLAUSE_DEFINITION_RE.test(nodeClass)) {
|
|
966
|
-
const path = getJsonPath(templateMark, context, this.path);
|
|
967
|
-
const variableValues = jp.query(data, path, 1);
|
|
968
|
-
if (context.condition) {
|
|
969
|
-
checkCode(context.condition);
|
|
970
|
-
const key = this.path.join("/");
|
|
971
|
-
const resultStr = userCodeResults[key];
|
|
972
|
-
let result = false;
|
|
973
|
-
if (resultStr === void 0 || resultStr === null) {
|
|
974
|
-
result = false;
|
|
975
|
-
} else {
|
|
976
|
-
try {
|
|
977
|
-
result = !!JSON.parse(resultStr);
|
|
978
|
-
} catch (err) {
|
|
979
|
-
throw new Error(`Invalid JSON boolean result for condition '${key}': ${String(err)}`);
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
if (!result) {
|
|
983
|
-
delete context.nodes;
|
|
984
|
-
stopHere = true;
|
|
985
|
-
}
|
|
986
|
-
} else if (context.name !== "top" && (variableValues.length === 0 || variableValues[0] === void 0 || variableValues[0] === null)) {
|
|
987
|
-
delete context.nodes;
|
|
988
|
-
stopHere = true;
|
|
989
|
-
}
|
|
990
|
-
delete context.condition;
|
|
991
|
-
delete context.functionName;
|
|
992
|
-
} else if (OPTIONAL_DEFINITION_RE.test(nodeClass)) {
|
|
993
|
-
const path = getJsonPath(templateMark, context, this.path);
|
|
994
|
-
const variableValues = jp.query(data, path, 1);
|
|
995
|
-
if (variableValues && variableValues.length) {
|
|
996
|
-
if (variableValues.length === 1) {
|
|
997
|
-
context.hasSome = true;
|
|
998
|
-
context.whenNone = [];
|
|
999
|
-
if (optionalBlockResults[this.path.join("/")]) {
|
|
1000
|
-
context.nodes = optionalBlockResults[this.path.join("/")];
|
|
1001
|
-
context.whenSome = [];
|
|
1002
|
-
stopHere = true;
|
|
1003
|
-
} else {
|
|
1004
|
-
context.nodes = context.whenSome;
|
|
1005
|
-
}
|
|
1006
|
-
} else {
|
|
1007
|
-
throw new Error(`Multiple values found for path '${path}' in data ${data}.`);
|
|
1008
|
-
}
|
|
1009
|
-
} else {
|
|
1010
|
-
context.hasSome = false;
|
|
1011
|
-
context.whenSome = [];
|
|
1012
|
-
context.nodes = context.whenNone;
|
|
1013
|
-
}
|
|
1014
|
-
}
|
|
1015
|
-
}
|
|
1016
|
-
this.update(context, stopHere);
|
|
1017
|
-
});
|
|
1018
|
-
}
|
|
1019
|
-
class TemplateMarkInterpreter {
|
|
1020
|
-
constructor(modelManager, clauseLibrary, templateConceptFqn) {
|
|
1021
|
-
this.modelManager = modelManager;
|
|
1022
|
-
this.clauseLibrary = clauseLibrary;
|
|
1023
|
-
this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
|
|
1024
|
-
}
|
|
1025
|
-
/**
|
|
1026
|
-
* Checks that a TemplateMark JSON document is valid with respect to the
|
|
1027
|
-
* TemplateMark model, as well as the template model.
|
|
1028
|
-
*
|
|
1029
|
-
* Checks:
|
|
1030
|
-
* 1. Variable names are valid properties in the template model
|
|
1031
|
-
* 2. Optional properties have guards
|
|
1032
|
-
* @param {*} templateMark the TemplateMark JSON object
|
|
1033
|
-
* @returns {*} TemplateMark JSON that has been typed checked and has type metadata added
|
|
1034
|
-
* @throws {Error} if the templateMark document is invalid
|
|
1035
|
-
*/
|
|
1036
|
-
checkTypes(templateMark) {
|
|
1037
|
-
const modelManager = new concertoCore.ModelManager();
|
|
1038
|
-
modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
|
|
1039
|
-
modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
|
|
1040
|
-
modelManager.addCTOModel(markdownCommon.TemplateMarkModel.MODEL, "templatemark.cto");
|
|
1041
|
-
const factory = new concertoCore.Factory(modelManager);
|
|
1042
|
-
const serializer = new concertoCore.Serializer(factory, modelManager, {});
|
|
1043
|
-
try {
|
|
1044
|
-
serializer.fromJSON(templateMark, {});
|
|
1045
|
-
} catch (err) {
|
|
1046
|
-
throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(templateMark, null, 2)}`);
|
|
1047
|
-
}
|
|
1048
|
-
const errors = [];
|
|
1049
|
-
const templateClass = this.templateClass;
|
|
1050
|
-
const guardBlockPaths = /* @__PURE__ */ new Map();
|
|
1051
|
-
traverse(templateMark).forEach(function(node) {
|
|
1052
|
-
if (!node || typeof node !== "object" || !node.$class) return;
|
|
1053
|
-
const currentPath = this.path.join("/");
|
|
1054
|
-
if (OPTIONAL_DEFINITION_RE.test(node.$class) || CONDITIONAL_DEFINITION_RE.test(node.$class) || WITH_DEFINITION_RE.test(node.$class)) {
|
|
1055
|
-
guardBlockPaths.set(node.name, currentPath);
|
|
1056
|
-
}
|
|
1057
|
-
if (VARIABLE_DEFINITION_RE.test(node.$class) || ENUM_VARIABLE_DEFINITION_RE.test(node.$class) || FORMATTED_VARIABLE_DEFINITION_RE.test(node.$class)) {
|
|
1058
|
-
const propName = node.name;
|
|
1059
|
-
if (propName && propName !== "this") {
|
|
1060
|
-
try {
|
|
1061
|
-
const property = templateClass.getProperty(propName);
|
|
1062
|
-
if (property && property.isOptional()) {
|
|
1063
|
-
const guardPath = guardBlockPaths.get(propName);
|
|
1064
|
-
const isGuarded = guardPath !== void 0 && (currentPath === guardPath || currentPath.startsWith(guardPath + "/"));
|
|
1065
|
-
if (!isGuarded) {
|
|
1066
|
-
errors.push({
|
|
1067
|
-
propertyName: propName,
|
|
1068
|
-
message: `Optional property '${propName}' is used without a guard. Wrap it in {{#optional ${propName}}}...{{/optional}} or {{#if ${propName}}}...{{/if}}.`
|
|
1069
|
-
});
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
} catch {
|
|
1073
|
-
}
|
|
1074
|
-
}
|
|
1075
|
-
}
|
|
1076
|
-
});
|
|
1077
|
-
if (errors.length > 0) {
|
|
1078
|
-
const errorMessage = `Optional properties used without guards: ${errors.map((e) => e.propertyName).join(", ")}`;
|
|
1079
|
-
const error = new Error(errorMessage);
|
|
1080
|
-
error.errors = errors;
|
|
1081
|
-
throw error;
|
|
1082
|
-
}
|
|
1083
|
-
return templateMark;
|
|
1084
|
-
}
|
|
1085
|
-
/**
|
|
1086
|
-
* Compiles the code nodes containing TS to code nodes containing JS.
|
|
1087
|
-
* @param {*} templateMark the TemplateMark JSON object
|
|
1088
|
-
* @returns {*} TemplateMark JSON with JS nodes
|
|
1089
|
-
* @throws {Error} if the templateMark document is invalid
|
|
1090
|
-
*/
|
|
1091
|
-
async compileTypeScriptToJavaScript(templateMark) {
|
|
1092
|
-
const clazz = templateMark.$class;
|
|
1093
|
-
if (clazz !== DOCUMENT_ROOT) {
|
|
1094
|
-
throw new Error(`JSON is not CommonMark. $class is '${clazz}'. ${JSON.stringify(templateMark, null, 2)}`);
|
|
1095
|
-
}
|
|
1096
|
-
if (!templateMark.nodes || !templateMark.nodes.length || templateMark.nodes.length < 1) {
|
|
1097
|
-
throw new Error(`CommonMark does not have nodes: ${JSON.stringify(templateMark, null, 2)}`);
|
|
1098
|
-
}
|
|
1099
|
-
const firstChild = templateMark.nodes[0];
|
|
1100
|
-
const firstChildClazz = firstChild.$class;
|
|
1101
|
-
if (!TEMPLATEMARK_ROOT_NODES.includes(firstChildClazz)) {
|
|
1102
|
-
throw new Error(`First child is not templatemark. $class is '${firstChildClazz}'. ${JSON.stringify(templateMark, null, 2)}`);
|
|
1103
|
-
}
|
|
1104
|
-
const templateConcept = firstChild.elementType;
|
|
1105
|
-
if (!templateConcept) {
|
|
1106
|
-
throw new Error(`First child is not typed: ${JSON.stringify(templateMark, null, 2)}`);
|
|
1107
|
-
}
|
|
1108
|
-
if (firstChild.name !== "top") {
|
|
1109
|
-
throw new Error('First child is not named "top"!');
|
|
1110
|
-
}
|
|
1111
|
-
const compiler = new TemplateMarkToJavaScriptCompiler(this.modelManager, templateConcept);
|
|
1112
|
-
await compiler.initialize();
|
|
1113
|
-
return compiler.compile(templateMark);
|
|
1114
|
-
}
|
|
1115
|
-
validateCiceroMark(ciceroMark) {
|
|
1116
|
-
const modelManager = new concertoCore.ModelManager();
|
|
1117
|
-
modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
|
|
1118
|
-
modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
|
|
1119
|
-
modelManager.addCTOModel(markdownCommon.CiceroMarkModel.MODEL, "ciceromark.cto");
|
|
1120
|
-
const factory = new concertoCore.Factory(modelManager);
|
|
1121
|
-
const serializer = new concertoCore.Serializer(factory, modelManager, {});
|
|
1122
|
-
try {
|
|
1123
|
-
return serializer.fromJSON(ciceroMark, {});
|
|
1124
|
-
} catch (err) {
|
|
1125
|
-
throw new Error(`Generated invalid agreement: ${err}: ${JSON.stringify(ciceroMark, null, 2)}`);
|
|
1126
|
-
}
|
|
1127
|
-
}
|
|
1128
|
-
async generate(templateMark, data, options) {
|
|
1129
|
-
const factory = new concertoCore.Factory(this.modelManager);
|
|
1130
|
-
const serializer = new concertoCore.Serializer(factory, this.modelManager, {});
|
|
1131
|
-
const templateData = serializer.fromJSON(data, {});
|
|
1132
|
-
if (templateData.getFullyQualifiedType() !== this.templateClass.getFullyQualifiedName()) {
|
|
1133
|
-
throw new Error(`Template data must be of type '${this.templateClass.getFullyQualifiedName()}'.`);
|
|
1134
|
-
}
|
|
1135
|
-
const typedTemplateMark = this.checkTypes(templateMark);
|
|
1136
|
-
const jsTemplateMark = await this.compileTypeScriptToJavaScript(typedTemplateMark);
|
|
1137
|
-
const ciceroMark = await generateAgreement(this.modelManager, this.clauseLibrary, jsTemplateMark, data, options);
|
|
1138
|
-
return this.validateCiceroMark(ciceroMark);
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
|
|
1142
|
-
class TemplateArchiveProcessor {
|
|
1143
|
-
/**
|
|
1144
|
-
* Creates a template archive processor
|
|
1145
|
-
* @param {Template} template - the template to be used by the processor
|
|
1146
|
-
*/
|
|
1147
|
-
constructor(template) {
|
|
1148
|
-
this.template = template;
|
|
1149
|
-
}
|
|
1150
|
-
/**
|
|
1151
|
-
* Drafts a template by merging it with data
|
|
1152
|
-
* @param {any} data the data to merge with the template
|
|
1153
|
-
* @param {string} format the output format
|
|
1154
|
-
* @param {any} options merge options
|
|
1155
|
-
* @param {[string]} currentTime the current value for 'now'
|
|
1156
|
-
* @returns {Promise} the drafted content
|
|
1157
|
-
*/
|
|
1158
|
-
async draft(data, format, options, currentTime) {
|
|
1159
|
-
const metadata = this.template.getMetadata();
|
|
1160
|
-
const templateKind = metadata.getTemplateType() !== 0 ? "clause" : "contract";
|
|
1161
|
-
const modelManager = this.template.getModelManager();
|
|
1162
|
-
const engine = new TemplateMarkInterpreter(modelManager, {});
|
|
1163
|
-
const templateMarkTransformer = new markdownTemplate.TemplateMarkTransformer();
|
|
1164
|
-
const templateMarkDom = templateMarkTransformer.fromMarkdownTemplate(
|
|
1165
|
-
{ content: this.template.getTemplate() },
|
|
1166
|
-
modelManager,
|
|
1167
|
-
templateKind,
|
|
1168
|
-
{ options }
|
|
1169
|
-
);
|
|
1170
|
-
const now = currentTime ? currentTime : (/* @__PURE__ */ new Date()).toISOString();
|
|
1171
|
-
const ciceroMark = await engine.generate(templateMarkDom, data, { now });
|
|
1172
|
-
const result = markdownTransform.transform(ciceroMark.toJSON(), "ciceromark", ["ciceromark_unquoted", format], null, options);
|
|
1173
|
-
return result;
|
|
1174
|
-
}
|
|
1175
|
-
/**
|
|
1176
|
-
* Compile the logic of a template
|
|
1177
|
-
* @param {boolean} [enableCompiledLogicCache] - whether to cache the compiled logic for future use
|
|
1178
|
-
* @returns {Promise<Record<string, TwoSlashReturn>>} the compiled code for each typescript file
|
|
1179
|
-
*/
|
|
1180
|
-
async compileLogic(enableCompiledLogicCache = false) {
|
|
1181
|
-
if (enableCompiledLogicCache && this.compiledLogicCache) {
|
|
1182
|
-
return this.compiledLogicCache;
|
|
1183
|
-
}
|
|
1184
|
-
const logicManager = this.template.getLogicManager();
|
|
1185
|
-
if (logicManager.getLanguage() === "typescript") {
|
|
1186
|
-
const compiledCode = {};
|
|
1187
|
-
const tsFiles = logicManager.getScriptManager().getScriptsForTarget("typescript");
|
|
1188
|
-
for (let n = 0; n < tsFiles.length; n++) {
|
|
1189
|
-
const tsFile = tsFiles[n];
|
|
1190
|
-
const compiler = new TypeScriptToJavaScriptCompiler(
|
|
1191
|
-
this.template.getModelManager(),
|
|
1192
|
-
this.template.getTemplateModel().getFullyQualifiedName()
|
|
1193
|
-
);
|
|
1194
|
-
await compiler.initialize();
|
|
1195
|
-
const code = `${Buffer.from(SMART_LEGAL_CONTRACT_BASE64, "base64").toString()}
|
|
1196
|
-
${tsFile.getContents()}`;
|
|
1197
|
-
const result = compiler.compile(code);
|
|
1198
|
-
compiledCode[tsFile.getIdentifier()] = result;
|
|
1199
|
-
}
|
|
1200
|
-
if (enableCompiledLogicCache) {
|
|
1201
|
-
this.compiledLogicCache = compiledCode;
|
|
1202
|
-
}
|
|
1203
|
-
return compiledCode;
|
|
1204
|
-
} else {
|
|
1205
|
-
throw new Error("Only TypeScript is supported at this time");
|
|
1206
|
-
}
|
|
1207
|
-
}
|
|
1208
|
-
/**
|
|
1209
|
-
* Trigger the logic of a template.
|
|
1210
|
-
* @param {object} data - the data for the template
|
|
1211
|
-
* @param {object} request - the request to send to the template logic
|
|
1212
|
-
* @param {object} state - the current state of the template
|
|
1213
|
-
* @param {[string]} currentTime - the current time, defaults to now
|
|
1214
|
-
* @param {[number]} utcOffset - the UTC offset, defaults to zero
|
|
1215
|
-
* @param {boolean} [enableCompiledLogicCache] - whether to use the compiled logic cache
|
|
1216
|
-
* @returns {Promise<TriggerResponse>} the response and any events
|
|
1217
|
-
*/
|
|
1218
|
-
async trigger(data, request, state, currentTime, utcOffset, enableCompiledLogicCache) {
|
|
1219
|
-
const compiledCode = await this.compileLogic(enableCompiledLogicCache);
|
|
1220
|
-
const resolvedTime = currentTime ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
1221
|
-
const resolvedOffset = utcOffset ?? 0;
|
|
1222
|
-
const evaluator = new JavaScriptEvaluator();
|
|
1223
|
-
const evalResponse = await evaluator.evalDangerously({
|
|
1224
|
-
templateLogic: true,
|
|
1225
|
-
verbose: false,
|
|
1226
|
-
functionName: "trigger",
|
|
1227
|
-
code: compiledCode["logic/logic.ts"].code,
|
|
1228
|
-
// TODO DCS - how to find the code to run?
|
|
1229
|
-
argumentNames: ["data", "request", "state"],
|
|
1230
|
-
arguments: [data, request, state, resolvedTime, resolvedOffset]
|
|
1231
|
-
});
|
|
1232
|
-
if (evalResponse.result) {
|
|
1233
|
-
return evalResponse.result;
|
|
1234
|
-
} else {
|
|
1235
|
-
throw new Error("Trigger failed with message: " + evalResponse.message);
|
|
1236
|
-
}
|
|
1237
|
-
}
|
|
1238
|
-
/**
|
|
1239
|
-
* Init the logic of a template.
|
|
1240
|
-
* @param {object} data - the data for the template
|
|
1241
|
-
* @param {[string]} currentTime - the current time, defaults to now
|
|
1242
|
-
* @param {[number]} utcOffset - the UTC offset, defaults to zero
|
|
1243
|
-
* @param {boolean} [enableCompiledLogicCache] - whether to use the compiled logic cache
|
|
1244
|
-
* @returns {Promise<InitResponse>} the new state
|
|
1245
|
-
*/
|
|
1246
|
-
async init(data, currentTime, utcOffset, enableCompiledLogicCache) {
|
|
1247
|
-
const compiledCode = await this.compileLogic(enableCompiledLogicCache);
|
|
1248
|
-
const resolvedTime = currentTime ?? (/* @__PURE__ */ new Date()).toISOString();
|
|
1249
|
-
const resolvedOffset = utcOffset ?? 0;
|
|
1250
|
-
const evaluator = new JavaScriptEvaluator();
|
|
1251
|
-
const evalResponse = await evaluator.evalDangerously({
|
|
1252
|
-
templateLogic: true,
|
|
1253
|
-
verbose: false,
|
|
1254
|
-
functionName: "init",
|
|
1255
|
-
code: compiledCode["logic/logic.ts"].code,
|
|
1256
|
-
// TODO DCS - how to find the code to run?
|
|
1257
|
-
argumentNames: ["data"],
|
|
1258
|
-
arguments: [data, resolvedTime, resolvedOffset]
|
|
1259
|
-
});
|
|
1260
|
-
if (evalResponse.result) {
|
|
1261
|
-
return evalResponse.result;
|
|
1262
|
-
} else {
|
|
1263
|
-
throw new Error("Init failed with message: " + evalResponse.message);
|
|
1264
|
-
}
|
|
1265
|
-
}
|
|
1266
|
-
}
|
|
1267
|
-
|
|
1268
|
-
exports.TemplateArchiveProcessor = TemplateArchiveProcessor;
|
|
1269
|
-
exports.TemplateMarkInterpreter = TemplateMarkInterpreter;
|
|
1270
|
-
exports.ensureDirSync = ensureDirSync;
|
|
1271
|
-
exports.getTemplateClassDeclaration = getTemplateClassDeclaration;
|
|
1272
|
-
exports.nameUserCode = nameUserCode;
|
|
1273
|
-
exports.removeSync = removeSync;
|
|
1274
|
-
exports.writeFunctionToString = writeFunctionToString;
|
|
1275
|
-
//# sourceMappingURL=index.js.map
|