@accordproject/template-engine 2.0.3 → 2.2.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.
Files changed (127) hide show
  1. package/dist/index.d.ts +123 -2
  2. package/dist/index.js +1437 -21
  3. package/dist/index.js.map +1 -1
  4. package/dist/index.mjs +1414 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/dist/runtime.tgz +0 -0
  7. package/package.json +7 -3
  8. package/dist/Common.d.ts +0 -20
  9. package/dist/Common.js +0 -55
  10. package/dist/Common.js.map +0 -1
  11. package/dist/TemplateMarkInterpreter.d.ts +0 -34
  12. package/dist/TemplateMarkInterpreter.js +0 -401
  13. package/dist/TemplateMarkInterpreter.js.map +0 -1
  14. package/dist/TemplateMarkToJavaScriptCompiler.d.ts +0 -19
  15. package/dist/TemplateMarkToJavaScriptCompiler.js +0 -96
  16. package/dist/TemplateMarkToJavaScriptCompiler.js.map +0 -1
  17. package/dist/TemplateMarkToTypeScriptCompiler.d.ts +0 -77
  18. package/dist/TemplateMarkToTypeScriptCompiler.js +0 -311
  19. package/dist/TemplateMarkToTypeScriptCompiler.js.map +0 -1
  20. package/dist/TypeScriptCompilationContext.d.ts +0 -15
  21. package/dist/TypeScriptCompilationContext.js +0 -57
  22. package/dist/TypeScriptCompilationContext.js.map +0 -1
  23. package/dist/TypeScriptRuntime.d.ts +0 -14
  24. package/dist/TypeScriptRuntime.js +0 -79
  25. package/dist/TypeScriptRuntime.js.map +0 -1
  26. package/dist/TypeScriptToJavaScriptCompiler.d.ts +0 -14
  27. package/dist/TypeScriptToJavaScriptCompiler.js +0 -59
  28. package/dist/TypeScriptToJavaScriptCompiler.js.map +0 -1
  29. package/dist/compilers/Clause.d.ts +0 -14
  30. package/dist/compilers/Clause.js +0 -43
  31. package/dist/compilers/Clause.js.map +0 -1
  32. package/dist/compilers/Common.d.ts +0 -66
  33. package/dist/compilers/Common.js +0 -180
  34. package/dist/compilers/Common.js.map +0 -1
  35. package/dist/compilers/Conditional.d.ts +0 -12
  36. package/dist/compilers/Conditional.js +0 -36
  37. package/dist/compilers/Conditional.js.map +0 -1
  38. package/dist/compilers/ContractDefinition.d.ts +0 -8
  39. package/dist/compilers/ContractDefinition.js +0 -33
  40. package/dist/compilers/ContractDefinition.js.map +0 -1
  41. package/dist/compilers/EnumVariable.d.ts +0 -8
  42. package/dist/compilers/EnumVariable.js +0 -28
  43. package/dist/compilers/EnumVariable.js.map +0 -1
  44. package/dist/compilers/FormattedVariable.d.ts +0 -8
  45. package/dist/compilers/FormattedVariable.js +0 -29
  46. package/dist/compilers/FormattedVariable.js.map +0 -1
  47. package/dist/compilers/Formula.d.ts +0 -8
  48. package/dist/compilers/Formula.js +0 -24
  49. package/dist/compilers/Formula.js.map +0 -1
  50. package/dist/compilers/Join.d.ts +0 -8
  51. package/dist/compilers/Join.js +0 -23
  52. package/dist/compilers/Join.js.map +0 -1
  53. package/dist/compilers/ListBlock.d.ts +0 -11
  54. package/dist/compilers/ListBlock.js +0 -39
  55. package/dist/compilers/ListBlock.js.map +0 -1
  56. package/dist/compilers/NodeCompilers.d.ts +0 -7
  57. package/dist/compilers/NodeCompilers.js +0 -89
  58. package/dist/compilers/NodeCompilers.js.map +0 -1
  59. package/dist/compilers/Optional.d.ts +0 -11
  60. package/dist/compilers/Optional.js +0 -48
  61. package/dist/compilers/Optional.js.map +0 -1
  62. package/dist/compilers/Variable.d.ts +0 -8
  63. package/dist/compilers/Variable.js +0 -28
  64. package/dist/compilers/Variable.js.map +0 -1
  65. package/dist/compilers/With.d.ts +0 -10
  66. package/dist/compilers/With.js +0 -23
  67. package/dist/compilers/With.js.map +0 -1
  68. package/dist/drafting/Boolean/index.d.ts +0 -6
  69. package/dist/drafting/Boolean/index.js +0 -30
  70. package/dist/drafting/Boolean/index.js.map +0 -1
  71. package/dist/drafting/DateTime/index.d.ts +0 -7
  72. package/dist/drafting/DateTime/index.js +0 -33
  73. package/dist/drafting/DateTime/index.js.map +0 -1
  74. package/dist/drafting/Double/format.d.ts +0 -13
  75. package/dist/drafting/Double/format.js +0 -55
  76. package/dist/drafting/Double/format.js.map +0 -1
  77. package/dist/drafting/Double/index.d.ts +0 -7
  78. package/dist/drafting/Double/index.js +0 -33
  79. package/dist/drafting/Double/index.js.map +0 -1
  80. package/dist/drafting/Integer/format.d.ts +0 -13
  81. package/dist/drafting/Integer/format.js +0 -45
  82. package/dist/drafting/Integer/format.js.map +0 -1
  83. package/dist/drafting/Integer/index.d.ts +0 -7
  84. package/dist/drafting/Integer/index.js +0 -33
  85. package/dist/drafting/Integer/index.js.map +0 -1
  86. package/dist/drafting/Long/index.d.ts +0 -7
  87. package/dist/drafting/Long/index.js +0 -33
  88. package/dist/drafting/Long/index.js.map +0 -1
  89. package/dist/drafting/MonetaryAmount/currencycode.d.ts +0 -35
  90. package/dist/drafting/MonetaryAmount/currencycode.js +0 -53
  91. package/dist/drafting/MonetaryAmount/currencycode.js.map +0 -1
  92. package/dist/drafting/MonetaryAmount/index.d.ts +0 -12
  93. package/dist/drafting/MonetaryAmount/index.js +0 -67
  94. package/dist/drafting/MonetaryAmount/index.js.map +0 -1
  95. package/dist/drafting/String/index.d.ts +0 -6
  96. package/dist/drafting/String/index.js +0 -25
  97. package/dist/drafting/String/index.js.map +0 -1
  98. package/dist/drafting/index.d.ts +0 -1
  99. package/dist/drafting/index.js +0 -40
  100. package/dist/drafting/index.js.map +0 -1
  101. package/dist/model-gen/concerto.d.ts +0 -13
  102. package/dist/model-gen/concerto.js +0 -5
  103. package/dist/model-gen/concerto.js.map +0 -1
  104. package/dist/model-gen/concerto.metamodel@1.0.0.d.ts +0 -196
  105. package/dist/model-gen/concerto.metamodel@1.0.0.js +0 -5
  106. package/dist/model-gen/concerto.metamodel@1.0.0.js.map +0 -1
  107. package/dist/model-gen/concerto@1.0.0.d.ts +0 -19
  108. package/dist/model-gen/concerto@1.0.0.js +0 -5
  109. package/dist/model-gen/concerto@1.0.0.js.map +0 -1
  110. package/dist/model-gen/org.accordproject.ciceromark@0.6.0.d.ts +0 -49
  111. package/dist/model-gen/org.accordproject.ciceromark@0.6.0.js +0 -5
  112. package/dist/model-gen/org.accordproject.ciceromark@0.6.0.js.map +0 -1
  113. package/dist/model-gen/org.accordproject.commonmark@0.5.0.d.ts +0 -89
  114. package/dist/model-gen/org.accordproject.commonmark@0.5.0.js +0 -5
  115. package/dist/model-gen/org.accordproject.commonmark@0.5.0.js.map +0 -1
  116. package/dist/model-gen/org.accordproject.templatemark@0.5.0.d.ts +0 -76
  117. package/dist/model-gen/org.accordproject.templatemark@0.5.0.js +0 -12
  118. package/dist/model-gen/org.accordproject.templatemark@0.5.0.js.map +0 -1
  119. package/dist/runtime/declarations.d.ts +0 -2
  120. package/dist/runtime/declarations.js +0 -21
  121. package/dist/runtime/declarations.js.map +0 -1
  122. package/dist/runtime/runtime.d.ts +0 -1
  123. package/dist/runtime/runtime.js +0 -20
  124. package/dist/runtime/runtime.js.map +0 -1
  125. package/dist/utils.d.ts +0 -5
  126. package/dist/utils.js +0 -43
  127. package/dist/utils.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,21 +1,1437 @@
