@citolab/qti-components 6.9.1-beta.8 → 6.9.1-beta.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-element-eslint-rules.js +331 -0
- package/dist/custom-elements.json +21105 -4972
- package/dist/index.global.js +226 -0
- package/dist/index.js +7323 -1786
- package/dist/index.min.js +952 -0
- package/dist/item.css +2405 -697
- package/dist/qti-components/index.cjs +6509 -0
- package/dist/qti-components/index.d.cts +150 -0
- package/dist/qti-components/index.d.ts +6 -6
- package/dist/qti-components/index.js +6013 -182
- package/dist/qti-components-jsx.d.ts +1836 -0
- package/dist/qti-item/index.cjs +90 -0
- package/dist/qti-item/index.d.cts +24 -0
- package/dist/qti-item/index.d.ts +15 -10
- package/dist/qti-item/index.js +64 -1504
- package/dist/qti-loader/index.cjs +333 -0
- package/dist/qti-loader/index.d.cts +20 -0
- package/dist/qti-loader/index.d.ts +19 -4
- package/dist/qti-loader/index.js +306 -2
- package/dist/{qti-simple-choice-CafJuhnH.d.ts → qti-simple-choice-DC5DJota.d.cts} +116 -152
- package/dist/qti-simple-choice-DC5DJota.d.ts +1137 -0
- package/dist/qti-transformers/index.cjs +317 -0
- package/dist/qti-transformers/index.d.cts +75 -0
- package/dist/qti-transformers/index.d.ts +25 -120
- package/dist/qti-transformers/index.js +289 -2
- package/dist/vscode.css-custom-data.json +44 -0
- package/dist/vscode.html-custom-data.json +965 -0
- package/package.json +144 -63
- package/dist/chunk-62FWJYVB.js +0 -24
- package/dist/chunk-E7TLXHQH.js +0 -2
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
|
|
19
|
+
// src/lib/qti-transformers/index.ts
|
|
20
|
+
var qti_transformers_exports = {};
|
|
21
|
+
__export(qti_transformers_exports, {
|
|
22
|
+
qtiTransformItem: () => qtiTransformItem,
|
|
23
|
+
qtiTransformManifest: () => qtiTransformManifest,
|
|
24
|
+
qtiTransformTest: () => qtiTransformTest
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(qti_transformers_exports);
|
|
27
|
+
|
|
28
|
+
// src/lib/qti-transformers/qti-transformers.ts
|
|
29
|
+
var xml = String.raw;
|
|
30
|
+
var xmlToHTML = xml`<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
|
31
|
+
<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
|
|
32
|
+
<xsl:template match="@*|node()">
|
|
33
|
+
<xsl:copy>
|
|
34
|
+
<xsl:apply-templates select="@*|node()"/>
|
|
35
|
+
</xsl:copy>
|
|
36
|
+
</xsl:template>
|
|
37
|
+
|
|
38
|
+
<!-- remove existing namespaces -->
|
|
39
|
+
<xsl:template match="*">
|
|
40
|
+
<!-- remove element prefix -->
|
|
41
|
+
<xsl:element name="{local-name()}">
|
|
42
|
+
<!-- process attributes -->
|
|
43
|
+
<xsl:for-each select="@*">
|
|
44
|
+
<!-- remove attribute prefix -->
|
|
45
|
+
<xsl:attribute name="{local-name()}">
|
|
46
|
+
<xsl:value-of select="."/>
|
|
47
|
+
</xsl:attribute>
|
|
48
|
+
</xsl:for-each>
|
|
49
|
+
<xsl:apply-templates/>
|
|
50
|
+
</xsl:element>
|
|
51
|
+
</xsl:template>
|
|
52
|
+
</xsl:stylesheet>`;
|
|
53
|
+
function extendElementName(xmlFragment, tagName, extension) {
|
|
54
|
+
xmlFragment.querySelectorAll(tagName).forEach((element) => {
|
|
55
|
+
const newTagName = `${tagName}-${extension}`;
|
|
56
|
+
const newElement = createElementWithNewTagName(element, newTagName);
|
|
57
|
+
element.replaceWith(newElement);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function extendElementsWithClass(xmlFragment, classNamePattern) {
|
|
61
|
+
xmlFragment.querySelectorAll("*").forEach((element) => {
|
|
62
|
+
const classList = element.classList;
|
|
63
|
+
if (classList) {
|
|
64
|
+
classList.forEach((className) => {
|
|
65
|
+
if (className.startsWith(`${classNamePattern}:`)) {
|
|
66
|
+
const suffix = className.slice(`${classNamePattern}:`.length);
|
|
67
|
+
const newTagName = `${element.nodeName}-${suffix}`;
|
|
68
|
+
const newElement = createElementWithNewTagName(element, newTagName);
|
|
69
|
+
element.replaceWith(newElement);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function createElementWithNewTagName(element, newTagName) {
|
|
76
|
+
const newElement = document.createElement(newTagName);
|
|
77
|
+
for (const attr of element.attributes) {
|
|
78
|
+
newElement.setAttribute(attr.name, attr.value);
|
|
79
|
+
}
|
|
80
|
+
while (element.firstChild) {
|
|
81
|
+
newElement.appendChild(element.firstChild);
|
|
82
|
+
}
|
|
83
|
+
return newElement;
|
|
84
|
+
}
|
|
85
|
+
function itemsFromTest(xmlFragment) {
|
|
86
|
+
const items = [];
|
|
87
|
+
xmlFragment.querySelectorAll("qti-assessment-item-ref").forEach((el) => {
|
|
88
|
+
const identifier = el.getAttribute("identifier");
|
|
89
|
+
const href = el.getAttribute("href");
|
|
90
|
+
const category = el.getAttribute("category");
|
|
91
|
+
items.push({ identifier, href, category });
|
|
92
|
+
});
|
|
93
|
+
return items;
|
|
94
|
+
}
|
|
95
|
+
var currentRequest = null;
|
|
96
|
+
function loadXML(url, cancelPreviousRequest = false) {
|
|
97
|
+
if (cancelPreviousRequest && currentRequest !== null) {
|
|
98
|
+
currentRequest.abort();
|
|
99
|
+
}
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
const xhr = new XMLHttpRequest();
|
|
102
|
+
currentRequest = xhr;
|
|
103
|
+
xhr.open("GET", url, true);
|
|
104
|
+
xhr.responseType = "document";
|
|
105
|
+
xhr.onload = () => {
|
|
106
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
107
|
+
resolve(xhr.responseXML);
|
|
108
|
+
} else {
|
|
109
|
+
reject(xhr.statusText);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
xhr.onerror = () => {
|
|
113
|
+
reject(xhr.statusText);
|
|
114
|
+
};
|
|
115
|
+
xhr.send();
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function parseXML(xmlDocument) {
|
|
119
|
+
const parser = new DOMParser();
|
|
120
|
+
const xmlFragment = parser.parseFromString(xmlDocument, "text/xml");
|
|
121
|
+
return xmlFragment;
|
|
122
|
+
}
|
|
123
|
+
function toHTML(xmlFragment) {
|
|
124
|
+
const processor = new XSLTProcessor();
|
|
125
|
+
const xsltDocument = new DOMParser().parseFromString(xmlToHTML, "text/xml");
|
|
126
|
+
processor.importStylesheet(xsltDocument);
|
|
127
|
+
const itemHTMLFragment = processor.transformToFragment(xmlFragment, document);
|
|
128
|
+
return itemHTMLFragment;
|
|
129
|
+
}
|
|
130
|
+
function setLocation(xmlFragment, location) {
|
|
131
|
+
if (!location.endsWith("/")) {
|
|
132
|
+
location += "/";
|
|
133
|
+
}
|
|
134
|
+
xmlFragment.querySelectorAll("[src],[href],[primary-path]").forEach((elWithSrc) => {
|
|
135
|
+
var _a;
|
|
136
|
+
let attr = "";
|
|
137
|
+
if (elWithSrc.getAttribute("src")) {
|
|
138
|
+
attr = "src";
|
|
139
|
+
}
|
|
140
|
+
if (elWithSrc.getAttribute("href")) {
|
|
141
|
+
attr = "href";
|
|
142
|
+
}
|
|
143
|
+
if (elWithSrc.getAttribute("primary-path")) {
|
|
144
|
+
attr = "primary-path";
|
|
145
|
+
}
|
|
146
|
+
const attrValue = (_a = elWithSrc.getAttribute(attr)) == null ? void 0 : _a.trim();
|
|
147
|
+
if (!attrValue.startsWith("data:") && !attrValue.startsWith("http")) {
|
|
148
|
+
const newSrcValue = location + encodeURI(attrValue);
|
|
149
|
+
elWithSrc.setAttribute(attr, newSrcValue);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function convertCDATAtoComment(xmlFragment) {
|
|
154
|
+
const cdataElements = xmlFragment.querySelectorAll('qti-custom-operator[class="js.org"] > qti-base-value');
|
|
155
|
+
cdataElements.forEach((element) => {
|
|
156
|
+
const commentText = document.createComment(element.textContent);
|
|
157
|
+
element.replaceChild(commentText, element.firstChild);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
function stripStyleSheets(xmlFragment) {
|
|
161
|
+
xmlFragment.querySelectorAll("qti-stylesheet").forEach((stylesheet) => stylesheet.remove());
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// src/lib/qti-transformers/qti-transform-item.ts
|
|
165
|
+
var qtiTransformItem = () => {
|
|
166
|
+
let xmlFragment;
|
|
167
|
+
const api = {
|
|
168
|
+
async load(uri, cancelPreviousRequest = false) {
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
loadXML(uri, cancelPreviousRequest).then((xml2) => {
|
|
171
|
+
xmlFragment = xml2;
|
|
172
|
+
api.path(uri.substring(0, uri.lastIndexOf("/")));
|
|
173
|
+
return resolve(api);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
},
|
|
177
|
+
parse(xmlString) {
|
|
178
|
+
xmlFragment = parseXML(xmlString);
|
|
179
|
+
return api;
|
|
180
|
+
},
|
|
181
|
+
path: (location) => {
|
|
182
|
+
setLocation(xmlFragment, location);
|
|
183
|
+
return api;
|
|
184
|
+
},
|
|
185
|
+
fn(fn) {
|
|
186
|
+
fn(xmlFragment);
|
|
187
|
+
return api;
|
|
188
|
+
},
|
|
189
|
+
pciHooks(uri) {
|
|
190
|
+
const attributes = ["hook", "module"];
|
|
191
|
+
const documentPath = uri.substring(0, uri.lastIndexOf("/"));
|
|
192
|
+
for (const attribute of attributes) {
|
|
193
|
+
const srcAttributes = xmlFragment.querySelectorAll("[" + attribute + "]");
|
|
194
|
+
srcAttributes.forEach((node) => {
|
|
195
|
+
const srcValue = node.getAttribute(attribute);
|
|
196
|
+
if (!srcValue.startsWith("data:") && !srcValue.startsWith("http")) {
|
|
197
|
+
node.setAttribute("base-url", uri);
|
|
198
|
+
node.setAttribute(
|
|
199
|
+
"module",
|
|
200
|
+
documentPath + "/" + encodeURI(srcValue + (srcValue.endsWith(".js") ? "" : ".js"))
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return api;
|
|
206
|
+
},
|
|
207
|
+
extendElementName: (tagName, extension) => {
|
|
208
|
+
extendElementName(xmlFragment, tagName, extension);
|
|
209
|
+
return api;
|
|
210
|
+
},
|
|
211
|
+
extendElementsWithClass: (param = "extend") => {
|
|
212
|
+
extendElementsWithClass(xmlFragment, param);
|
|
213
|
+
return api;
|
|
214
|
+
},
|
|
215
|
+
customInteraction(baseRef, baseItem) {
|
|
216
|
+
const qtiCustomInteraction = xmlFragment.querySelector("qti-custom-interaction");
|
|
217
|
+
const qtiCustomInteractionObject = qtiCustomInteraction.querySelector("object");
|
|
218
|
+
qtiCustomInteraction.setAttribute("data-base-ref", baseRef);
|
|
219
|
+
qtiCustomInteraction.setAttribute("data-base-item", baseRef + baseItem);
|
|
220
|
+
qtiCustomInteraction.setAttribute("data", qtiCustomInteractionObject.getAttribute("data"));
|
|
221
|
+
qtiCustomInteraction.setAttribute("width", qtiCustomInteractionObject.getAttribute("width"));
|
|
222
|
+
qtiCustomInteraction.setAttribute("height", qtiCustomInteractionObject.getAttribute("height"));
|
|
223
|
+
qtiCustomInteraction.removeChild(qtiCustomInteractionObject);
|
|
224
|
+
return api;
|
|
225
|
+
},
|
|
226
|
+
convertCDATAtoComment() {
|
|
227
|
+
convertCDATAtoComment(xmlFragment);
|
|
228
|
+
return api;
|
|
229
|
+
},
|
|
230
|
+
stripStyleSheets() {
|
|
231
|
+
stripStyleSheets(xmlFragment);
|
|
232
|
+
return api;
|
|
233
|
+
},
|
|
234
|
+
html() {
|
|
235
|
+
return new XMLSerializer().serializeToString(toHTML(xmlFragment));
|
|
236
|
+
},
|
|
237
|
+
xml() {
|
|
238
|
+
return new XMLSerializer().serializeToString(xmlFragment);
|
|
239
|
+
},
|
|
240
|
+
htmlDoc() {
|
|
241
|
+
return toHTML(xmlFragment);
|
|
242
|
+
},
|
|
243
|
+
xmlDoc() {
|
|
244
|
+
return xmlFragment;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
return api;
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// src/lib/qti-transformers/qti-transform-manifest.ts
|
|
251
|
+
var qtiTransformManifest = () => {
|
|
252
|
+
let xmlFragment;
|
|
253
|
+
const api = {
|
|
254
|
+
async load(uri) {
|
|
255
|
+
return new Promise((resolve, reject) => {
|
|
256
|
+
loadXML(uri).then((xml2) => {
|
|
257
|
+
xmlFragment = xml2;
|
|
258
|
+
return resolve(api);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
},
|
|
262
|
+
parse(xmlString) {
|
|
263
|
+
xmlFragment = parseXML(xmlString);
|
|
264
|
+
},
|
|
265
|
+
assessmentTest() {
|
|
266
|
+
const el = xmlFragment.querySelector('resource[type="imsqti_test_xmlv3p0"]');
|
|
267
|
+
return { href: el.getAttribute("href"), identifier: el.getAttribute("identifier") };
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
return api;
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
// src/lib/qti-transformers/qti-transform-test.ts
|
|
274
|
+
var qtiTransformTest = () => {
|
|
275
|
+
let xmlFragment;
|
|
276
|
+
const api = {
|
|
277
|
+
async load(uri) {
|
|
278
|
+
return new Promise((resolve, reject) => {
|
|
279
|
+
loadXML(uri).then((xml2) => {
|
|
280
|
+
xmlFragment = xml2;
|
|
281
|
+
return resolve(api);
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
parse(xmlString) {
|
|
286
|
+
xmlFragment = parseXML(xmlString);
|
|
287
|
+
return api;
|
|
288
|
+
},
|
|
289
|
+
fn(fn) {
|
|
290
|
+
fn(xmlFragment);
|
|
291
|
+
return api;
|
|
292
|
+
},
|
|
293
|
+
items() {
|
|
294
|
+
return itemsFromTest(xmlFragment);
|
|
295
|
+
},
|
|
296
|
+
html() {
|
|
297
|
+
return new XMLSerializer().serializeToString(toHTML(xmlFragment));
|
|
298
|
+
},
|
|
299
|
+
xml() {
|
|
300
|
+
return new XMLSerializer().serializeToString(xmlFragment);
|
|
301
|
+
},
|
|
302
|
+
htmlDoc() {
|
|
303
|
+
return toHTML(xmlFragment);
|
|
304
|
+
},
|
|
305
|
+
xmlDoc() {
|
|
306
|
+
return xmlFragment;
|
|
307
|
+
}
|
|
308
|
+
};
|
|
309
|
+
return api;
|
|
310
|
+
};
|
|
311
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
312
|
+
0 && (module.exports = {
|
|
313
|
+
qtiTransformItem,
|
|
314
|
+
qtiTransformManifest,
|
|
315
|
+
qtiTransformTest
|
|
316
|
+
});
|
|
317
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtZXJzLnRzIiwgIi4uLy4uL3NyYy9saWIvcXRpLXRyYW5zZm9ybWVycy9xdGktdHJhbnNmb3JtLWl0ZW0udHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0tbWFuaWZlc3QudHMiLCAiLi4vLi4vc3JjL2xpYi9xdGktdHJhbnNmb3JtZXJzL3F0aS10cmFuc2Zvcm0tdGVzdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0ICogZnJvbSAnLi9xdGktdHJhbnNmb3JtLWl0ZW0nO1xuZXhwb3J0ICogZnJvbSAnLi9xdGktdHJhbnNmb3JtLW1hbmlmZXN0JztcbmV4cG9ydCAqIGZyb20gJy4vcXRpLXRyYW5zZm9ybS10ZXN0JztcblxuIiwgImNvbnN0IHhtbCA9IFN0cmluZy5yYXc7XG5cbi8qICAgPCEtLSBjb252ZXJ0IENEQVRBIHRvIGNvbW1lbnRzIC0tPlxuICA8eHNsOnRlbXBsYXRlIG1hdGNoPVwidGV4dCgpW2NvbnRhaW5zKC4sICdDREFUQScpXVwiPlxuICA8eHNsOmNvbW1lbnQ+XG4gICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPlxuICA8L3hzbDpjb21tZW50PlxuPC94c2w6dGVtcGxhdGU+XG4qL1xuXG4vKlxuICA8IS0tIHJlbW92ZSB4bWwgY29tbWVudHMgLS0+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJjb21tZW50KClcIiAvPlxuICAqL1xuXG5jb25zdCB4bWxUb0hUTUwgPSB4bWxgPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249XCIxLjBcIiB4bWxuczp4c2w9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm1cIj5cbjx4c2w6b3V0cHV0IG1ldGhvZD1cImh0bWxcIiB2ZXJzaW9uPVwiNS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIGluZGVudD1cInllc1wiIC8+XG4gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJAKnxub2RlKClcIj5cbiAgICA8eHNsOmNvcHk+XG4gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJAKnxub2RlKClcIi8+XG4gICAgPC94c2w6Y29weT5cbiAgPC94c2w6dGVtcGxhdGU+XG5cbiAgPCEtLSByZW1vdmUgZXhpc3RpbmcgbmFtZXNwYWNlcyAtLT5cbiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIipcIj5cbiAgICA8IS0tIHJlbW92ZSBlbGVtZW50IHByZWZpeCAtLT5cbiAgICA8eHNsOmVsZW1lbnQgbmFtZT1cIntsb2NhbC1uYW1lKCl9XCI+XG4gICAgICA8IS0tIHByb2Nlc3MgYXR0cmlidXRlcyAtLT5cbiAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PVwiQCpcIj5cbiAgICAgICAgPCEtLSByZW1vdmUgYXR0cmlidXRlIHByZWZpeCAtLT5cbiAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT1cIntsb2NhbC1uYW1lKCl9XCI+XG4gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPlxuICAgICAgICA8L3hzbDphdHRyaWJ1dGU+XG4gICAgICA8L3hzbDpmb3ItZWFjaD5cbiAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+XG4gIDwveHNsOmVsZW1lbnQ+XG48L3hzbDp0ZW1wbGF0ZT5cbjwveHNsOnN0eWxlc2hlZXQ+YDtcblxuLy8gRnVuY3Rpb24gdG8gZXh0ZW5kIGVsZW1lbnRzIHdpdGggYSBzcGVjaWZpYyB0YWcgbmFtZSBieSBhZGRpbmcgYW4gZXh0ZW5zaW9uIHN1ZmZpeFxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZEVsZW1lbnROYW1lKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCwgdGFnTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykge1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgbmV3VGFnTmFtZSA9IGAke3RhZ05hbWV9LSR7ZXh0ZW5zaW9ufWA7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKTtcbiAgICBlbGVtZW50LnJlcGxhY2VXaXRoKG5ld0VsZW1lbnQpO1xuICB9KTtcbn1cblxuLy8gRnVuY3Rpb24gdG8gZXh0ZW5kIGFueSBlbGVtZW50IHdpdGggYSBzcGVjaWZpYyBjbGFzcyBwYXR0ZXJuIChlLmcuLCBcImV4dGVuZDpzdWZmaXhcIilcbmV4cG9ydCBmdW5jdGlvbiBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQsIGNsYXNzTmFtZVBhdHRlcm46IHN0cmluZykge1xuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcqJykuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBjbGFzc0xpc3QgPSBlbGVtZW50LmNsYXNzTGlzdDtcbiAgICBpZiAoY2xhc3NMaXN0KSB7XG4gICAgICBjbGFzc0xpc3QuZm9yRWFjaChjbGFzc05hbWUgPT4ge1xuICAgICAgICBpZiAoY2xhc3NOYW1lLnN0YXJ0c1dpdGgoYCR7Y2xhc3NOYW1lUGF0dGVybn06YCkpIHtcbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBjbGFzc05hbWUuc2xpY2UoYCR7Y2xhc3NOYW1lUGF0dGVybn06YC5sZW5ndGgpO1xuICAgICAgICAgIGNvbnN0IG5ld1RhZ05hbWUgPSBgJHtlbGVtZW50Lm5vZGVOYW1lfS0ke3N1ZmZpeH1gO1xuICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50V2l0aE5ld1RhZ05hbWUoZWxlbWVudCwgbmV3VGFnTmFtZSk7XG4gICAgICAgICAgZWxlbWVudC5yZXBsYWNlV2l0aChuZXdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBlbGVtZW50IHdpdGggYSBuZXcgdGFnIG5hbWUgYW5kIGNvcHkgYXR0cmlidXRlcyBhbmQgY2hpbGRyZW5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRXaXRoTmV3VGFnTmFtZShlbGVtZW50LCBuZXdUYWdOYW1lKSB7XG4gIGNvbnN0IG5ld0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5ld1RhZ05hbWUpO1xuICAvLyBDb3B5IGF0dHJpYnV0ZXNcbiAgZm9yIChjb25zdCBhdHRyIG9mIGVsZW1lbnQuYXR0cmlidXRlcykge1xuICAgIG5ld0VsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gIH1cbiAgLy8gQ29weSBjaGlsZCBub2Rlc1xuICB3aGlsZSAoZWxlbWVudC5maXJzdENoaWxkKSB7XG4gICAgbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50LmZpcnN0Q2hpbGQpO1xuICB9XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXRlbXNGcm9tVGVzdCh4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCkge1xuICBjb25zdCBpdGVtczogeyBpZGVudGlmaWVyOiBzdHJpbmc7IGhyZWY6IHN0cmluZzsgY2F0ZWdvcnk6IHN0cmluZyB9W10gPSBbXTtcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLWFzc2Vzc21lbnQtaXRlbS1yZWYnKS5mb3JFYWNoKGVsID0+IHtcbiAgICBjb25zdCBpZGVudGlmaWVyID0gZWwuZ2V0QXR0cmlidXRlKCdpZGVudGlmaWVyJyk7XG4gICAgY29uc3QgaHJlZiA9IGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpO1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gZWwuZ2V0QXR0cmlidXRlKCdjYXRlZ29yeScpO1xuICAgIGl0ZW1zLnB1c2goeyBpZGVudGlmaWVyLCBocmVmLCBjYXRlZ29yeSB9KTtcbiAgfSk7XG4gIHJldHVybiBpdGVtcztcbn1cblxubGV0IGN1cnJlbnRSZXF1ZXN0OiBYTUxIdHRwUmVxdWVzdCB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFhNTCh1cmwsIGNhbmNlbFByZXZpb3VzUmVxdWVzdCA9IGZhbHNlKSB7XG4gIGlmIChjYW5jZWxQcmV2aW91c1JlcXVlc3QgJiYgY3VycmVudFJlcXVlc3QgIT09IG51bGwpIHtcbiAgICBjdXJyZW50UmVxdWVzdC5hYm9ydCgpOyAvLyBBYm9ydCB0aGUgb25nb2luZyByZXF1ZXN0IGlmIHRoZXJlIGlzIG9uZVxuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlPFhNTERvY3VtZW50IHwgbnVsbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGN1cnJlbnRSZXF1ZXN0ID0geGhyOyAvLyBTdG9yZSB0aGUgY3VycmVudCByZXF1ZXN0XG5cbiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2RvY3VtZW50JztcblxuICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICByZXNvbHZlKHhoci5yZXNwb25zZVhNTCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoeGhyLnN0YXR1c1RleHQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9ICgpID0+IHtcbiAgICAgIHJlamVjdCh4aHIuc3RhdHVzVGV4dCk7XG4gICAgfTtcblxuICAgIHhoci5zZW5kKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VYTUwoeG1sRG9jdW1lbnQ6IHN0cmluZykge1xuICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gIGNvbnN0IHhtbEZyYWdtZW50ID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh4bWxEb2N1bWVudCwgJ3RleHQveG1sJyk7XG4gIHJldHVybiB4bWxGcmFnbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvSFRNTCh4bWxGcmFnbWVudDogRG9jdW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3QgcHJvY2Vzc29yID0gbmV3IFhTTFRQcm9jZXNzb3IoKTtcbiAgY29uc3QgeHNsdERvY3VtZW50ID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWxUb0hUTUwsICd0ZXh0L3htbCcpO1xuICBwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4c2x0RG9jdW1lbnQpO1xuICBjb25zdCBpdGVtSFRNTEZyYWdtZW50ID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRnJhZ21lbnQoeG1sRnJhZ21lbnQsIGRvY3VtZW50KTtcbiAgcmV0dXJuIGl0ZW1IVE1MRnJhZ21lbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRMb2NhdGlvbih4bWxGcmFnbWVudDogRG9jdW1lbnRGcmFnbWVudCwgbG9jYXRpb246IHN0cmluZykge1xuICBpZiAoIWxvY2F0aW9uLmVuZHNXaXRoKCcvJykpIHtcbiAgICBsb2NhdGlvbiArPSAnLyc7XG4gIH1cblxuICB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3JjXSxbaHJlZl0sW3ByaW1hcnktcGF0aF0nKS5mb3JFYWNoKGVsV2l0aFNyYyA9PiB7XG4gICAgbGV0IGF0dHI6ICdzcmMnIHwgJ2hyZWYnIHwgJ3ByaW1hcnktcGF0aCcgfCAnJyA9ICcnO1xuXG4gICAgaWYgKGVsV2l0aFNyYy5nZXRBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgICBhdHRyID0gJ3NyYyc7XG4gICAgfVxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgIGF0dHIgPSAnaHJlZic7XG4gICAgfVxuICAgIGlmIChlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKCdwcmltYXJ5LXBhdGgnKSkge1xuICAgICAgYXR0ciA9ICdwcmltYXJ5LXBhdGgnO1xuICAgIH1cbiAgICBjb25zdCBhdHRyVmFsdWUgPSBlbFdpdGhTcmMuZ2V0QXR0cmlidXRlKGF0dHIpPy50cmltKCk7XG5cbiAgICBpZiAoIWF0dHJWYWx1ZS5zdGFydHNXaXRoKCdkYXRhOicpICYmICFhdHRyVmFsdWUuc3RhcnRzV2l0aCgnaHR0cCcpKSB7XG4gICAgICBjb25zdCBuZXdTcmNWYWx1ZSA9IGxvY2F0aW9uICsgZW5jb2RlVVJJKGF0dHJWYWx1ZSk7XG4gICAgICBlbFdpdGhTcmMuc2V0QXR0cmlidXRlKGF0dHIsIG5ld1NyY1ZhbHVlKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENEQVRBdG9Db21tZW50KHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIGNvbnN0IGNkYXRhRWxlbWVudHMgPSB4bWxGcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdxdGktY3VzdG9tLW9wZXJhdG9yW2NsYXNzPVwianMub3JnXCJdID4gcXRpLWJhc2UtdmFsdWUnKTtcbiAgY2RhdGFFbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgIGNvbnN0IGNvbW1lbnRUZXh0ID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlbGVtZW50LnRleHRDb250ZW50KTtcbiAgICBlbGVtZW50LnJlcGxhY2VDaGlsZChjb21tZW50VGV4dCwgZWxlbWVudC5maXJzdENoaWxkKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFN0eWxlU2hlZXRzKHhtbEZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KSB7XG4gIC8vIHJlbW92ZSBxdGktc3R5bGVzaGVldCB0YWdcbiAgeG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgncXRpLXN0eWxlc2hlZXQnKS5mb3JFYWNoKHN0eWxlc2hlZXQgPT4gc3R5bGVzaGVldC5yZW1vdmUoKSk7XG59XG4iLCAiLyoqXG4gKiBCcm93c2VyIGJhc2VkIFFUSS1YTUwgdG8gSFRNTCB0cmFuc2Zvcm1lci5cbiAqIFJldHVybnMgYW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSwgdHJhbnNmb3JtIGFuZCBzZXJpYWxpemUgUVRJIFhNTCBpdGVtcy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIG1ldGhvZHMgdG8gbG9hZCwgcGFyc2UsIHRyYW5zZm9ybSBhbmQgc2VyaWFsaXplIFFUSSBYTUwgaXRlbXMuXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcXRpVHJhbnNmb3JtZXIgPSBxdGlUcmFuc2Zvcm1JdGVtKCk7XG4gKiBhd2FpdCBxdGlUcmFuc2Zvcm1lci5sb2FkKCdwYXRoL3RvL3htbC9maWxlLnhtbCcpO1xuICogcXRpVHJhbnNmb3JtZXIucGF0aCgnL2Fzc2Vzc21lbnRJdGVtL2l0ZW1Cb2R5Jyk7XG4gKiBjb25zdCBodG1sID0gcXRpVHJhbnNmb3JtZXIuaHRtbCgpO1xuICogY29uc3QgeG1sID0gcXRpVHJhbnNmb3JtZXIueG1sKCk7XG4gKiBjb25zdCBodG1sZG9jID0gcXRpVHJhbnNmb3JtZXIuaHRtbGRvYygpO1xuICogY29uc3QgeG1sZG9jID0gcXRpVHJhbnNmb3JtZXIueG1sZG9jKCk7XG4gKlxuICogcXRpVHJhbnNmb3JtSXRlbSgpLnBhcnNlKHN0b3J5WE1MKS5odG1sKClcbiAqL1xuXG5pbXBvcnQge1xuICBjb252ZXJ0Q0RBVEF0b0NvbW1lbnQsXG4gIGV4dGVuZEVsZW1lbnROYW1lLFxuICBleHRlbmRFbGVtZW50c1dpdGhDbGFzcyxcbiAgbG9hZFhNTCxcbiAgcGFyc2VYTUwsXG4gIHNldExvY2F0aW9uLFxuICBzdHJpcFN0eWxlU2hlZXRzLFxuICB0b0hUTUxcbn0gZnJvbSAnLi9xdGktdHJhbnNmb3JtZXJzJztcblxuZXhwb3J0IHR5cGUgdHJhbnNmb3JtSXRlbUFwaSA9IHtcbiAgbG9hZDogKHVyaTogc3RyaW5nLCBjYW5jZWxQcmV2aW91c1JlcXVlc3Q/OiBib29sZWFuKSA9PiBQcm9taXNlPHRyYW5zZm9ybUl0ZW1BcGk+O1xuICBwYXJzZTogKHhtbFN0cmluZzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1JdGVtQXBpO1xuICBwYXRoOiAobG9jYXRpb246IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZm46IChmbjogKHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudCkgPT4gdm9pZCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgcGNpSG9va3M6ICh1cmk6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZXh0ZW5kRWxlbWVudE5hbWU6IChlbGVtZW50TmFtZTogc3RyaW5nLCBleHRlbmQ6IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3M6IChwYXJhbT86IHN0cmluZykgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgY3VzdG9tSW50ZXJhY3Rpb246IChiYXNlUmVmOiBzdHJpbmcsIGJhc2VJdGVtOiBzdHJpbmcpID0+IHRyYW5zZm9ybUl0ZW1BcGk7XG4gIGNvbnZlcnRDREFUQXRvQ29tbWVudDogKCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgc3RyaXBTdHlsZVNoZWV0czogKCkgPT4gdHJhbnNmb3JtSXRlbUFwaTtcbiAgaHRtbDogKCkgPT4gc3RyaW5nO1xuICB4bWw6ICgpID0+IHN0cmluZztcbiAgaHRtbERvYzogKCkgPT4gRG9jdW1lbnRGcmFnbWVudDtcbiAgeG1sRG9jOiAoKSA9PiBYTUxEb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1JdGVtID0gKCkgPT4ge1xuICBsZXQgeG1sRnJhZ21lbnQ6IFhNTERvY3VtZW50O1xuXG4gIGNvbnN0IGFwaTogdHJhbnNmb3JtSXRlbUFwaSA9IHtcbiAgICBhc3luYyBsb2FkKHVyaTogc3RyaW5nLCBjYW5jZWxQcmV2aW91c1JlcXVlc3QgPSBmYWxzZSk6IFByb21pc2U8dHlwZW9mIGFwaT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHR5cGVvZiBhcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbG9hZFhNTCh1cmksIGNhbmNlbFByZXZpb3VzUmVxdWVzdCkudGhlbih4bWwgPT4ge1xuICAgICAgICAgIHhtbEZyYWdtZW50ID0geG1sO1xuICAgICAgICAgIC8vIHNldCB0aGUgYmFzZSBwYXRoIGZvciBpbWFnZXMgYW5kIG90aGVyIHJlc291cmNlcyxcbiAgICAgICAgICAvLyB5b3UgcHJvYmFibHkgd2FudCB0byBzZXQgdGhlIGJhc2UgcGF0aCB0byB0aGUgZG9jdW1lbnQgcm9vdCBlbHNlIHlvdSBjYW4gdXNlIHRoZSBwYXRoIG1ldGhvZCB0byBzZXQgaXRcbiAgICAgICAgICBhcGkucGF0aCh1cmkuc3Vic3RyaW5nKDAsIHVyaS5sYXN0SW5kZXhPZignLycpKSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoYXBpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHBhcnNlKHhtbFN0cmluZzogc3RyaW5nKTogdHlwZW9mIGFwaSB7XG4gICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgcGF0aDogKGxvY2F0aW9uOiBzdHJpbmcpOiB0eXBlb2YgYXBpID0+IHtcbiAgICAgIHNldExvY2F0aW9uKHhtbEZyYWdtZW50LCBsb2NhdGlvbik7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZm4oZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGZuKHhtbEZyYWdtZW50KTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBwY2lIb29rcyh1cmk6IHN0cmluZyk6IHR5cGVvZiBhcGkge1xuICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFsnaG9vaycsICdtb2R1bGUnXTtcbiAgICAgIGNvbnN0IGRvY3VtZW50UGF0aCA9IHVyaS5zdWJzdHJpbmcoMCwgdXJpLmxhc3RJbmRleE9mKCcvJykpO1xuICAgICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgICBjb25zdCBzcmNBdHRyaWJ1dGVzID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnWycgKyBhdHRyaWJ1dGUgKyAnXScpO1xuICAgICAgICBzcmNBdHRyaWJ1dGVzLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3JjVmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpITtcbiAgICAgICAgICBpZiAoIXNyY1ZhbHVlLnN0YXJ0c1dpdGgoJ2RhdGE6JykgJiYgIXNyY1ZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgLy8gSnVzdCBwYXN0ZSB0aGUgcmVsYXRpdmUgcGF0aCBvZiB0aGUgc3JjIGxvY2F0aW9uIGFmdGVyIHRoZSBkb2N1bWVudHJvb3RQYXRoXG4gICAgICAgICAgICAvLyBvbGQgcGNpcyBjYW4gaGF2ZSBhIC5qcywgbmV3IHBjaSdzIGRvbid0XG4gICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYmFzZS11cmwnLCB1cmkpO1xuICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICdtb2R1bGUnLFxuICAgICAgICAgICAgICBkb2N1bWVudFBhdGggKyAnLycgKyBlbmNvZGVVUkkoc3JjVmFsdWUgKyAoc3JjVmFsdWUuZW5kc1dpdGgoJy5qcycpID8gJycgOiAnLmpzJykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgZXh0ZW5kRWxlbWVudE5hbWU6ICh0YWdOYW1lOiBzdHJpbmcsIGV4dGVuc2lvbjogc3RyaW5nKTogdHlwZW9mIGFwaSA9PiB7XG4gICAgICBleHRlbmRFbGVtZW50TmFtZSh4bWxGcmFnbWVudCwgdGFnTmFtZSwgZXh0ZW5zaW9uKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBleHRlbmRFbGVtZW50c1dpdGhDbGFzczogKHBhcmFtOiBzdHJpbmcgPSAnZXh0ZW5kJyk6IHR5cGVvZiBhcGkgPT4ge1xuICAgICAgZXh0ZW5kRWxlbWVudHNXaXRoQ2xhc3MoeG1sRnJhZ21lbnQsIHBhcmFtKTtcbiAgICAgIHJldHVybiBhcGk7XG4gICAgfSxcbiAgICBjdXN0b21JbnRlcmFjdGlvbihiYXNlUmVmOiBzdHJpbmcsIGJhc2VJdGVtOiBzdHJpbmcpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnN0IHF0aUN1c3RvbUludGVyYWN0aW9uID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvcigncXRpLWN1c3RvbS1pbnRlcmFjdGlvbicpO1xuICAgICAgY29uc3QgcXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QgPSBxdGlDdXN0b21JbnRlcmFjdGlvbi5xdWVyeVNlbGVjdG9yKCdvYmplY3QnKTtcblxuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdkYXRhLWJhc2UtcmVmJywgYmFzZVJlZik7XG4gICAgICBxdGlDdXN0b21JbnRlcmFjdGlvbi5zZXRBdHRyaWJ1dGUoJ2RhdGEtYmFzZS1pdGVtJywgYmFzZVJlZiArIGJhc2VJdGVtKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnZGF0YScsIHF0aUN1c3RvbUludGVyYWN0aW9uT2JqZWN0LmdldEF0dHJpYnV0ZSgnZGF0YScpKTtcbiAgICAgIHF0aUN1c3RvbUludGVyYWN0aW9uLnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJykpO1xuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24uc2V0QXR0cmlidXRlKCdoZWlnaHQnLCBxdGlDdXN0b21JbnRlcmFjdGlvbk9iamVjdC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpKTtcblxuICAgICAgcXRpQ3VzdG9tSW50ZXJhY3Rpb24ucmVtb3ZlQ2hpbGQocXRpQ3VzdG9tSW50ZXJhY3Rpb25PYmplY3QpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGNvbnZlcnRDREFUQXRvQ29tbWVudCgpOiB0eXBlb2YgYXBpIHtcbiAgICAgIGNvbnZlcnRDREFUQXRvQ29tbWVudCh4bWxGcmFnbWVudCk7XG4gICAgICByZXR1cm4gYXBpO1xuICAgIH0sXG4gICAgc3RyaXBTdHlsZVNoZWV0cygpOiB0eXBlb2YgYXBpIHtcbiAgICAgIHN0cmlwU3R5bGVTaGVldHMoeG1sRnJhZ21lbnQpO1xuICAgICAgcmV0dXJuIGFwaTtcbiAgICB9LFxuICAgIGh0bWwoKSB7XG4gICAgICByZXR1cm4gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh0b0hUTUwoeG1sRnJhZ21lbnQpKTtcbiAgICB9LFxuICAgIHhtbCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcoeG1sRnJhZ21lbnQpO1xuICAgIH0sXG4gICAgaHRtbERvYygpIHtcbiAgICAgIHJldHVybiB0b0hUTUwoeG1sRnJhZ21lbnQpO1xuICAgIH0sXG4gICAgeG1sRG9jKCk6IFhNTERvY3VtZW50IHtcbiAgICAgIHJldHVybiB4bWxGcmFnbWVudDsgLy8gbmV3IFhNTFNlcmlhbGl6ZXIoKS5zZXJpYWxpemVUb1N0cmluZyh4bWxGcmFnbWVudCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gYXBpO1xufTtcbiIsICJpbXBvcnQgeyBsb2FkWE1MLCBwYXJzZVhNTCB9IGZyb20gXCIuL3F0aS10cmFuc2Zvcm1lcnNcIjtcblxuZXhwb3J0IGNvbnN0IHF0aVRyYW5zZm9ybU1hbmlmZXN0ID0gKCk6IHtcbiAgICBsb2FkOiAodXJpOiBzdHJpbmcpID0+IFByb21pc2U8dHlwZW9mIGFwaT47XG4gICAgYXNzZXNzbWVudFRlc3Q6ICgpID0+IHsgaHJlZjogc3RyaW5nOyBpZGVudGlmaWVyOiBzdHJpbmcgfTtcbiAgfSA9PiB7XG4gICAgbGV0IHhtbEZyYWdtZW50OiBYTUxEb2N1bWVudDtcbiAgXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgYXN5bmMgbG9hZCh1cmkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHR5cGVvZiBhcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsb2FkWE1MKHVyaSkudGhlbih4bWwgPT4ge1xuICAgICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICB9LFxuICAgICAgYXNzZXNzbWVudFRlc3QoKSB7XG4gICAgICAgIGNvbnN0IGVsID0geG1sRnJhZ21lbnQucXVlcnlTZWxlY3RvcigncmVzb3VyY2VbdHlwZT1cImltc3F0aV90ZXN0X3htbHYzcDBcIl0nKTtcbiAgICAgICAgcmV0dXJuIHsgaHJlZjogZWwuZ2V0QXR0cmlidXRlKCdocmVmJyksIGlkZW50aWZpZXI6IGVsLmdldEF0dHJpYnV0ZSgnaWRlbnRpZmllcicpIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBpO1xuICB9OyIsICJcbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBtZXRob2RzIHRvIGxvYWQsIHBhcnNlIGFuZCB0cmFuc2Zvcm0gUVRJIHRlc3RzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggbWV0aG9kcyB0byBsb2FkLCBwYXJzZSBhbmQgdHJhbnNmb3JtIFFUSSB0ZXN0cy5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBxdGlUcmFuc2Zvcm1lciA9IHF0aVRyYW5zZm9ybVRlc3QoKTtcbiAqIGF3YWl0IHF0aVRyYW5zZm9ybWVyLmxvYWQoJ2h0dHBzOi8vZXhhbXBsZS5jb20vdGVzdC54bWwnKTtcbiAqIGNvbnN0IGl0ZW1zID0gcXRpVHJhbnNmb3JtZXIuaXRlbXMoKTtcbiAqIGNvbnN0IGh0bWwgPSBxdGlUcmFuc2Zvcm1lci5odG1sKCk7XG4gKiBjb25zdCB4bWwgPSBxdGlUcmFuc2Zvcm1lci54bWwoKTtcbiAqL1xuXG5pbXBvcnQgeyBpdGVtc0Zyb21UZXN0LCBsb2FkWE1MLCBwYXJzZVhNTCwgdG9IVE1MIH0gZnJvbSBcIi4vcXRpLXRyYW5zZm9ybWVyc1wiO1xuXG5leHBvcnQgdHlwZSB0cmFuc2Zvcm1UZXN0QXBpID0ge1xuICAgIGxvYWQ6ICh1cmk6IHN0cmluZykgPT4gUHJvbWlzZTx0cmFuc2Zvcm1UZXN0QXBpPjtcbiAgICBwYXJzZTogKHhtbFN0cmluZzogc3RyaW5nKSA9PiB0cmFuc2Zvcm1UZXN0QXBpO1xuICAgIGZuOiAoZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpID0+IHRyYW5zZm9ybVRlc3RBcGk7XG4gICAgaXRlbXM6ICgpID0+IHsgaWRlbnRpZmllcjogc3RyaW5nOyBocmVmOiBzdHJpbmc7IGNhdGVnb3J5OiBzdHJpbmcgfVtdO1xuICAgIGh0bWw6ICgpID0+IHN0cmluZztcbiAgICB4bWw6ICgpID0+IHN0cmluZztcbiAgICBodG1sRG9jOiAoKSA9PiBEb2N1bWVudEZyYWdtZW50O1xuICAgIHhtbERvYzogKCkgPT4gWE1MRG9jdW1lbnQ7XG4gIH1cbiAgXG4gIGV4cG9ydCBjb25zdCBxdGlUcmFuc2Zvcm1UZXN0ID0gKCk6IHRyYW5zZm9ybVRlc3RBcGkgPT4ge1xuICAgIGxldCB4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQ7XG4gIFxuICAgIGNvbnN0IGFwaTp0cmFuc2Zvcm1UZXN0QXBpID0ge1xuICAgICAgYXN5bmMgbG9hZCh1cmkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHRyYW5zZm9ybVRlc3RBcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBsb2FkWE1MKHVyaSkudGhlbih4bWwgPT4ge1xuICAgICAgICAgICAgeG1sRnJhZ21lbnQgPSB4bWw7XG4gICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShhcGkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBwYXJzZSh4bWxTdHJpbmc6IHN0cmluZykge1xuICAgICAgICB4bWxGcmFnbWVudCA9IHBhcnNlWE1MKHhtbFN0cmluZyk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuICAgICAgZm4oZm46ICh4bWxGcmFnbWVudDogWE1MRG9jdW1lbnQpID0+IHZvaWQpIHtcbiAgICAgICAgZm4oeG1sRnJhZ21lbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcbiAgICAgIGl0ZW1zKCkge1xuICAgICAgICByZXR1cm4gaXRlbXNGcm9tVGVzdCh4bWxGcmFnbWVudCk7XG4gICAgICB9LFxuICAgICAgaHRtbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodG9IVE1MKHhtbEZyYWdtZW50KSk7XG4gICAgICB9LFxuICAgICAgeG1sKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbEZyYWdtZW50KTtcbiAgICAgIH0sXG4gICAgICBodG1sRG9jKCkge1xuICAgICAgICByZXR1cm4gdG9IVE1MKHhtbEZyYWdtZW50KTtcbiAgICAgIH0sXG4gICAgICB4bWxEb2MoKTogWE1MRG9jdW1lbnQge1xuICAgICAgICByZXR1cm4geG1sRnJhZ21lbnQ7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gYXBpO1xuICB9OyJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQUEsSUFBTSxNQUFNLE9BQU87QUFlbkIsSUFBTSxZQUFZO0FBQUE7QUFBQTtB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
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser based QTI-XML to HTML transformer.
|
|
3
|
+
* Returns an object with methods to load, parse, transform and serialize QTI XML items.
|
|
4
|
+
* @returns An object with methods to load, parse, transform and serialize QTI XML items.
|
|
5
|
+
* @example
|
|
6
|
+
* const qtiTransformer = qtiTransformItem();
|
|
7
|
+
* await qtiTransformer.load('path/to/xml/file.xml');
|
|
8
|
+
* qtiTransformer.path('/assessmentItem/itemBody');
|
|
9
|
+
* const html = qtiTransformer.html();
|
|
10
|
+
* const xml = qtiTransformer.xml();
|
|
11
|
+
* const htmldoc = qtiTransformer.htmldoc();
|
|
12
|
+
* const xmldoc = qtiTransformer.xmldoc();
|
|
13
|
+
*
|
|
14
|
+
* qtiTransformItem().parse(storyXML).html()
|
|
15
|
+
*/
|
|
16
|
+
type transformItemApi = {
|
|
17
|
+
load: (uri: string, cancelPreviousRequest?: boolean) => Promise<transformItemApi>;
|
|
18
|
+
parse: (xmlString: string) => transformItemApi;
|
|
19
|
+
path: (location: string) => transformItemApi;
|
|
20
|
+
fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;
|
|
21
|
+
pciHooks: (uri: string) => transformItemApi;
|
|
22
|
+
extendElementName: (elementName: string, extend: string) => transformItemApi;
|
|
23
|
+
extendElementsWithClass: (param?: string) => transformItemApi;
|
|
24
|
+
customInteraction: (baseRef: string, baseItem: string) => transformItemApi;
|
|
25
|
+
convertCDATAtoComment: () => transformItemApi;
|
|
26
|
+
stripStyleSheets: () => transformItemApi;
|
|
27
|
+
html: () => string;
|
|
28
|
+
xml: () => string;
|
|
29
|
+
htmlDoc: () => DocumentFragment;
|
|
30
|
+
xmlDoc: () => XMLDocument;
|
|
31
|
+
};
|
|
32
|
+
declare const qtiTransformItem: () => transformItemApi;
|
|
33
|
+
|
|
34
|
+
declare const qtiTransformManifest: () => {
|
|
35
|
+
load: (uri: string) => Promise<{
|
|
36
|
+
load(uri: any): Promise</*elided*/ any>;
|
|
37
|
+
parse(xmlString: string): void;
|
|
38
|
+
assessmentTest(): {
|
|
39
|
+
href: string;
|
|
40
|
+
identifier: string;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
assessmentTest: () => {
|
|
44
|
+
href: string;
|
|
45
|
+
identifier: string;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns an object with methods to load, parse and transform QTI tests.
|
|
51
|
+
* @returns An object with methods to load, parse and transform QTI tests.
|
|
52
|
+
* @example
|
|
53
|
+
* const qtiTransformer = qtiTransformTest();
|
|
54
|
+
* await qtiTransformer.load('https://example.com/test.xml');
|
|
55
|
+
* const items = qtiTransformer.items();
|
|
56
|
+
* const html = qtiTransformer.html();
|
|
57
|
+
* const xml = qtiTransformer.xml();
|
|
58
|
+
*/
|
|
59
|
+
type transformTestApi = {
|
|
60
|
+
load: (uri: string) => Promise<transformTestApi>;
|
|
61
|
+
parse: (xmlString: string) => transformTestApi;
|
|
62
|
+
fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;
|
|
63
|
+
items: () => {
|
|
64
|
+
identifier: string;
|
|
65
|
+
href: string;
|
|
66
|
+
category: string;
|
|
67
|
+
}[];
|
|
68
|
+
html: () => string;
|
|
69
|
+
xml: () => string;
|
|
70
|
+
htmlDoc: () => DocumentFragment;
|
|
71
|
+
xmlDoc: () => XMLDocument;
|
|
72
|
+
};
|
|
73
|
+
declare const qtiTransformTest: () => transformTestApi;
|
|
74
|
+
|
|
75
|
+
export { qtiTransformItem, qtiTransformManifest, qtiTransformTest, type transformItemApi, type transformTestApi };
|
|
@@ -13,85 +13,27 @@
|
|
|
13
13
|
*
|
|
14
14
|
* qtiTransformItem().parse(storyXML).html()
|
|
15
15
|
*/
|
|
16
|
-
|
|
17
|
-
load: (uri: string, cancelPreviousRequest?: boolean) => Promise<
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
xml(): string;
|
|
28
|
-
htmldoc(): DocumentFragment;
|
|
29
|
-
xmldoc(): XMLDocument;
|
|
30
|
-
}>;
|
|
31
|
-
parse: (xmlString: string) => {
|
|
32
|
-
load(uri: string, cancelPreviousRequest?: boolean): Promise<any>;
|
|
33
|
-
parse(xmlString: string): any;
|
|
34
|
-
path: (location: string) => any;
|
|
35
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
36
|
-
pciHooks(uri: string): any;
|
|
37
|
-
customInteraction(baseRef: string, baseItem: string): any;
|
|
38
|
-
convertCDATAtoComment(): any;
|
|
39
|
-
stripStyleSheets(): any;
|
|
40
|
-
html(): string;
|
|
41
|
-
xml(): string;
|
|
42
|
-
htmldoc(): DocumentFragment;
|
|
43
|
-
xmldoc(): XMLDocument;
|
|
44
|
-
};
|
|
45
|
-
path: (location: string) => {
|
|
46
|
-
load(uri: string, cancelPreviousRequest?: boolean): Promise<any>;
|
|
47
|
-
parse(xmlString: string): any;
|
|
48
|
-
path: (location: string) => any;
|
|
49
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
50
|
-
pciHooks(uri: string): any;
|
|
51
|
-
customInteraction(baseRef: string, baseItem: string): any;
|
|
52
|
-
convertCDATAtoComment(): any;
|
|
53
|
-
stripStyleSheets(): any;
|
|
54
|
-
html(): string;
|
|
55
|
-
xml(): string;
|
|
56
|
-
htmldoc(): DocumentFragment;
|
|
57
|
-
xmldoc(): XMLDocument;
|
|
58
|
-
};
|
|
59
|
-
fn: (fn: (xmlFragment: XMLDocument) => void) => {
|
|
60
|
-
load(uri: string, cancelPreviousRequest?: boolean): Promise<any>;
|
|
61
|
-
parse(xmlString: string): any;
|
|
62
|
-
path: (location: string) => any;
|
|
63
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
64
|
-
pciHooks(uri: string): any;
|
|
65
|
-
customInteraction(baseRef: string, baseItem: string): any;
|
|
66
|
-
convertCDATAtoComment(): any;
|
|
67
|
-
stripStyleSheets(): any;
|
|
68
|
-
html(): string;
|
|
69
|
-
xml(): string;
|
|
70
|
-
htmldoc(): DocumentFragment;
|
|
71
|
-
xmldoc(): XMLDocument;
|
|
72
|
-
};
|
|
73
|
-
customInteraction: (baseRef: string, baseItem: string) => {
|
|
74
|
-
load(uri: string, cancelPreviousRequest?: boolean): Promise<any>;
|
|
75
|
-
parse(xmlString: string): any;
|
|
76
|
-
path: (location: string) => any;
|
|
77
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
78
|
-
pciHooks(uri: string): any;
|
|
79
|
-
customInteraction(baseRef: string, baseItem: string): any;
|
|
80
|
-
convertCDATAtoComment(): any;
|
|
81
|
-
stripStyleSheets(): any;
|
|
82
|
-
html(): string;
|
|
83
|
-
xml(): string;
|
|
84
|
-
htmldoc(): DocumentFragment;
|
|
85
|
-
xmldoc(): XMLDocument;
|
|
86
|
-
};
|
|
16
|
+
type transformItemApi = {
|
|
17
|
+
load: (uri: string, cancelPreviousRequest?: boolean) => Promise<transformItemApi>;
|
|
18
|
+
parse: (xmlString: string) => transformItemApi;
|
|
19
|
+
path: (location: string) => transformItemApi;
|
|
20
|
+
fn: (fn: (xmlFragment: XMLDocument) => void) => transformItemApi;
|
|
21
|
+
pciHooks: (uri: string) => transformItemApi;
|
|
22
|
+
extendElementName: (elementName: string, extend: string) => transformItemApi;
|
|
23
|
+
extendElementsWithClass: (param?: string) => transformItemApi;
|
|
24
|
+
customInteraction: (baseRef: string, baseItem: string) => transformItemApi;
|
|
25
|
+
convertCDATAtoComment: () => transformItemApi;
|
|
26
|
+
stripStyleSheets: () => transformItemApi;
|
|
87
27
|
html: () => string;
|
|
88
28
|
xml: () => string;
|
|
89
|
-
|
|
90
|
-
|
|
29
|
+
htmlDoc: () => DocumentFragment;
|
|
30
|
+
xmlDoc: () => XMLDocument;
|
|
91
31
|
};
|
|
32
|
+
declare const qtiTransformItem: () => transformItemApi;
|
|
33
|
+
|
|
92
34
|
declare const qtiTransformManifest: () => {
|
|
93
35
|
load: (uri: string) => Promise<{
|
|
94
|
-
load(uri: any): Promise
|
|
36
|
+
load(uri: any): Promise</*elided*/ any>;
|
|
95
37
|
parse(xmlString: string): void;
|
|
96
38
|
assessmentTest(): {
|
|
97
39
|
href: string;
|
|
@@ -103,6 +45,7 @@ declare const qtiTransformManifest: () => {
|
|
|
103
45
|
identifier: string;
|
|
104
46
|
};
|
|
105
47
|
};
|
|
48
|
+
|
|
106
49
|
/**
|
|
107
50
|
* Returns an object with methods to load, parse and transform QTI tests.
|
|
108
51
|
* @returns An object with methods to load, parse and transform QTI tests.
|
|
@@ -113,49 +56,10 @@ declare const qtiTransformManifest: () => {
|
|
|
113
56
|
* const html = qtiTransformer.html();
|
|
114
57
|
* const xml = qtiTransformer.xml();
|
|
115
58
|
*/
|
|
116
|
-
|
|
117
|
-
load: (uri: string) => Promise<
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
121
|
-
items(): {
|
|
122
|
-
identifier: string;
|
|
123
|
-
href: string;
|
|
124
|
-
category: string;
|
|
125
|
-
}[];
|
|
126
|
-
html(): string;
|
|
127
|
-
xml(): string;
|
|
128
|
-
htmldoc(): DocumentFragment;
|
|
129
|
-
xmldoc(): XMLDocument;
|
|
130
|
-
}>;
|
|
131
|
-
parse: (xmlString: string) => {
|
|
132
|
-
load(uri: any): Promise<any>;
|
|
133
|
-
parse(xmlString: string): any;
|
|
134
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
135
|
-
items(): {
|
|
136
|
-
identifier: string;
|
|
137
|
-
href: string;
|
|
138
|
-
category: string;
|
|
139
|
-
}[];
|
|
140
|
-
html(): string;
|
|
141
|
-
xml(): string;
|
|
142
|
-
htmldoc(): DocumentFragment;
|
|
143
|
-
xmldoc(): XMLDocument;
|
|
144
|
-
};
|
|
145
|
-
fn: (fn: (xmlFragment: XMLDocument) => void) => {
|
|
146
|
-
load(uri: any): Promise<any>;
|
|
147
|
-
parse(xmlString: string): any;
|
|
148
|
-
fn(fn: (xmlFragment: XMLDocument) => void): any;
|
|
149
|
-
items(): {
|
|
150
|
-
identifier: string;
|
|
151
|
-
href: string;
|
|
152
|
-
category: string;
|
|
153
|
-
}[];
|
|
154
|
-
html(): string;
|
|
155
|
-
xml(): string;
|
|
156
|
-
htmldoc(): DocumentFragment;
|
|
157
|
-
xmldoc(): XMLDocument;
|
|
158
|
-
};
|
|
59
|
+
type transformTestApi = {
|
|
60
|
+
load: (uri: string) => Promise<transformTestApi>;
|
|
61
|
+
parse: (xmlString: string) => transformTestApi;
|
|
62
|
+
fn: (fn: (xmlFragment: XMLDocument) => void) => transformTestApi;
|
|
159
63
|
items: () => {
|
|
160
64
|
identifier: string;
|
|
161
65
|
href: string;
|
|
@@ -163,8 +67,9 @@ declare const qtiTransformTest: () => {
|
|
|
163
67
|
}[];
|
|
164
68
|
html: () => string;
|
|
165
69
|
xml: () => string;
|
|
166
|
-
|
|
167
|
-
|
|
70
|
+
htmlDoc: () => DocumentFragment;
|
|
71
|
+
xmlDoc: () => XMLDocument;
|
|
168
72
|
};
|
|
73
|
+
declare const qtiTransformTest: () => transformTestApi;
|
|
169
74
|
|
|
170
|
-
export { qtiTransformItem, qtiTransformManifest, qtiTransformTest };
|
|
75
|
+
export { qtiTransformItem, qtiTransformManifest, qtiTransformTest, type transformItemApi, type transformTestApi };
|