1
- "use strict";
2
- /*
3
- * Licensed under the Apache License, Version 2.0 (the "License");
4
- * you may not use this file except in compliance with the License.
5
- * You may obtain a copy of the License at
6
- *
7
- * http://www.apache.org/licenses/LICENSE-2.0
8
- *
9
- * Unless required by applicable law or agreed to in writing, software
10
- * distributed under the License is distributed on an "AS IS" BASIS,
11
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- * See the License for the specific language governing permissions and
13
- * limitations under the License.
14
- */
15
- Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.TemplateMarkToTypeScriptCompiler = exports.TemplateMarkInterpreter = void 0;
17
- var TemplateMarkInterpreter_1 = require("./TemplateMarkInterpreter");
18
- Object.defineProperty(exports, "TemplateMarkInterpreter", { enumerable: true, get: function () { return TemplateMarkInterpreter_1.TemplateMarkInterpreter; } });
19
- var TemplateMarkToTypeScriptCompiler_1 = require("./TemplateMarkToTypeScriptCompiler");
20
- Object.defineProperty(exports, "TemplateMarkToTypeScriptCompiler", { enumerable: true, get: function () { return TemplateMarkToTypeScriptCompiler_1.TemplateMarkToTypeScriptCompiler; } });
21
- //# sourceMappingURL=index.js.map
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 markdownTemplate = require('@accordproject/markdown-template');
10
+ var vfs = require('@typescript/vfs');
11
+ var twoslash = require('@typescript/twoslash');
12
+ var concertoCodegen = require('@accordproject/concerto-codegen');
13
+ var concertoUtil = require('@accordproject/concerto-util');
14
+ var lzstring = require('lz-string');
15
+ var fs = require('fs');
16
+ var tar = require('tar');
17
+ var stream = require('stream');
18
+
19
+ function _interopNamespaceDefault(e) {
20
+ var n = Object.create(null);
21
+ if (e) {
22
+ Object.keys(e).forEach(function (k) {
23
+ if (k !== 'default') {
24
+ var d = Object.getOwnPropertyDescriptor(e, k);
25
+ Object.defineProperty(n, k, d.get ? d : {
26
+ enumerable: true,
27
+ get: function () { return e[k]; }
28
+ });
29
+ }
30
+ });
31
+ }
32
+ n.default = e;
33
+ return Object.freeze(n);
34
+ }
35
+
36
+ var lzstring__namespace = /*#__PURE__*/_interopNamespaceDefault(lzstring);
37
+ var tar__namespace = /*#__PURE__*/_interopNamespaceDefault(tar);
38
+
39
+ function booleanDrafter(value) {
40
+ if (value) {
41
+ return "true";
42
+ } else {
43
+ return "false";
44
+ }
45
+ }
46
+
47
+ dayjs.extend(utc);
48
+ function dateTimeDrafter(value, format) {
49
+ const f = format ? format : "MM/DD/YYYY";
50
+ return dayjs.utc(value).format(f);
51
+ }
52
+
53
+ function draftDoubleIEEE(value) {
54
+ if (Math.floor(value) === value) {
55
+ return new Number(value).toFixed(1);
56
+ } else {
57
+ return "" + value;
58
+ }
59
+ }
60
+ function draftDoubleFormat(value, format) {
61
+ return format.replace(/0(.)0((.)(0+))?/gi, function(_a, sep1, _b, sep2, digits) {
62
+ const len = digits ? digits.length : 0;
63
+ const vs = value.toFixed(len);
64
+ let res = "";
65
+ if (sep2) {
66
+ const d = vs.substring(vs.length - len);
67
+ res += sep2 + d;
68
+ }
69
+ let i = vs.substring(0, vs.length - (len === 0 ? 0 : len + 1));
70
+ while (i.length > 3) {
71
+ res = sep1 + i.substring(i.length - 3) + res;
72
+ i = i.substring(0, i.length - 3);
73
+ }
74
+ return i + res;
75
+ });
76
+ }
77
+
78
+ function doubleDrafter(value, format) {
79
+ if (format) {
80
+ return draftDoubleFormat(value, format);
81
+ } else {
82
+ return draftDoubleIEEE(value);
83
+ }
84
+ }
85
+
86
+ function draftInteger(value) {
87
+ return "" + value;
88
+ }
89
+ function draftIntegerFormat(value, format) {
90
+ return format.replace(/0(.)0/gi, function(_a, sep1) {
91
+ const vs = value.toFixed(0);
92
+ let res = "";
93
+ let i = vs.substring(0, vs.length);
94
+ while (i.length > 3) {
95
+ res = sep1 + i.substring(i.length - 3) + res;
96
+ i = i.substring(0, i.length - 3);
97
+ }
98
+ return i + res;
99
+ });
100
+ }
101
+
102
+ function integerDrafter(value, format) {
103
+ if (format) {
104
+ return draftIntegerFormat(value, format);
105
+ } else {
106
+ return draftInteger(value);
107
+ }
108
+ }
109
+
110
+ function longDrafter(value, format) {
111
+ if (format) {
112
+ return draftIntegerFormat(value, format);
113
+ } else {
114
+ return draftInteger(value);
115
+ }
116
+ }
117
+
118
+ var CurrencyCode = /* @__PURE__ */ ((CurrencyCode2) => {
119
+ CurrencyCode2["USD"] = "$";
120
+ CurrencyCode2["EUR"] = "\u20AC";
121
+ CurrencyCode2["JPY"] = "\xA5";
122
+ CurrencyCode2["GBP"] = "\xA3";
123
+ CurrencyCode2["AUD"] = "A$";
124
+ CurrencyCode2["CAD"] = "C$";
125
+ CurrencyCode2["CHF"] = "CHF";
126
+ CurrencyCode2["CNY"] = "\u5143";
127
+ CurrencyCode2["HKD"] = "HK$";
128
+ CurrencyCode2["NZD"] = "NZ$";
129
+ CurrencyCode2["KRW"] = "\u20A9";
130
+ CurrencyCode2["SGD"] = "S$";
131
+ CurrencyCode2["MXN"] = "MEX$";
132
+ CurrencyCode2["INR"] = "\u20B9";
133
+ CurrencyCode2["RUB"] = "\u20BD";
134
+ CurrencyCode2["ZAR"] = "R";
135
+ CurrencyCode2["TRY"] = "\u20BA";
136
+ CurrencyCode2["BRL"] = "R$";
137
+ CurrencyCode2["TWD"] = "NT$";
138
+ CurrencyCode2["PLN"] = "z\u0142";
139
+ CurrencyCode2["THB"] = "\u0E3F";
140
+ CurrencyCode2["IDR"] = "Rp";
141
+ CurrencyCode2["HUF"] = "Ft";
142
+ CurrencyCode2["CZK"] = "K\u010D";
143
+ CurrencyCode2["ILS"] = "\u20AA";
144
+ CurrencyCode2["CLP"] = "CLP$";
145
+ CurrencyCode2["PHP"] = "\u20B1";
146
+ CurrencyCode2["AED"] = "\u062F.\u0625";
147
+ CurrencyCode2["COP"] = "COL$";
148
+ CurrencyCode2["SAR"] = "\uFDFC";
149
+ CurrencyCode2["MYR"] = "RM";
150
+ CurrencyCode2["RON"] = "L";
151
+ CurrencyCode2["BGN"] = "\u043B\u0432.";
152
+ return CurrencyCode2;
153
+ })(CurrencyCode || {});
154
+
155
+ function monetaryAmountDefaultDrafter(value) {
156
+ return "" + draftDoubleIEEE(value.doubleValue) + " " + value.currencyCode;
157
+ }
158
+ function codeSymbol(c) {
159
+ const index = Object.keys(CurrencyCode).indexOf(c);
160
+ if (index >= 0) {
161
+ return Object.values(CurrencyCode)[index];
162
+ } else {
163
+ return c;
164
+ }
165
+ }
166
+ function monetaryAmountFormatDrafter(value, format) {
167
+ return draftDoubleFormat(
168
+ value.doubleValue,
169
+ format.replace(/K/gi, codeSymbol(value.currencyCode)).replace(/CCC/gi, value.currencyCode)
170
+ );
171
+ }
172
+ function monetaryAmountDrafter(value, format) {
173
+ if (format) {
174
+ return monetaryAmountFormatDrafter(value, format);
175
+ } else {
176
+ return monetaryAmountDefaultDrafter(value);
177
+ }
178
+ }
179
+
180
+ function stringDrafter(value) {
181
+ return value;
182
+ }
183
+
184
+ function getDrafter(typeName) {
185
+ switch (typeName) {
186
+ case "Boolean":
187
+ return booleanDrafter;
188
+ case "DateTime":
189
+ return dateTimeDrafter;
190
+ case "Double":
191
+ return doubleDrafter;
192
+ case "Integer":
193
+ return integerDrafter;
194
+ case "Long":
195
+ return longDrafter;
196
+ case "org.accordproject.money@0.3.0.MonetaryAmount":
197
+ return monetaryAmountDrafter;
198
+ case "String":
199
+ return stringDrafter;
200
+ default:
201
+ return null;
202
+ }
203
+ }
204
+
205
+ const TEMPLATEMARK_RE = /^(org\.accordproject\.templatemark)@(.+)\.(\w+)Definition$/;
206
+ const FORMULA_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormulaDefinition$/;
207
+ const VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.VariableDefinition$/;
208
+ const CONDITIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ConditionalDefinition$/;
209
+ const ENUM_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.EnumVariableDefinition$/;
210
+ const FORMATTED_VARIABLE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.FormattedVariableDefinition$/;
211
+ const WITH_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.WithDefinition$/;
212
+ const LISTBLOCK_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ListBlockDefinition$/;
213
+ const JOIN_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.JoinDefinition$/;
214
+ const OPTIONAL_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.OptionalDefinition$/;
215
+ const CLAUSE_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ClauseDefinition$/;
216
+ const CONTRACT_DEFINITION_RE = /^(org\.accordproject\.templatemark)@(.+)\.ContractDefinition$/;
217
+ const NAVIGATION_NODES = [
218
+ `${markdownCommon.TemplateMarkModel.NAMESPACE}.ListBlockDefinition`,
219
+ `${markdownCommon.TemplateMarkModel.NAMESPACE}.WithDefinition`,
220
+ `${markdownCommon.TemplateMarkModel.NAMESPACE}.JoinDefinition`,
221
+ `${markdownCommon.TemplateMarkModel.NAMESPACE}.OptionalDefinition`,
222
+ `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`
223
+ ];
224
+ function getTemplateClassDeclaration(modelManager, templateConceptFqn) {
225
+ const introspector = new concertoCore.Introspector(modelManager);
226
+ try {
227
+ return markdownTemplate.templatemarkutil.findTemplateConcept(introspector, "clause", templateConceptFqn);
228
+ } catch (err) {
229
+ console.log(err);
230
+ throw err;
231
+ }
232
+ }
233
+
234
+ class TypeScriptCompilationContext {
235
+ modelManager;
236
+ templateClass;
237
+ constructor(modelManager, templateConceptFqn) {
238
+ this.modelManager = modelManager;
239
+ this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
240
+ }
241
+ getTypeScriptFiles() {
242
+ const result = {};
243
+ const visitor = new concertoCodegen.CodeGen.TypescriptVisitor();
244
+ const writer = new concertoUtil.InMemoryWriter();
245
+ const params = {
246
+ fileWriter: writer
247
+ };
248
+ this.modelManager.accept(visitor, params);
249
+ writer.getFilesInMemory().forEach((value, key) => {
250
+ result[key] = value;
251
+ });
252
+ return result;
253
+ }
254
+ getCompilationContext() {
255
+ const files = this.getTypeScriptFiles();
256
+ let result = "";
257
+ Object.keys(files).forEach((key) => {
258
+ const content = files[key];
259
+ result += `
260
+ // @filename: ${key}
261
+ ${content}
262
+ `;
263
+ });
264
+ result += `
265
+ // @filename: code.ts
266
+ import * as TemplateModel from './${this.templateClass.getNamespace()}';
267
+ import dayjs from 'dayjs';
268
+ import jp from 'jsonpath';
269
+
270
+ type GenerationOptions = {
271
+ now?:string,
272
+ locale?:string
273
+ }
274
+ `;
275
+ return result;
276
+ }
277
+ }
278
+
279
+ const DAYJS_BASE64 = "Ly8vIDxyZWZlcmVuY2UgcGF0aD0iLi9sb2NhbGUvaW5kZXguZC50cyIgLz4KCmV4cG9ydCA9IGRheWpzOwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUpOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIHN0cmljdD86IGJvb2xlYW4pOiBkYXlqcy5EYXlqcwoKZGVjbGFyZSBmdW5jdGlvbiBkYXlqcyAoZGF0ZT86IGRheWpzLkNvbmZpZ1R5cGUsIGZvcm1hdD86IGRheWpzLk9wdGlvblR5cGUsIGxvY2FsZT86IHN0cmluZywgc3RyaWN0PzogYm9vbGVhbik6IGRheWpzLkRheWpzCgpkZWNsYXJlIG5hbWVzcGFjZSBkYXlqcyB7CiAgaW50ZXJmYWNlIENvbmZpZ1R5cGVNYXAgewogICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IERheWpzIHwgbnVsbCB8IHVuZGVmaW5lZAogIH0KCiAgZXhwb3J0IHR5cGUgQ29uZmlnVHlwZSA9IENvbmZpZ1R5cGVNYXBba2V5b2YgQ29uZmlnVHlwZU1hcF0KCiAgZXhwb3J0IGludGVyZmFjZSBGb3JtYXRPYmplY3QgeyBsb2NhbGU/OiBzdHJpbmcsIGZvcm1hdD86IHN0cmluZywgdXRjPzogYm9vbGVhbiB9CgogIGV4cG9ydCB0eXBlIE9wdGlvblR5cGUgPSBGb3JtYXRPYmplY3QgfCBzdHJpbmcgfCBzdHJpbmdbXQoKICBleHBvcnQgdHlwZSBVbml0VHlwZVNob3J0ID0gJ2QnIHwgJ0QnIHwgJ00nIHwgJ3knIHwgJ2gnIHwgJ20nIHwgJ3MnIHwgJ21zJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmcgPSAnbWlsbGlzZWNvbmQnIHwgJ3NlY29uZCcgfCAnbWludXRlJyB8ICdob3VyJyB8ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyB8ICdkYXRlJwoKICBleHBvcnQgdHlwZSBVbml0VHlwZUxvbmdQbHVyYWwgPSAnbWlsbGlzZWNvbmRzJyB8ICdzZWNvbmRzJyB8ICdtaW51dGVzJyB8ICdob3VycycgfCAnZGF5cycgfCAnbW9udGhzJyB8ICd5ZWFycycgfCAnZGF0ZXMnCiAgCiAgZXhwb3J0IHR5cGUgVW5pdFR5cGUgPSBVbml0VHlwZUxvbmcgfCBVbml0VHlwZUxvbmdQbHVyYWwgfCBVbml0VHlwZVNob3J0OwoKICBleHBvcnQgdHlwZSBPcFVuaXRUeXBlID0gVW5pdFR5cGUgfCAid2VlayIgfCAid2Vla3MiIHwgJ3cnOwogIGV4cG9ydCB0eXBlIFFVbml0VHlwZSA9IFVuaXRUeXBlIHwgInF1YXJ0ZXIiIHwgInF1YXJ0ZXJzIiB8ICdRJzsKICBleHBvcnQgdHlwZSBNYW5pcHVsYXRlVHlwZSA9IEV4Y2x1ZGU8T3BVbml0VHlwZSwgJ2RhdGUnIHwgJ2RhdGVzJz47CiAgY2xhc3MgRGF5anMgewogICAgY29uc3RydWN0b3IgKGNvbmZpZz86IENvbmZpZ1R5cGUpCiAgICAvKioKICAgICAqIEFsbCBEYXkuanMgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLiBTdGlsbCwgYGRheWpzI2Nsb25lYCBjYW4gY3JlYXRlIGEgY2xvbmUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0IGlmIHlvdSBuZWVkIG9uZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5jbG9uZSgpLy8gPT4gRGF5anMKICAgICAqIGRheWpzKGRheWpzKCcyMDE5LTAxLTI1JykpIC8vIHBhc3NpbmcgYSBEYXlqcyBvYmplY3QgdG8gYSBjb25zdHJ1Y3RvciB3aWxsIGFsc28gY2xvbmUgaXQKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvZGF5anMtY2xvbmUKICAgICAqLwogICAgY2xvbmUoKTogRGF5anMKICAgIC8qKgogICAgICogVGhpcyByZXR1cm5zIGEgYGJvb2xlYW5gIGluZGljYXRpbmcgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBjb250YWlucyBhIHZhbGlkIGRhdGUgb3Igbm90LgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzVmFsaWQoKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcGFyc2UvaXMtdmFsaWQKICAgICAqLwogICAgaXNWYWxpZCgpOiBib29sZWFuCiAgICAvKioKICAgICAqIEdldCB0aGUgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS55ZWFyKCkvLyA9PiAyMDIwCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIHllYXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkueWVhcigyMDAwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQveWVhcgogICAgICovCiAgICB5ZWFyKHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBHZXQgdGhlIG1vbnRoLgogICAgICoKICAgICAqIE1vbnRocyBhcmUgemVybyBpbmRleGVkLCBzbyBKYW51YXJ5IGlzIG1vbnRoIDAuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubW9udGgoKS8vID0+IDAtMTEKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9tb250aAogICAgICovCiAgICBtb250aCgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBtb250aC4KICAgICAqCiAgICAgKiBNb250aHMgYXJlIHplcm8gaW5kZXhlZCwgc28gSmFudWFyeSBpcyBtb250aCAwLgogICAgICoKICAgICAqIEFjY2VwdHMgbnVtYmVycyBmcm9tIDAgdG8gMTEuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gdGhlIG5leHQgeWVhci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5tb250aCgwKS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbW9udGgKICAgICAqLwogICAgbW9udGgodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF0ZSBvZiB0aGUgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZGF0ZSgpLy8gPT4gMS0zMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RhdGUKICAgICAqLwogICAgZGF0ZSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXRlIG9mIHRoZSBtb250aC4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAxIHRvIDMxLiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1vbnRocy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXRlKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9kYXRlCiAgICAgKi8KICAgIGRhdGUodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZGF5IG9mIHRoZSB3ZWVrLgogICAgICoKICAgICAqIFJldHVybnMgbnVtYmVycyBmcm9tIDAgKFN1bmRheSkgdG8gNiAoU2F0dXJkYXkpLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmRheSgpLy8gMC02CiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvZGF5CiAgICAgKi8KICAgIGRheSgpOiBudW1iZXIKICAgIC8qKgogICAgICogU2V0IHRoZSBkYXkgb2YgdGhlIHdlZWsuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCAoU3VuZGF5KSB0byA2IChTYXR1cmRheSkuIElmIHRoZSByYW5nZSBpcyBleGNlZWRlZCwgaXQgd2lsbCBidWJibGUgdXAgdG8gbmV4dCB3ZWVrcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5kYXkoMCkvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2RheQogICAgICovCiAgICBkYXkodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgaG91ci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5ob3VyKCkvLyA9PiAwLTIzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvaG91cgogICAgICovCiAgICBob3VyKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIGhvdXIuCiAgICAgKgogICAgICogQWNjZXB0cyBudW1iZXJzIGZyb20gMCB0byAyMy4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBkYXkuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaG91cigxMikvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L2hvdXIKICAgICAqLwogICAgaG91cih2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogR2V0IHRoZSBtaW51dGVzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbnV0ZSgpLy8gPT4gMC01OQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbnV0ZQogICAgICovCiAgICBtaW51dGUoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFNldCB0aGUgbWludXRlcy4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAwIHRvIDU5LiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IGhvdXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkubWludXRlKDU5KS8vID0+IERheWpzCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2dldC1zZXQvbWludXRlCiAgICAgKi8KICAgIG1pbnV0ZSh2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogR2V0IHRoZSBzZWNvbmRzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNlY29uZCgpLy8gPT4gMC01OQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L3NlY29uZAogICAgICovCiAgICBzZWNvbmQoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFNldCB0aGUgc2Vjb25kcy4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAwIHRvIDU5LiBJZiB0aGUgcmFuZ2UgaXMgZXhjZWVkZWQsIGl0IHdpbGwgYnViYmxlIHVwIHRvIHRoZSBuZXh0IG1pbnV0ZXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc2Vjb25kKDEpLy8gRGF5anMKICAgICAqIGBgYAogICAgICovCiAgICBzZWNvbmQodmFsdWU6IG51bWJlcik6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgbWlsbGlzZWNvbmRzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbGxpc2Vjb25kKCkvLyA9PiAwLTk5OQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L21pbGxpc2Vjb25kCiAgICAgKi8KICAgIG1pbGxpc2Vjb25kKCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBTZXQgdGhlIG1pbGxpc2Vjb25kcy4KICAgICAqCiAgICAgKiBBY2NlcHRzIG51bWJlcnMgZnJvbSAwIHRvIDk5OS4gSWYgdGhlIHJhbmdlIGlzIGV4Y2VlZGVkLCBpdCB3aWxsIGJ1YmJsZSB1cCB0byB0aGUgbmV4dCBzZWNvbmRzLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLm1pbGxpc2Vjb25kKDEpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9taWxsaXNlY29uZAogICAgICovCiAgICBtaWxsaXNlY29uZCh2YWx1ZTogbnVtYmVyKTogRGF5anMKICAgIC8qKgogICAgICogR2VuZXJpYyBzZXR0ZXIsIGFjY2VwdGluZyB1bml0IGFzIGZpcnN0IGFyZ3VtZW50LCBhbmQgdmFsdWUgYXMgc2Vjb25kLCByZXR1cm5zIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIGFwcGxpZWQgY2hhbmdlcy4KICAgICAqCiAgICAgKiBJbiBnZW5lcmFsOgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNldCh1bml0LCB2YWx1ZSkgPT09IGRheWpzKClbdW5pdF0odmFsdWUpCiAgICAgKiBgYGAKICAgICAqIFVuaXRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLCBhbmQgc3VwcG9ydCBwbHVyYWwgYW5kIHNob3J0IGZvcm1zLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLnNldCgnZGF0ZScsIDEpCiAgICAgKiBkYXlqcygpLnNldCgnbW9udGgnLCAzKSAvLyBBcHJpbAogICAgICogZGF5anMoKS5zZXQoJ3NlY29uZCcsIDMwKQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9nZXQtc2V0L3NldAogICAgICovCiAgICBzZXQodW5pdDogVW5pdFR5cGUsIHZhbHVlOiBudW1iZXIpOiBEYXlqcwogICAgLyoqCiAgICAgKiBTdHJpbmcgZ2V0dGVyLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uIGdldHRpbmcgZnJvbSBEYXkuanMgb2JqZWN0LgogICAgICoKICAgICAqIEluIGdlbmVyYWw6CiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZ2V0KHVuaXQpID09PSBkYXlqcygpW3VuaXRdKCkKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuZ2V0KCd5ZWFyJykKICAgICAqIGRheWpzKCkuZ2V0KCdtb250aCcpIC8vIHN0YXJ0IDAKICAgICAqIGRheWpzKCkuZ2V0KCdkYXRlJykKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZ2V0LXNldC9nZXQKICAgICAqLwogICAgZ2V0KHVuaXQ6IFVuaXRUeXBlKTogbnVtYmVyCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjbG9uZWQgRGF5LmpzIG9iamVjdCB3aXRoIGEgc3BlY2lmaWVkIGFtb3VudCBvZiB0aW1lIGFkZGVkLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmFkZCg3LCAnZGF5JykvLyA9PiBEYXlqcwogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9tYW5pcHVsYXRlL2FkZAogICAgICovCiAgICBhZGQodmFsdWU6IG51bWJlciwgdW5pdD86IE1hbmlwdWxhdGVUeXBlKTogRGF5anMKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNsb25lZCBEYXkuanMgb2JqZWN0IHdpdGggYSBzcGVjaWZpZWQgYW1vdW50IG9mIHRpbWUgc3VidHJhY3RlZC4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5zdWJ0cmFjdCg3LCAneWVhcicpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9zdWJ0cmFjdAogICAgICovCiAgICBzdWJ0cmFjdCh2YWx1ZTogbnVtYmVyLCB1bml0PzogTWFuaXB1bGF0ZVR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3QgYW5kIHNldCBpdCB0byB0aGUgc3RhcnQgb2YgYSB1bml0IG9mIHRpbWUuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuc3RhcnRPZigneWVhcicpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9zdGFydC1vZgogICAgICovCiAgICBzdGFydE9mKHVuaXQ6IE9wVW5pdFR5cGUpOiBEYXlqcwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY2xvbmVkIERheS5qcyBvYmplY3QgYW5kIHNldCBpdCB0byB0aGUgZW5kIG9mIGEgdW5pdCBvZiB0aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmVuZE9mKCdtb250aCcpLy8gPT4gRGF5anMKICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vbWFuaXB1bGF0ZS9lbmQtb2YKICAgICAqLwogICAgZW5kT2YodW5pdDogT3BVbml0VHlwZSk6IERheWpzCiAgICAvKioKICAgICAqIEdldCB0aGUgZm9ybWF0dGVkIGRhdGUgYWNjb3JkaW5nIHRvIHRoZSBzdHJpbmcgb2YgdG9rZW5zIHBhc3NlZCBpbi4KICAgICAqCiAgICAgKiBUbyBlc2NhcGUgY2hhcmFjdGVycywgd3JhcCB0aGVtIGluIHNxdWFyZSBicmFja2V0cyAoZS5nLiBbTU1dKS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5mb3JtYXQoKS8vID0+IGN1cnJlbnQgZGF0ZSBpbiBJU084NjAxLCB3aXRob3V0IGZyYWN0aW9uIHNlY29uZHMgZS5nLiAnMjAyMC0wNC0wMlQwODowMjoxNy0wNTowMCcKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZm9ybWF0KCdbWVlZWWVzY2FwZV0gWVlZWS1NTS1ERFRISDptbTpzc1pbWl0nKS8vICdZWVlZZXNjYXBlIDIwMTktMDEtMjVUMDA6MDA6MDAtMDI6MDBaJwogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS5mb3JtYXQoJ0REL01NL1lZWVknKSAvLyAnMjUvMDEvMjAxOScKICAgICAqIGBgYAogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vZGlzcGxheS9mb3JtYXQKICAgICAqLwogICAgZm9ybWF0KHRlbXBsYXRlPzogc3RyaW5nKTogc3RyaW5nCiAgICAvKioKICAgICAqIFRoaXMgaW5kaWNhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGRhdGUtdGltZSBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCiAgICAgKgogICAgICogVG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGluIG1pbGxpc2Vjb25kcywgdXNlIGBkYXlqcyNkaWZmYAogICAgICogYGBgCiAgICAgKiBjb25zdCBkYXRlMSA9IGRheWpzKCcyMDE5LTAxLTI1JykKICAgICAqIGNvbnN0IGRhdGUyID0gZGF5anMoJzIwMTgtMDYtMDUnKQogICAgICogZGF0ZTEuZGlmZihkYXRlMikgLy8gMjAyMTQwMDAwMDAgZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGRhdGUxLmRpZmYoKSAvLyBtaWxsaXNlY29uZHMgdG8gY3VycmVudCB0aW1lCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUbyBnZXQgdGhlIGRpZmZlcmVuY2UgaW4gYW5vdGhlciB1bml0IG9mIG1lYXN1cmVtZW50LCBwYXNzIHRoYXQgbWVhc3VyZW1lbnQgYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAqIGBgYAogICAgICogY29uc3QgZGF0ZTEgPSBkYXlqcygnMjAxOS0wMS0yNScpCiAgICAgKiBkYXRlMS5kaWZmKCcyMDE4LTA2LTA1JywgJ21vbnRoJykgLy8gNwogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2RpZmZlcmVuY2UKICAgICAqLwogICAgZGlmZihkYXRlPzogQ29uZmlnVHlwZSwgdW5pdD86IFFVbml0VHlwZSB8IE9wVW5pdFR5cGUsIGZsb2F0PzogYm9vbGVhbik6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiAqKm1pbGxpc2Vjb25kcyoqIHNpbmNlIHRoZSBVbml4IEVwb2NoIG9mIHRoZSBEYXkuanMgb2JqZWN0LgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnZhbHVlT2YoKSAvLyAxNTQ4MzgxNjAwMDAwCiAgICAgKiArZGF5anMoMTU0ODM4MTYwMDAwMCkgLy8gMTU0ODM4MTYwMDAwMAogICAgICogYGBgCiAgICAgKiBUbyBnZXQgYSBVbml4IHRpbWVzdGFtcCAodGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCkgZnJvbSBhIERheS5qcyBvYmplY3QsIHlvdSBzaG91bGQgdXNlIFVuaXggVGltZXN0YW1wIGBkYXlqcyN1bml4KClgLgogICAgICoKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvdW5peC10aW1lc3RhbXAtbWlsbGlzZWNvbmRzCiAgICAgKi8KICAgIHZhbHVlT2YoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFRoaXMgcmV0dXJucyB0aGUgVW5peCB0aW1lc3RhbXAgKHRoZSBudW1iZXIgb2YgKipzZWNvbmRzKiogc2luY2UgdGhlIFVuaXggRXBvY2gpIG9mIHRoZSBEYXkuanMgb2JqZWN0LgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnVuaXgoKSAvLyAxNTQ4MzgxNjAwCiAgICAgKiBgYGAKICAgICAqIFRoaXMgdmFsdWUgaXMgZmxvb3JlZCB0byB0aGUgbmVhcmVzdCBzZWNvbmQsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGEgbWlsbGlzZWNvbmRzIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L3VuaXgtdGltZXN0YW1wCiAgICAgKi8KICAgIHVuaXgoKTogbnVtYmVyCiAgICAvKioKICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGRheXMgaW4gdGhlIGN1cnJlbnQgbW9udGguCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykuZGF5c0luTW9udGgoKSAvLyAzMQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2RheXMtaW4tbW9udGgKICAgICAqLwogICAgZGF5c0luTW9udGgoKTogbnVtYmVyCiAgICAvKioKICAgICAqIFRvIGdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSBgRGF0ZWAgb2JqZWN0IHBhcnNlZCBmcm9tIHRoZSBEYXkuanMgb2JqZWN0IHVzZSBgZGF5anMjdG9EYXRlYC4KICAgICAqIGBgYAogICAgICogZGF5anMoJzIwMTktMDEtMjUnKS50b0RhdGUoKS8vID0+IERhdGUKICAgICAqIGBgYAogICAgICovCiAgICB0b0RhdGUoKTogRGF0ZQogICAgLyoqCiAgICAgKiBUbyBzZXJpYWxpemUgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLgogICAgICogYGBgCiAgICAgKiBkYXlqcygnMjAxOS0wMS0yNScpLnRvSlNPTigpIC8vICcyMDE5LTAxLTI1VDAyOjAwOjAwLjAwMFonCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvYXMtanNvbgogICAgICovCiAgICB0b0pTT04oKTogc3RyaW5nCiAgICAvKioKICAgICAqIFRvIGZvcm1hdCBhcyBhbiBJU08gODYwMSBzdHJpbmcuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9JU09TdHJpbmcoKSAvLyAnMjAxOS0wMS0yNVQwMjowMDowMC4wMDBaJwogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9kaXNwbGF5L2FzLWlzby1zdHJpbmcKICAgICAqLwogICAgdG9JU09TdHJpbmcoKTogc3RyaW5nCiAgICAvKioKICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGUuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCcyMDE5LTAxLTI1JykudG9TdHJpbmcoKSAvLyAnRnJpLCAyNSBKYW4gMjAxOSAwMjowMDowMCBHTVQnCiAgICAgKiBgYGAKICAgICAqIERvY3M6IGh0dHBzOi8vZGF5LmpzLm9yZy9kb2NzL2VuL2Rpc3BsYXkvYXMtc3RyaW5nCiAgICAgKi8KICAgIHRvU3RyaW5nKCk6IHN0cmluZwogICAgLyoqCiAgICAgKiBHZXQgdGhlIFVUQyBvZmZzZXQgaW4gbWludXRlcy4KICAgICAqIGBgYAogICAgICogZGF5anMoKS51dGNPZmZzZXQoKQogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9tYW5pcHVsYXRlL3V0Yy1vZmZzZXQKICAgICAqLwogICAgdXRjT2Zmc2V0KCk6IG51bWJlcgogICAgLyoqCiAgICAgKiBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBEYXkuanMgb2JqZWN0IGlzIGJlZm9yZSB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQmVmb3JlKGRheWpzKCcyMDExLTAxLTAxJykpIC8vIGRlZmF1bHQgbWlsbGlzZWNvbmRzCiAgICAgKiBgYGAKICAgICAqIElmIHlvdSB3YW50IHRvIGxpbWl0IHRoZSBncmFudWxhcml0eSB0byBhIHVuaXQgb3RoZXIgdGhhbiBtaWxsaXNlY29uZHMsIHBhc3MgaXQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAgICAgKiBgYGAKICAgICAqIGRheWpzKCkuaXNCZWZvcmUoJzIwMTEtMDEtMDEnLCAneWVhcicpLy8gPT4gYm9vbGVhbgogICAgICogYGBgCiAgICAgKiBVbml0cyBhcmUgY2FzZSBpbnNlbnNpdGl2ZSwgYW5kIHN1cHBvcnQgcGx1cmFsIGFuZCBzaG9ydCBmb3Jtcy4KICAgICAqCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9xdWVyeS9pcy1iZWZvcmUKICAgICAqLwogICAgaXNCZWZvcmUoZGF0ZTogQ29uZmlnVHlwZSwgdW5pdD86IE9wVW5pdFR5cGUpOiBib29sZWFuCiAgICAvKioKICAgICAqIFRoaXMgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIERheS5qcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIG90aGVyIHN1cHBsaWVkIGRhdGUtdGltZS4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc1NhbWUoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc1NhbWUoJzIwMTEtMDEtMDEnLCAneWVhcicpLy8gPT4gYm9vbGVhbgogICAgICogYGBgCiAgICAgKiBEb2NzOiBodHRwczovL2RheS5qcy5vcmcvZG9jcy9lbi9xdWVyeS9pcy1zYW1lCiAgICAgKi8KICAgIGlzU2FtZShkYXRlOiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KICAgIC8qKgogICAgICogVGhpcyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgRGF5LmpzIG9iamVjdCBpcyBhZnRlciB0aGUgb3RoZXIgc3VwcGxpZWQgZGF0ZS10aW1lLgogICAgICogYGBgCiAgICAgKiBkYXlqcygpLmlzQWZ0ZXIoZGF5anMoJzIwMTEtMDEtMDEnKSkgLy8gZGVmYXVsdCBtaWxsaXNlY29uZHMKICAgICAqIGBgYAogICAgICogSWYgeW91IHdhbnQgdG8gbGltaXQgdGhlIGdyYW51bGFyaXR5IHRvIGEgdW5pdCBvdGhlciB0aGFuIG1pbGxpc2Vjb25kcywgcGFzcyBpdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICAgICAqIGBgYAogICAgICogZGF5anMoKS5pc0FmdGVyKCcyMDExLTAxLTAxJywgJ3llYXInKS8vID0+IGJvb2xlYW4KICAgICAqIGBgYAogICAgICogVW5pdHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBzdXBwb3J0IHBsdXJhbCBhbmQgc2hvcnQgZm9ybXMuCiAgICAgKgogICAgICogRG9jczogaHR0cHM6Ly9kYXkuanMub3JnL2RvY3MvZW4vcXVlcnkvaXMtYWZ0ZXIKICAgICAqLwogICAgaXNBZnRlcihkYXRlOiBDb25maWdUeXBlLCB1bml0PzogT3BVbml0VHlwZSk6IGJvb2xlYW4KCiAgICBsb2NhbGUoKTogc3RyaW5nCgogICAgbG9jYWxlKHByZXNldDogc3RyaW5nIHwgSUxvY2FsZSwgb2JqZWN0PzogUGFydGlhbDxJTG9jYWxlPik6IERheWpzCiAgfQoKICBleHBvcnQgdHlwZSBQbHVnaW5GdW5jPFQgPSB1bmtub3duPiA9IChvcHRpb246IFQsIGM6IHR5cGVvZiBEYXlqcywgZDogdHlwZW9mIGRheWpzKSA9PiB2b2lkCgogIGV4cG9ydCBmdW5jdGlvbiBleHRlbmQ8VCA9IHVua25vd24+KHBsdWdpbjogUGx1Z2luRnVuYzxUPiwgb3B0aW9uPzogVCk6IERheWpzCgogIGV4cG9ydCBmdW5jdGlvbiBsb2NhbGUocHJlc2V0Pzogc3RyaW5nIHwgSUxvY2FsZSwgb2JqZWN0PzogUGFydGlhbDxJTG9jYWxlPiwgaXNMb2NhbD86IGJvb2xlYW4pOiBzdHJpbmcKCiAgZXhwb3J0IGZ1bmN0aW9uIGlzRGF5anMoZDogYW55KTogZCBpcyBEYXlqcwoKICBleHBvcnQgZnVuY3Rpb24gdW5peCh0OiBudW1iZXIpOiBEYXlqcwoKICBjb25zdCBMcyA6IHsgW2tleTogc3RyaW5nXSA6ICBJTG9jYWxlIH0KfQo=";
280
+ const JSONPATH_BASE64 = "Ly8gVHlwZSBkZWZpbml0aW9ucyBmb3IganNvbnBhdGggMC4yLjExDQovLyBQcm9qZWN0OiBodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9qc29ucGF0aA0KLy8gRGVmaW5pdGlvbnMgYnk6IEhpcm9raSBIb3JpdWNoaSA8aHR0cHM6Ly9naXRodWIuY29tL2hvcml1Y2hpPiwgSWthIDxodHRwczovL2dpdGh1Yi5jb20vaWthdHlhbmc+DQovLyBEZWZpbml0aW9uczogaHR0cHM6Ly9naXRodWIuY29tL0RlZmluaXRlbHlUeXBlZC9EZWZpbml0ZWx5VHlwZWQNCg0KdHlwZSBQYXRoQ29tcG9uZW50ID0gc3RyaW5nIHwgbnVtYmVyOw0KDQovKioNCiAqIEZpbmQgZWxlbWVudHMgaW4gYG9iamAgbWF0Y2hpbmcgYHBhdGhFeHByZXNzaW9uYC4gUmV0dXJucyBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0DQogKiBzYXRpc2Z5IHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uLG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vbmUgd2VyZSBtYXRjaGVkLg0KICogUmV0dXJucyBvbmx5IGZpcnN0IGBjb3VudGAgZWxlbWVudHMgaWYgc3BlY2lmaWVkLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBxdWVyeShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBhbnlbXTsNCg0KLyoqDQogKiBGaW5kIHBhdGhzIHRvIGVsZW1lbnRzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuIFJldHVybnMgYW4gYXJyYXkgb2YNCiAqIGVsZW1lbnQgcGF0aHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBKU09OUGF0aCBleHByZXNzaW9uLiBFYWNoIHBhdGggaXMgaXRzZWxmIGFuDQogKiBhcnJheSBvZiBrZXlzIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gd2l0aGluIGBvYmpgIG9mIHRoZSBtYXRjaGluZyBlbGVtZW50LiBSZXR1cm5zDQogKiBvbmx5IGZpcnN0IGBjb3VudGAgcGF0aHMgaWYgc3BlY2lmaWVkLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBwYXRocyhvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgY291bnQ/OiBudW1iZXIpOiBQYXRoQ29tcG9uZW50W11bXTsNCg0KLyoqDQogKiBGaW5kIGVsZW1lbnRzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHBhdGhzIGluIGBvYmpgIG1hdGNoaW5nIGBwYXRoRXhwcmVzc2lvbmAuDQogKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vZGUgb2JqZWN0cyB3aGVyZSBlYWNoIG5vZGUgaGFzIGEgYHBhdGhgIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YNCiAqIGtleXMgcmVwcmVzZW50aW5nIHRoZSBsb2NhdGlvbiB3aXRoaW4gYG9iamAsIGFuZCBhIGB2YWx1ZWAgcG9pbnRpbmcgdG8gdGhlIG1hdGNoZWQNCiAqIGVsZW1lbnQuIFJldHVybnMgb25seSBmaXJzdCBgY291bnRgIG5vZGVzIGlmIHNwZWNpZmllZC4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gbm9kZXMob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcsIGNvdW50PzogbnVtYmVyKTogeyBwYXRoOiBQYXRoQ29tcG9uZW50W107IHZhbHVlOiBhbnk7IH1bXTsNCg0KLyoqDQogKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgZWxlbWVudCBtYXRjaGluZyBgcGF0aEV4cHJlc3Npb25gLiBJZiBgbmV3VmFsdWVgIGlzDQogKiBwcm92aWRlZCwgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyB2YWx1ZS4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gdmFsdWUob2JqOiBhbnksIHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnk7DQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiB2YWx1ZTxUPihvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgbmV3VmFsdWU6IFQpOiBUOw0KDQovKioNCiAqIFJldHVybnMgdGhlIHBhcmVudCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudC4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gcGFyZW50KG9iajogYW55LCBwYXRoRXhwcmVzc2lvbjogc3RyaW5nKTogYW55Ow0KDQovKioNCiAqIFJ1bnMgdGhlIHN1cHBsaWVkIGZ1bmN0aW9uIGBmbmAgb24gZWFjaCBtYXRjaGluZyBlbGVtZW50LCBhbmQgcmVwbGFjZXMgZWFjaA0KICogbWF0Y2hpbmcgZWxlbWVudCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBhY2NlcHRzIHRoZQ0KICogdmFsdWUgb2YgdGhlIG1hdGNoaW5nIGVsZW1lbnQgYXMgaXRzIG9ubHkgcGFyYW1ldGVyLiBSZXR1cm5zIG1hdGNoaW5nIG5vZGVzIHdpdGgNCiAqIHRoZWlyIHVwZGF0ZWQgdmFsdWVzLg0KICovDQpleHBvcnQgZGVjbGFyZSBmdW5jdGlvbiBhcHBseShvYmo6IGFueSwgcGF0aEV4cHJlc3Npb246IHN0cmluZywgZm46ICh4OiBhbnkpID0+IGFueSk6IHsgcGF0aDogUGF0aENvbXBvbmVudFtdOyB2YWx1ZTogYW55OyB9W107DQoNCi8qKg0KICogUGFyc2UgdGhlIHByb3ZpZGVkIEpTT05QYXRoIGV4cHJlc3Npb24gaW50byBwYXRoIGNvbXBvbmVudHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQNCiAqIG9wZXJhdGlvbnMuDQogKi8NCmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHBhcnNlKHBhdGhFeHByZXNzaW9uOiBzdHJpbmcpOiBhbnlbXTsNCg0KLyoqDQogKiBSZXR1cm5zIGEgcGF0aCBleHByZXNzaW9uIGluIHN0cmluZyBmb3JtLCBnaXZlbiBhIHBhdGguIFRoZSBzdXBwbGllZCBwYXRoIG1heSBlaXRoZXINCiAqIGJlIGEgZmxhdCBhcnJheSBvZiBrZXlzLCBhcyByZXR1cm5lZCBieSBganAubm9kZXNgIGZvciBleGFtcGxlLCBvciBtYXkgYWx0ZXJuYXRpdmVseSBiZSBhDQogKiBmdWxseSBwYXJzZWQgcGF0aCBleHByZXNzaW9uIGluIHRoZSBmb3JtIG9mIGFuIGFycmF5IG9mIHBhdGggY29tcG9uZW50cyBhcyByZXR1cm5lZA0KICogYnkgYGpwLnBhcnNlYC4NCiAqLw0KZXhwb3J0IGRlY2xhcmUgZnVuY3Rpb24gc3RyaW5naWZ5KHBhdGg6IFBhdGhDb21wb25lbnRbXSk6IHN0cmluZzsNCg0KZXhwb3J0IGFzIG5hbWVzcGFjZSBqc29ucGF0aDsNCg==";
281
+
282
+ class TypeScriptToJavaScriptCompiler {
283
+ context;
284
+ fsMap;
285
+ ts;
286
+ constructor(modelManager, templateConceptFqn) {
287
+ this.context = new TypeScriptCompilationContext(modelManager, templateConceptFqn).getCompilationContext();
288
+ }
289
+ async initialize() {
290
+ if (typeof window === "undefined") {
291
+ this.ts = await import('typescript');
292
+ this.fsMap = vfs.createDefaultMapFromNodeModules({
293
+ target: this.ts.ScriptTarget.ES2020
294
+ });
295
+ } else {
296
+ this.ts = (await import('https://cdn.jsdelivr.net/npm/typescript@4.8.4/+esm')).default;
297
+ if (!this.ts) {
298
+ throw new Error("Failed to dynamically load typescript");
299
+ }
300
+ this.fsMap = await vfs.createDefaultMapFromCDN({ target: this.ts.ScriptTarget.ES2020 }, this.ts.version, false, this.ts);
301
+ }
302
+ this.fsMap.set("/node_modules/@types/dayjs/index.d.ts", Buffer.from(DAYJS_BASE64, "base64").toString());
303
+ this.fsMap.set("/node_modules/@types/jsonpath/index.d.ts", Buffer.from(JSONPATH_BASE64, "base64").toString());
304
+ }
305
+ compile(typescript) {
306
+ if (!this.fsMap) {
307
+ throw new Error("initialize must be awaited before compile is called.");
308
+ }
309
+ const twoSlashCode = `
310
+ ${this.context}
311
+ ${typescript}
312
+ `;
313
+ const options = {
314
+ fsMap: this.fsMap,
315
+ tsModule: this.ts,
316
+ lzstringModule: lzstring__namespace,
317
+ defaultOptions: {
318
+ showEmit: true,
319
+ noErrorValidation: true,
320
+ showEmittedFile: "code.js"
321
+ }
322
+ };
323
+ const result = twoslash.twoslasher(twoSlashCode, "ts", options);
324
+ return result;
325
+ }
326
+ }
327
+
328
+ var CodeType = /* @__PURE__ */ ((CodeType2) => {
329
+ CodeType2["TYPESCRIPT"] = "TYPESCRIPT";
330
+ CodeType2["ES_2020"] = "ES_2020";
331
+ return CodeType2;
332
+ })(CodeType || {});
333
+
334
+ function ensureDirSync(path) {
335
+ !fs.existsSync(path) && fs.mkdirSync(path, { recursive: true });
336
+ }
337
+ function writeFunctionToString(templateClass, functionName, returnType, code) {
338
+ let result = "";
339
+ result += "/// ---cut---\n";
340
+ result += `export function ${functionName}(data:TemplateModel.I${templateClass.getName()}, library:any, options:GenerationOptions) : ${returnType} {
341
+ `;
342
+ result += " const now = dayjs(options?.now);\n";
343
+ result += " const locale = options?.locale;\n";
344
+ templateClass.getProperties().forEach((p) => {
345
+ result += ` const ${p.getName()} = data.${p.getName()};
346
+ `;
347
+ });
348
+ result += " " + code.trim() + "\n";
349
+ result += "}\n";
350
+ result += "\n";
351
+ return result;
352
+ }
353
+ function nameUserCode(templateMarkDom) {
354
+ return traverse(templateMarkDom).map(function(x) {
355
+ if (x && (x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition` && x.condition || `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition` && x.condition)) {
356
+ x.functionName = `condition_${this.path.join("_")}`;
357
+ }
358
+ this.update(x);
359
+ });
360
+ }
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
+ function writeDebug(fw, level, concept) {
734
+ fw.writeLine(level, `// ${concertoCore.ModelUtil.getShortName(concept.$class)} ${concept.name ? `(${concept.name})` : ""}`);
735
+ }
736
+ const RUNTIME_DIR = "runtime";
737
+ function writeImports(fw, level, templateClass) {
738
+ fw.writeLine(level, `import * as CommonMark from './${markdownCommon.CommonMarkModel.NAMESPACE}';`);
739
+ fw.writeLine(level, `import * as CiceroMark from './${markdownCommon.CiceroMarkModel.NAMESPACE}';`);
740
+ fw.writeLine(level, `import * as TemplateModel from './${templateClass.getNamespace()}';`);
741
+ fw.writeLine(level, "import * as UserCode from './usercode';");
742
+ fw.writeLine(level, `import { getDrafter as $getDrafter } from './${RUNTIME_DIR}/drafting';`);
743
+ fw.writeLine(level, `import * as Runtime from './${RUNTIME_DIR}/TypeScriptRuntime';`);
744
+ }
745
+ function writeProlog(fw, level, templateClass) {
746
+ fw.writeLine(level, `export function generator(data:TemplateModel.I${templateClass.getName()}, library:any, options:Runtime.GenerationOptions) : CommonMark.IDocument {`);
747
+ fw.writeLine(level, `const docNode = {$class: '${markdownCommon.CommonMarkModel.NAMESPACE}.Document', xmlns: '${markdownCommon.CommonMarkModel.NAMESPACE}', nodes: []} as CommonMark.INode;`);
748
+ fw.writeLine(level, "const $nodes:CommonMark.INode[] = [];");
749
+ fw.writeLine(level, "const $data:any[] = [];");
750
+ fw.writeLine(level, "let $result:any = docNode;");
751
+ fw.writeLine(level, "Runtime.push($data, data);");
752
+ }
753
+ function writeEpilog(fw, level) {
754
+ fw.writeLine(level, "return $result as CommonMark.IDocument;");
755
+ fw.writeLine(level, "}");
756
+ }
757
+ function writeOpenGenerateScope(fw, level) {
758
+ fw.writeLine(level, "$result = (() => {");
759
+ }
760
+ function writeCloseGenerateScope(fw, level) {
761
+ fw.writeLine(level, "})();");
762
+ fw.writeLine(level, "Runtime.addChild($nodes, $result);");
763
+ }
764
+ function writeOpenNodeScope(fw, level) {
765
+ fw.writeLine(level, "Runtime.push($nodes, $result);");
766
+ }
767
+ function writeCloseNodeScope(fw, level) {
768
+ fw.writeLine(level, "$result = Runtime.pop($nodes);");
769
+ }
770
+ function writeOpenDataScope(fw, level, name, allowUndefined = false) {
771
+ fw.writeLine(level, `Runtime.push($data, Runtime.peekProperty($data, '${name}', ${allowUndefined}));`);
772
+ }
773
+ function writeCloseDataScope(fw, level) {
774
+ fw.writeLine(level, "Runtime.pop($data);");
775
+ }
776
+ function getTypeScriptType(ctoFqn) {
777
+ const ns = concertoCore.ModelUtil.getNamespace(ctoFqn);
778
+ const type = concertoCore.ModelUtil.getShortName(ctoFqn);
779
+ if (ns === markdownCommon.CommonMarkModel.NAMESPACE) {
780
+ return `CommonMark.I${type}`;
781
+ } else if (ns === markdownCommon.CiceroMarkModel.NAMESPACE) {
782
+ return `CiceroMark.I${type}`;
783
+ } else if (ns === markdownCommon.TemplateMarkModel.NAMESPACE) {
784
+ return `CiceroMark.I${type.substring(0, type.length - "Definition".length)}`;
785
+ } else {
786
+ throw new Error(`No type mapping for ${ctoFqn}`);
787
+ }
788
+ }
789
+ function makeCiceroMark(templateMarkNode, deep = false) {
790
+ if (!templateMarkNode.$class) {
791
+ throw new Error("Not a concerto type.");
792
+ }
793
+ const json = JSON.parse(JSON.stringify(templateMarkNode));
794
+ delete json.elementType;
795
+ if (!deep) {
796
+ delete json.nodes;
797
+ } else {
798
+ if (json.nodes) {
799
+ json.nodes = json.nodes.map((n) => makeCiceroMark(n, deep));
800
+ }
801
+ }
802
+ const ns = concertoCore.ModelUtil.getNamespace(json.$class);
803
+ const type = concertoCore.ModelUtil.getShortName(json.$class);
804
+ if (ns === markdownCommon.TemplateMarkModel.NAMESPACE) {
805
+ json.$class = `${markdownCommon.CiceroMarkModel.NAMESPACE}.${type.substring(0, type.length - "Definition".length)}`;
806
+ }
807
+ return json;
808
+ }
809
+ class AbstractComplexCompiler {
810
+ leaf;
811
+ constructor(leaf) {
812
+ this.leaf = leaf;
813
+ }
814
+ isLeaf() {
815
+ return this.leaf;
816
+ }
817
+ enter(fw, level, templateMarkNode) {
818
+ writeDebug(fw, level, templateMarkNode);
819
+ writeOpenNodeScope(fw, level);
820
+ }
821
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
822
+ exit(fw, level) {
823
+ writeCloseNodeScope(fw, level);
824
+ }
825
+ }
826
+ class AbstractSimpleCompiler extends AbstractComplexCompiler {
827
+ constructor(leaf) {
828
+ super(leaf);
829
+ }
830
+ generate(fw, level, templateMarkNode) {
831
+ const node = this.getNode(templateMarkNode);
832
+ if (this.isLeaf()) {
833
+ node.nodes = [];
834
+ }
835
+ writeOpenGenerateScope(fw, level);
836
+ fw.writeLine(level, `return ${JSON.stringify(node)} as ${getTypeScriptType(node.$class)};`);
837
+ writeCloseGenerateScope(fw, level);
838
+ }
839
+ }
840
+ class PassThrough extends AbstractSimpleCompiler {
841
+ constructor(leaf) {
842
+ super(leaf);
843
+ }
844
+ getNode(templateMarkNode) {
845
+ return makeCiceroMark(templateMarkNode);
846
+ }
847
+ }
848
+ class Ignore {
849
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
850
+ enter(fw, level, templateMarkNode) {
851
+ }
852
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
853
+ generate(fw, level, templateMarkNode) {
854
+ }
855
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
856
+ exit(fw, level, templateMarkNode) {
857
+ }
858
+ }
859
+
860
+ class Clause extends AbstractComplexCompiler {
861
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition`;
862
+ constructor() {
863
+ super(false);
864
+ }
865
+ enter(fw, level, templateMarkNode) {
866
+ writeDebug(fw, level, templateMarkNode);
867
+ writeOpenNodeScope(fw, level);
868
+ writeOpenDataScope(fw, level, templateMarkNode.name);
869
+ }
870
+ generate(fw, level, templateMarkNode) {
871
+ const clone = makeCiceroMark(templateMarkNode);
872
+ delete clone.condition;
873
+ delete clone.functionName;
874
+ const para = { $class: `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph` };
875
+ writeOpenGenerateScope(fw, level);
876
+ if (templateMarkNode.condition) {
877
+ fw.writeLine(level, `const isTrue:boolean = UserCode.${templateMarkNode.functionName}(data,library,options)`);
878
+ } else {
879
+ fw.writeLine(level, "const isTrue:boolean = true;");
880
+ }
881
+ fw.writeLine(level, "if(isTrue) {");
882
+ fw.writeLine(level, `return ${JSON.stringify(clone)} as ${getTypeScriptType(clone.$class)};`);
883
+ fw.writeLine(level, "}");
884
+ fw.writeLine(level, "else {");
885
+ fw.writeLine(level, `return ${JSON.stringify(para)} as ${getTypeScriptType(para.$class)};`);
886
+ fw.writeLine(level, "}");
887
+ writeCloseGenerateScope(fw, level);
888
+ delete templateMarkNode.condition;
889
+ }
890
+ exit(fw, level) {
891
+ writeCloseDataScope(fw, level);
892
+ writeCloseNodeScope(fw, level);
893
+ }
894
+ }
895
+
896
+ class Conditional extends AbstractComplexCompiler {
897
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition`;
898
+ constructor() {
899
+ super(false);
900
+ }
901
+ generate(fw, level, templateMarkNode) {
902
+ const clone = makeCiceroMark(templateMarkNode, true);
903
+ delete clone.condition;
904
+ delete clone.dependencies;
905
+ delete clone.functionName;
906
+ clone.isTrue = true;
907
+ writeOpenGenerateScope(fw, level);
908
+ if (templateMarkNode.condition) {
909
+ fw.writeLine(level, `const isTrue:boolean = UserCode.${templateMarkNode.functionName}(data,library,options)`);
910
+ } else {
911
+ writeOpenDataScope(fw, level, templateMarkNode.name);
912
+ fw.writeLine(level, "const isTrue:boolean = Runtime.peek($data);");
913
+ writeCloseDataScope(fw, level);
914
+ }
915
+ fw.writeLine(level, `const curNode = ${JSON.stringify(clone)} as ${getTypeScriptType(templateMarkNode.$class)};`);
916
+ fw.writeLine(level, "(curNode as CiceroMark.IConditional).isTrue = isTrue;");
917
+ fw.writeLine(level, "return curNode;");
918
+ writeCloseGenerateScope(fw, level);
919
+ delete templateMarkNode.condition;
920
+ delete templateMarkNode.whenTrue;
921
+ delete templateMarkNode.whenFalse;
922
+ }
923
+ }
924
+
925
+ class ContractDefinition extends AbstractSimpleCompiler {
926
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.ContractDefinition`;
927
+ constructor() {
928
+ super(false);
929
+ }
930
+ getNode(templateMarkNode) {
931
+ return {
932
+ $class: `${markdownCommon.CiceroMarkModel.NAMESPACE}.Contract`,
933
+ name: templateMarkNode.name,
934
+ nodes: []
935
+ };
936
+ }
937
+ }
938
+
939
+ class FormattedVariable extends AbstractComplexCompiler {
940
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.FormattedVariableDefinition`;
941
+ constructor() {
942
+ super(true);
943
+ }
944
+ generate(fw, level, templateMarkNode) {
945
+ const clone = makeCiceroMark(templateMarkNode);
946
+ writeOpenGenerateScope(fw, level);
947
+ if (templateMarkNode.name !== "this") {
948
+ writeOpenDataScope(fw, level, templateMarkNode.name);
949
+ }
950
+ fw.writeLine(level, `const drafter = $getDrafter('${templateMarkNode.elementType}');`);
951
+ fw.writeLine(level, `const text = drafter ? drafter(Runtime.peek($data), '${templateMarkNode.format}') : JSON.stringify(Runtime.peek($data)) as string;`);
952
+ if (templateMarkNode.name !== "this") {
953
+ writeCloseDataScope(fw, level);
954
+ }
955
+ fw.writeLine(level, `const variable:any = ${JSON.stringify(clone)};`);
956
+ fw.writeLine(level, "variable.value = text;");
957
+ fw.writeLine(level, `return variable as ${getTypeScriptType(clone.$class)};`);
958
+ writeCloseGenerateScope(fw, level);
959
+ }
960
+ }
961
+
962
+ class Formula extends AbstractComplexCompiler {
963
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.FormulaDefinition`;
964
+ constructor() {
965
+ super(true);
966
+ }
967
+ generate(fw, level, templateMarkNode) {
968
+ const clone = makeCiceroMark(templateMarkNode);
969
+ writeOpenGenerateScope(fw, level);
970
+ fw.writeLine(level, `const formulaResult = UserCode.${templateMarkNode.name}(data,library,options);`);
971
+ fw.writeLine(level, "const text = JSON.stringify(formulaResult);");
972
+ fw.writeLine(level, `const formula:any = ${JSON.stringify(clone)};`);
973
+ fw.writeLine(level, "formula.value = text;");
974
+ fw.writeLine(level, `formula.code = ${JSON.stringify(templateMarkNode.code.contents)};`);
975
+ fw.writeLine(level, `return formula as ${getTypeScriptType(clone.$class)};`);
976
+ writeCloseGenerateScope(fw, level);
977
+ }
978
+ }
979
+
980
+ class Join extends AbstractComplexCompiler {
981
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.JoinDefinition`;
982
+ constructor() {
983
+ super(true);
984
+ }
985
+ generate(fw, level, templateMarkNode) {
986
+ writeOpenGenerateScope(fw, level);
987
+ writeOpenDataScope(fw, level, templateMarkNode.name);
988
+ fw.writeLine(level, `const joinDef = ${JSON.stringify(templateMarkNode)};`);
989
+ fw.writeLine(level, "const text = Runtime.joinList(Runtime.peek($data), joinDef, options);");
990
+ writeCloseDataScope(fw, level);
991
+ fw.writeLine(level, `return { $class: '${markdownCommon.CommonMarkModel.NAMESPACE}.Text', text: text } as ${getTypeScriptType(markdownCommon.CommonMarkModel.NAMESPACE + ".Text")};`);
992
+ writeCloseGenerateScope(fw, level);
993
+ delete templateMarkNode.nodes;
994
+ }
995
+ }
996
+
997
+ class ListBlock extends AbstractComplexCompiler {
998
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.ListBlockDefinition`;
999
+ constructor() {
1000
+ super(false);
1001
+ }
1002
+ enter(fw, level, templateMarkNode) {
1003
+ writeDebug(fw, level, templateMarkNode);
1004
+ writeOpenNodeScope(fw, level);
1005
+ writeOpenDataScope(fw, level, templateMarkNode.name);
1006
+ }
1007
+ generate(fw, level, templateMarkNode, doIt) {
1008
+ if (templateMarkNode?.nodes?.[0]) {
1009
+ const clone = makeCiceroMark(templateMarkNode?.nodes?.[0]);
1010
+ writeOpenGenerateScope(fw, level);
1011
+ fw.writeLine(level, `const result = ${JSON.stringify(clone)} as ${getTypeScriptType(templateMarkNode.$class)};`);
1012
+ fw.writeLine(level, "Runtime.peek($data).forEach( (item:any) => {");
1013
+ fw.writeLine(level, "Runtime.push($data,item);");
1014
+ if (templateMarkNode.nodes?.[0].nodes?.[0]) {
1015
+ doIt(fw, level + 1, templateMarkNode.nodes[0].nodes[0]);
1016
+ delete templateMarkNode.nodes;
1017
+ }
1018
+ fw.writeLine(level, "Runtime.pop($data);");
1019
+ fw.writeLine(level, "});");
1020
+ fw.writeLine(level, "return result;");
1021
+ writeCloseGenerateScope(fw, level);
1022
+ }
1023
+ }
1024
+ exit(fw, level) {
1025
+ writeCloseDataScope(fw, level);
1026
+ writeCloseNodeScope(fw, level);
1027
+ }
1028
+ }
1029
+
1030
+ class Optional extends AbstractComplexCompiler {
1031
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.OptionalDefinition`;
1032
+ constructor() {
1033
+ super(false);
1034
+ }
1035
+ enter(fw, level, templateMarkNode) {
1036
+ writeDebug(fw, level, templateMarkNode);
1037
+ writeOpenNodeScope(fw, level);
1038
+ writeOpenDataScope(fw, level, templateMarkNode.name, true);
1039
+ }
1040
+ generate(fw, level, templateMarkNode, doIt) {
1041
+ const clone = makeCiceroMark(templateMarkNode);
1042
+ delete clone.nodes;
1043
+ delete clone.whenSome;
1044
+ delete clone.whenNone;
1045
+ writeOpenGenerateScope(fw, level);
1046
+ fw.writeLine(level, `const result = ${JSON.stringify(clone)} as ${getTypeScriptType(templateMarkNode.$class)};`);
1047
+ fw.writeLine(level, "const hasSome:boolean = !(Runtime.peek($data) === null || Runtime.peek($data) === undefined);");
1048
+ fw.writeLine(level, "(result as CiceroMark.IOptional).hasSome = hasSome;");
1049
+ fw.writeLine(level, "if(hasSome) {");
1050
+ doIt(fw, level + 1, { $class: `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`, nodes: templateMarkNode.whenSome });
1051
+ fw.writeLine(level, "(result as CiceroMark.IOptional).whenSome = $result.nodes[0];");
1052
+ fw.writeLine(level, "(result as CiceroMark.IOptional).whenNone = $result.nodes[0];");
1053
+ fw.writeLine(level, "return result;");
1054
+ fw.writeLine(level, "}");
1055
+ fw.writeLine(level, "else {");
1056
+ doIt(fw, level + 1, { $class: `${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`, nodes: templateMarkNode.whenNone });
1057
+ fw.writeLine(level, "(result as CiceroMark.IOptional).whenNone = $result.nodes[0];");
1058
+ fw.writeLine(level, "(result as CiceroMark.IOptional).whenSome = $result.nodes[0];");
1059
+ fw.writeLine(level, "return result;");
1060
+ fw.writeLine(level, "}");
1061
+ writeCloseGenerateScope(fw, level);
1062
+ delete templateMarkNode.nodes;
1063
+ delete templateMarkNode.whenSome;
1064
+ delete templateMarkNode.whenNone;
1065
+ }
1066
+ exit(fw, level) {
1067
+ writeCloseDataScope(fw, level);
1068
+ writeCloseNodeScope(fw, level);
1069
+ }
1070
+ }
1071
+
1072
+ class Variable extends AbstractComplexCompiler {
1073
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.VariableDefinition`;
1074
+ constructor() {
1075
+ super(true);
1076
+ }
1077
+ generate(fw, level, templateMarkNode) {
1078
+ const clone = makeCiceroMark(templateMarkNode);
1079
+ writeOpenGenerateScope(fw, level);
1080
+ if (templateMarkNode.name !== "this") {
1081
+ writeOpenDataScope(fw, level, templateMarkNode.name);
1082
+ }
1083
+ fw.writeLine(level, "const text = JSON.stringify(Runtime.peek($data)) as string;");
1084
+ if (templateMarkNode.name !== "this") {
1085
+ writeCloseDataScope(fw, level);
1086
+ }
1087
+ fw.writeLine(level, `const variable:any = ${JSON.stringify(clone)};`);
1088
+ fw.writeLine(level, "variable.value = text;");
1089
+ fw.writeLine(level, `return variable as ${getTypeScriptType(clone.$class)};`);
1090
+ writeCloseGenerateScope(fw, level);
1091
+ }
1092
+ }
1093
+
1094
+ class With extends AbstractComplexCompiler {
1095
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.WithDefinition`;
1096
+ constructor() {
1097
+ super(false);
1098
+ }
1099
+ enter(fw, level, templateMarkNode) {
1100
+ writeDebug(fw, level, templateMarkNode);
1101
+ writeOpenDataScope(fw, level, templateMarkNode.name);
1102
+ }
1103
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
1104
+ generate(fw, level, templateMarkNode) {
1105
+ }
1106
+ exit(fw, level) {
1107
+ writeCloseDataScope(fw, level);
1108
+ }
1109
+ }
1110
+
1111
+ class EnumVariable extends AbstractComplexCompiler {
1112
+ static TYPE = `${markdownCommon.TemplateMarkModel.NAMESPACE}.EnumVariableDefinition`;
1113
+ constructor() {
1114
+ super(true);
1115
+ }
1116
+ generate(fw, level, templateMarkNode) {
1117
+ const clone = makeCiceroMark(templateMarkNode);
1118
+ writeOpenGenerateScope(fw, level);
1119
+ if (templateMarkNode.name !== "this") {
1120
+ writeOpenDataScope(fw, level, templateMarkNode.name);
1121
+ }
1122
+ fw.writeLine(level, "const text = JSON.stringify(Runtime.peek($data)) as string;");
1123
+ if (templateMarkNode.name !== "this") {
1124
+ writeCloseDataScope(fw, level);
1125
+ }
1126
+ fw.writeLine(level, `const variable:any = ${JSON.stringify(clone)};`);
1127
+ fw.writeLine(level, "variable.value = text;");
1128
+ fw.writeLine(level, `return variable as ${getTypeScriptType(clone.$class)};`);
1129
+ writeCloseGenerateScope(fw, level);
1130
+ }
1131
+ }
1132
+
1133
+ const NODE_COMPILERS = {};
1134
+ NODE_COMPILERS[ContractDefinition.TYPE] = new ContractDefinition();
1135
+ NODE_COMPILERS[Variable.TYPE] = new Variable();
1136
+ NODE_COMPILERS[EnumVariable.TYPE] = new EnumVariable();
1137
+ NODE_COMPILERS[FormattedVariable.TYPE] = new FormattedVariable();
1138
+ NODE_COMPILERS[Formula.TYPE] = new Formula();
1139
+ NODE_COMPILERS[Conditional.TYPE] = new Conditional();
1140
+ NODE_COMPILERS[Join.TYPE] = new Join();
1141
+ NODE_COMPILERS[With.TYPE] = new With();
1142
+ NODE_COMPILERS[Clause.TYPE] = new Clause();
1143
+ NODE_COMPILERS[Optional.TYPE] = new Optional();
1144
+ NODE_COMPILERS[ListBlock.TYPE] = new ListBlock();
1145
+ NODE_COMPILERS[`${markdownCommon.TemplateMarkModel.NAMESPACE}.Code`] = new Ignore();
1146
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Document`] = new Ignore();
1147
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Paragraph`] = new PassThrough(false);
1148
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Text`] = new PassThrough(true);
1149
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Attribute`] = new PassThrough(false);
1150
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.TagInfo`] = new PassThrough(false);
1151
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.CodeBlock`] = new PassThrough(false);
1152
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Code`] = new PassThrough(false);
1153
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.HtmlInline`] = new PassThrough(false);
1154
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.HtmlBlock`] = new PassThrough(false);
1155
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Emph`] = new PassThrough(false);
1156
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Strong`] = new PassThrough(false);
1157
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.BlockQuote`] = new PassThrough(false);
1158
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Heading`] = new PassThrough(false);
1159
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.ThematicBreak`] = new PassThrough(false);
1160
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Softbreak`] = new PassThrough(false);
1161
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Linebreak`] = new PassThrough(false);
1162
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Link`] = new PassThrough(false);
1163
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Image`] = new PassThrough(false);
1164
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.List`] = new PassThrough(false);
1165
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Item`] = new PassThrough(false);
1166
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.Table`] = new PassThrough(false);
1167
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.TableHead`] = new PassThrough(false);
1168
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.TableBody`] = new PassThrough(false);
1169
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.TableRow`] = new PassThrough(false);
1170
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.TableRow`] = new PassThrough(false);
1171
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.HeaderCell`] = new PassThrough(false);
1172
+ NODE_COMPILERS[`${markdownCommon.CommonMarkModel.NAMESPACE}.TableCell`] = new PassThrough(false);
1173
+ function getCompiler(fqn) {
1174
+ const compiler = NODE_COMPILERS[fqn];
1175
+ if (!compiler) {
1176
+ throw new Error(`No compiler found for node ${fqn}`);
1177
+ }
1178
+ return compiler;
1179
+ }
1180
+
1181
+ const RUNTIME_TGZ_BASE64 = "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";
1182
+
1183
+ class TemplateMarkToTypeScriptCompiler {
1184
+ modelManager;
1185
+ templateClass;
1186
+ constructor(modelManager, templateConceptFqn) {
1187
+ this.modelManager = modelManager;
1188
+ this.templateClass = getTemplateClassDeclaration(this.modelManager, templateConceptFqn);
1189
+ }
1190
+ writeFunction(fw, functionName, returnType, code) {
1191
+ fw.writeLine(0, writeFunctionToString(this.templateClass, functionName, returnType, code));
1192
+ }
1193
+ /**
1194
+ * Get a model manager with templatemark model
1195
+ * @param {string} outputDir the output directory
1196
+ * @returns {ModelManager} the model manager
1197
+ */
1198
+ getTemplateMarkModelManager() {
1199
+ const modelManager = new concertoCore.ModelManager({ strict: true });
1200
+ modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
1201
+ modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
1202
+ modelManager.addCTOModel(markdownCommon.TemplateMarkModel.MODEL, "templatemark.cto");
1203
+ return modelManager;
1204
+ }
1205
+ /**
1206
+ * Get a model manager with templatemark model
1207
+ * @param {string} outputDir the output directory
1208
+ * @returns {ModelManager} the model manager
1209
+ */
1210
+ getCiceroMarkModelManager() {
1211
+ const modelManager = new concertoCore.ModelManager({ strict: true });
1212
+ modelManager.addCTOModel(markdownCommon.ConcertoMetaModel.MODEL, "concertometamodel.cto");
1213
+ modelManager.addCTOModel(markdownCommon.CommonMarkModel.MODEL, "commonmark.cto");
1214
+ modelManager.addCTOModel(markdownCommon.CiceroMarkModel.MODEL, "ciceromark.cto");
1215
+ return modelManager;
1216
+ }
1217
+ generateTypeScript(modelManager, outputDir) {
1218
+ const tsVisitor = new concertoCodegen.CodeGen.TypescriptVisitor();
1219
+ const parameters = {
1220
+ fileWriter: new concertoUtil.FileWriter(outputDir)
1221
+ };
1222
+ modelManager.accept(tsVisitor, parameters);
1223
+ }
1224
+ generateSampleData(modelManager, outputDir) {
1225
+ const factory = new concertoCore.Factory(modelManager);
1226
+ const instance = factory.newResource(
1227
+ this.templateClass.getNamespace(),
1228
+ this.templateClass.getName(),
1229
+ this.templateClass.isIdentified() ? "sample" : void 0,
1230
+ { generate: "sample", includeOptionalFields: true }
1231
+ );
1232
+ fs.writeFileSync(`${outputDir}/sample.json`, JSON.stringify(instance, null, 2));
1233
+ }
1234
+ /**
1235
+ * The main iteration function over templatemark. This function
1236
+ * looks up an INodeCompiler that can handle each templatemark node
1237
+ * and delegates to it for code generation.
1238
+ * Note that the result of code generation (a CiceroMark node) is left in
1239
+ * the $result global varianble.
1240
+ * @param {FileWriter} fw the file writer to use
1241
+ * @param {number} level the indentation level
1242
+ * @param {object} templateMark the templatemark node to iterate over
1243
+ */
1244
+ static doIt(fw, level, templateMark) {
1245
+ fw.writeLine(level, `// start processing ${concertoCore.ModelUtil.getShortName(templateMark.$class)}`);
1246
+ traverse(templateMark).forEach(function(context) {
1247
+ if (typeof context === "object" && context.$class && typeof context.$class === "string") {
1248
+ const nodeClass = context.$class;
1249
+ const compiler = getCompiler(nodeClass);
1250
+ const sourceLevel = level + 1;
1251
+ this.before(() => {
1252
+ compiler.enter(fw, sourceLevel, context);
1253
+ compiler.generate(fw, sourceLevel, context, TemplateMarkToTypeScriptCompiler.doIt);
1254
+ });
1255
+ this.after(() => {
1256
+ compiler.exit(fw, sourceLevel, context);
1257
+ });
1258
+ }
1259
+ });
1260
+ fw.writeLine(level, `// end processing ${concertoCore.ModelUtil.getShortName(templateMark.$class)}`);
1261
+ }
1262
+ /**
1263
+ * Converts a TemplateMark document to typescript code that is parameterised
1264
+ * by the 'data' argument.
1265
+ *
1266
+ * The strategy is to traverse the template mark json, converting each node into
1267
+ * typescript statements that add an equivalent ciceromark node. Variables will
1268
+ * pull values from 'data'.
1269
+ *
1270
+ * Conditionals and formulae will call the functions produced by
1271
+ * compileUserCode.
1272
+ *
1273
+ * Note that code generation process is itself recursive, for example, when
1274
+ * a list definition node is encountered the list must be iterated over
1275
+ * based on a variable value coming from data, and code must be
1276
+ * generated to produce each list item.
1277
+ *
1278
+ * All internal variables are prefixed with '$' to ensure (?)
1279
+ * that they cannot collide with end user variable names.
1280
+ *
1281
+ * @param {IDocument} templateMark the TemplateMark Concerto resource
1282
+ * @param {string} outputDir the output directory for code
1283
+ */
1284
+ compileGenerator(templateMark, outputDir) {
1285
+ const fw = new concertoUtil.FileWriter(outputDir);
1286
+ fw.openFile("index.ts");
1287
+ fw.writeLine(0, "// generated code");
1288
+ fw.writeLine(0, "import { readFileSync } from 'fs';");
1289
+ fw.writeLine(0, "import { generator } from './generator';");
1290
+ fw.writeLine(0, "if(process.argv.length === 3) {");
1291
+ fw.writeLine(1, "const result = generator( JSON.parse(readFileSync(process.argv[2], 'utf-8')), {}, {});");
1292
+ fw.writeLine(1, "console.log(JSON.stringify(result, null, 2));");
1293
+ fw.writeLine(0, "}");
1294
+ fw.writeLine(0, "else {");
1295
+ fw.writeLine(1, "console.log('First argument is path to JSON data file');");
1296
+ fw.writeLine(0, "}");
1297
+ fw.closeFile();
1298
+ fw.openFile("generator.ts");
1299
+ fw.writeLine(0, "// generated code, do not modify");
1300
+ fw.writeLine(0, "");
1301
+ fw.writeLine(0, "// IMPORTS");
1302
+ writeImports(fw, 0, this.templateClass);
1303
+ fw.writeLine(0, "");
1304
+ fw.writeLine(0, "// GENERATOR");
1305
+ writeProlog(fw, 0, this.templateClass);
1306
+ TemplateMarkToTypeScriptCompiler.doIt(fw, 1, templateMark);
1307
+ writeEpilog(fw, 0);
1308
+ fw.closeFile();
1309
+ }
1310
+ /**
1311
+ * Decompresses the base64 zipped runtime into an output folder.
1312
+ * @param {string} outputDir the output directory to copy the runtime to
1313
+ */
1314
+ copyRuntime(outputDir) {
1315
+ ensureDirSync(`${outputDir}/${RUNTIME_DIR}`);
1316
+ const runtimeBuffer = Buffer.from(RUNTIME_TGZ_BASE64, "base64");
1317
+ const s = new stream.Readable();
1318
+ s.push(runtimeBuffer);
1319
+ s.push(null);
1320
+ s.pipe(
1321
+ tar__namespace.x({
1322
+ strip: 2,
1323
+ C: `${outputDir}/${RUNTIME_DIR}`
1324
+ })
1325
+ );
1326
+ }
1327
+ /**
1328
+ * Create package.json for the generated code
1329
+ * @param {string} outputDir the output directory to copy the runtime to
1330
+ */
1331
+ createPackage(outputDir) {
1332
+ const packageJson = {
1333
+ "name": "generated",
1334
+ "version": "1.0.0",
1335
+ "description": "TypeScript code generated from TemplateMark",
1336
+ "engines": {
1337
+ "node": ">=14",
1338
+ "npm": ">=6"
1339
+ },
1340
+ "keywords": [
1341
+ "accord project",
1342
+ "template",
1343
+ "templatemark"
1344
+ ],
1345
+ "dependencies": {
1346
+ "dayjs": "1.11.7",
1347
+ "jsonpath": "^1.1.1"
1348
+ },
1349
+ "devDependencies": {
1350
+ "@types/node": "^20.2.0",
1351
+ "ts-node": "^10.9.1",
1352
+ "typescript": "^5.0.2",
1353
+ "@types/jsonpath": "^0.2.0"
1354
+ },
1355
+ "scripts": {
1356
+ "start": "ts-node index.ts sample.json"
1357
+ }
1358
+ };
1359
+ fs.writeFileSync(`${outputDir}/package.json`, JSON.stringify(packageJson, null, 2));
1360
+ }
1361
+ compile(templateMark, outputDir, options) {
1362
+ ensureDirSync(outputDir);
1363
+ this.generateSampleData(this.modelManager, outputDir);
1364
+ this.generateTypeScript(this.modelManager, outputDir);
1365
+ this.generateTypeScript(this.getTemplateMarkModelManager(), outputDir);
1366
+ this.generateTypeScript(this.getCiceroMarkModelManager(), outputDir);
1367
+ const namedTemplateMark = nameUserCode(templateMark.toJSON ? templateMark.toJSON() : templateMark);
1368
+ this.compileUserCode(namedTemplateMark, outputDir);
1369
+ if (!options?.skipCopyRuntime) {
1370
+ this.copyRuntime(outputDir);
1371
+ }
1372
+ if (!options?.skipGenerator) {
1373
+ this.createPackage(outputDir);
1374
+ this.compileGenerator(namedTemplateMark, outputDir);
1375
+ }
1376
+ }
1377
+ compileUserCode(templateMark, outputDir) {
1378
+ const fw = new concertoUtil.FileWriter(outputDir);
1379
+ fw.openFile("usercode.ts");
1380
+ fw.writeLine(0, "// generated code, do not modify");
1381
+ fw.writeLine(0, "");
1382
+ fw.writeLine(0, "// IMPORTS");
1383
+ fw.writeLine(0, `import * as TemplateModel from './${this.templateClass.getNamespace()}';`);
1384
+ fw.writeLine(0, "import dayjs from 'dayjs';");
1385
+ fw.writeLine(0, "import jp from 'jsonpath';");
1386
+ fw.writeLine(0, "import {GenerationOptions} from './runtime/TypeScriptRuntime';");
1387
+ fw.writeLine(0, "");
1388
+ const templateMarkDom = templateMark;
1389
+ const functionNodes = traverse(templateMarkDom).reduce(function(acc, x) {
1390
+ if (x && x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.FormulaDefinition`) {
1391
+ acc.push({
1392
+ name: x.name,
1393
+ code: x.code
1394
+ });
1395
+ }
1396
+ return acc;
1397
+ }, []);
1398
+ const conditionalNodes = traverse(templateMarkDom).reduce(function(acc, x) {
1399
+ if (x && x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ConditionalDefinition` && x.condition) {
1400
+ acc.push({
1401
+ name: x.functionName,
1402
+ code: x.condition
1403
+ });
1404
+ }
1405
+ return acc;
1406
+ }, []);
1407
+ const clauseNodes = traverse(templateMarkDom).reduce(function(acc, x) {
1408
+ if (x && x.$class === `${markdownCommon.TemplateMarkModel.NAMESPACE}.ClauseDefinition` && x.condition) {
1409
+ acc.push({
1410
+ name: x.functionName,
1411
+ code: x.condition
1412
+ });
1413
+ }
1414
+ return acc;
1415
+ }, []);
1416
+ fw.writeLine(0, "// FORMULAE");
1417
+ functionNodes.forEach((fun) => {
1418
+ this.writeFunction(fw, `${fun.name}`, "any", fun.code.contents);
1419
+ });
1420
+ fw.writeLine(0, "");
1421
+ fw.writeLine(0, "// CONDITIONALS");
1422
+ conditionalNodes.forEach((fun) => {
1423
+ this.writeFunction(fw, `${fun.name}`, "boolean", fun.code.contents);
1424
+ });
1425
+ fw.writeLine(0, "");
1426
+ fw.writeLine(0, "// CLAUSES");
1427
+ clauseNodes.forEach((fun) => {
1428
+ this.writeFunction(fw, `${fun.name}`, "boolean", fun.code.contents);
1429
+ });
1430
+ fw.writeLine(0, "");
1431
+ fw.closeFile();
1432
+ }
1433
+ }
1434
+
1435
+ exports.TemplateMarkInterpreter = TemplateMarkInterpreter;
1436
+ exports.TemplateMarkToTypeScriptCompiler = TemplateMarkToTypeScriptCompiler;
1437
+ //# sourceMappingURL=index.js.map