@longsightgroup/qti3-core 0.9.3 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -8
- package/dist/adaptive-turn-materializer.d.ts +2 -0
- package/dist/adaptive-turn-materializer.d.ts.map +1 -1
- package/dist/adaptive-turn-materializer.js +25 -19
- package/dist/adaptive-turn-materializer.js.map +1 -1
- package/dist/adaptive-turn.d.ts +8 -1
- package/dist/adaptive-turn.d.ts.map +1 -1
- package/dist/adaptive-turn.js +15 -5
- package/dist/adaptive-turn.js.map +1 -1
- package/dist/delivery-preparation.d.ts +20 -0
- package/dist/delivery-preparation.d.ts.map +1 -0
- package/dist/delivery-preparation.js +71 -0
- package/dist/delivery-preparation.js.map +1 -0
- package/dist/delivery-redaction.d.ts +5 -0
- package/dist/delivery-redaction.d.ts.map +1 -1
- package/dist/delivery-redaction.js +26 -5
- package/dist/delivery-redaction.js.map +1 -1
- package/dist/delivery-security.js +2 -2
- package/dist/delivery-security.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/item-scoring-expectation.d.ts +4 -0
- package/dist/item-scoring-expectation.d.ts.map +1 -0
- package/dist/item-scoring-expectation.js +6 -0
- package/dist/item-scoring-expectation.js.map +1 -0
- package/dist/item-submission-materialization.d.ts +25 -0
- package/dist/item-submission-materialization.d.ts.map +1 -0
- package/dist/item-submission-materialization.js +68 -0
- package/dist/item-submission-materialization.js.map +1 -0
- package/dist/qti-package-assets.d.ts +8 -0
- package/dist/qti-package-assets.d.ts.map +1 -0
- package/dist/qti-package-assets.js +173 -0
- package/dist/qti-package-assets.js.map +1 -0
- package/dist/qti-package-items.d.ts +14 -0
- package/dist/qti-package-items.d.ts.map +1 -0
- package/dist/qti-package-items.js +138 -0
- package/dist/qti-package-items.js.map +1 -0
- package/dist/qti-package-manifest.d.ts +13 -0
- package/dist/qti-package-manifest.d.ts.map +1 -0
- package/dist/qti-package-manifest.js +109 -0
- package/dist/qti-package-manifest.js.map +1 -0
- package/dist/qti-package-metadata.d.ts +8 -0
- package/dist/qti-package-metadata.d.ts.map +1 -0
- package/dist/qti-package-metadata.js +115 -0
- package/dist/qti-package-metadata.js.map +1 -0
- package/dist/qti-package-paths.d.ts +6 -0
- package/dist/qti-package-paths.d.ts.map +1 -0
- package/dist/qti-package-paths.js +32 -0
- package/dist/qti-package-paths.js.map +1 -0
- package/dist/qti-package-types.d.ts +98 -0
- package/dist/qti-package-types.d.ts.map +1 -0
- package/dist/qti-package-types.js +2 -0
- package/dist/qti-package-types.js.map +1 -0
- package/dist/qti-package-xml.d.ts +21 -0
- package/dist/qti-package-xml.d.ts.map +1 -0
- package/dist/qti-package-xml.js +68 -0
- package/dist/qti-package-xml.js.map +1 -0
- package/dist/qti-package-zip.d.ts +24 -0
- package/dist/qti-package-zip.d.ts.map +1 -0
- package/dist/qti-package-zip.js +185 -0
- package/dist/qti-package-zip.js.map +1 -0
- package/dist/qti-package.d.ts +7 -0
- package/dist/qti-package.d.ts.map +1 -0
- package/dist/qti-package.js +76 -0
- package/dist/qti-package.js.map +1 -0
- package/dist/response-input.d.ts +9 -0
- package/dist/response-input.d.ts.map +1 -0
- package/dist/response-input.js +9 -0
- package/dist/response-input.js.map +1 -0
- package/dist/response-validation-policy.d.ts +31 -0
- package/dist/response-validation-policy.d.ts.map +1 -0
- package/dist/response-validation-policy.js +158 -0
- package/dist/response-validation-policy.js.map +1 -0
- package/dist/response-validation.d.ts +23 -0
- package/dist/response-validation.d.ts.map +1 -0
- package/dist/response-validation.js +157 -0
- package/dist/response-validation.js.map +1 -0
- package/dist/scoring-disposition-policy.d.ts +8 -0
- package/dist/scoring-disposition-policy.d.ts.map +1 -0
- package/dist/scoring-disposition-policy.js +24 -0
- package/dist/scoring-disposition-policy.js.map +1 -0
- package/dist/template-presentation-materializer.d.ts +14 -0
- package/dist/template-presentation-materializer.d.ts.map +1 -0
- package/dist/template-presentation-materializer.js +143 -0
- package/dist/template-presentation-materializer.js.map +1 -0
- package/dist/trusted-item-session.d.ts +25 -8
- package/dist/trusted-item-session.d.ts.map +1 -1
- package/dist/trusted-item-session.js +51 -46
- package/dist/trusted-item-session.js.map +1 -1
- package/dist/trusted-session-materialization.d.ts +33 -0
- package/dist/trusted-session-materialization.d.ts.map +1 -0
- package/dist/trusted-session-materialization.js +26 -0
- package/dist/trusted-session-materialization.js.map +1 -0
- package/dist/validation-primitives.d.ts +1 -0
- package/dist/validation-primitives.d.ts.map +1 -1
- package/dist/validation-primitives.js +5 -0
- package/dist/validation-primitives.js.map +1 -1
- package/dist/variable-snapshot.d.ts +9 -0
- package/dist/variable-snapshot.d.ts.map +1 -0
- package/dist/variable-snapshot.js +9 -0
- package/dist/variable-snapshot.js.map +1 -0
- package/package.json +1 -1
- package/src/adaptive-turn-materializer.ts +29 -16
- package/src/adaptive-turn.ts +29 -6
- package/src/delivery-preparation.ts +121 -0
- package/src/delivery-redaction.ts +36 -5
- package/src/delivery-security.ts +2 -2
- package/src/index.ts +65 -0
- package/src/item-scoring-expectation.ts +9 -0
- package/src/item-submission-materialization.ts +120 -0
- package/src/qti-package-assets.ts +256 -0
- package/src/qti-package-items.ts +240 -0
- package/src/qti-package-manifest.ts +210 -0
- package/src/qti-package-metadata.ts +143 -0
- package/src/qti-package-paths.ts +56 -0
- package/src/qti-package-types.ts +117 -0
- package/src/qti-package-xml.ts +97 -0
- package/src/qti-package-zip.ts +325 -0
- package/src/qti-package.ts +176 -0
- package/src/response-input.ts +19 -0
- package/src/response-validation-policy.ts +218 -0
- package/src/response-validation.ts +282 -0
- package/src/scoring-disposition-policy.ts +37 -0
- package/src/template-presentation-materializer.ts +219 -0
- package/src/trusted-item-session.ts +80 -74
- package/src/trusted-session-materialization.ts +67 -0
- package/src/validation-primitives.ts +5 -0
- package/src/variable-snapshot.ts +20 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { normalizePackagePath, pushPackageDiagnostic } from "./qti-package-paths.js";
|
|
2
|
+
import { childPackageElements, packageDescendants, stripHrefSuffix } from "./qti-package-xml.js";
|
|
3
|
+
export const QTI_PACKAGE_MANIFEST_PATH = "imsmanifest.xml";
|
|
4
|
+
export function isQtiItemResource(type) {
|
|
5
|
+
return type.toLowerCase().startsWith("imsqti_item_xmlv3p0");
|
|
6
|
+
}
|
|
7
|
+
export function isQtiAssessmentTestResource(type) {
|
|
8
|
+
return type.toLowerCase().startsWith("imsqti_test_xmlv3p0");
|
|
9
|
+
}
|
|
10
|
+
export function parseManifestResources(manifestRoot, entriesByPath, diagnostics) {
|
|
11
|
+
const resourceNodes = packageDescendants(manifestRoot, "resources").flatMap((resources) => childPackageElements(resources, "resource"));
|
|
12
|
+
const resources = [];
|
|
13
|
+
for (const node of resourceNodes) {
|
|
14
|
+
const identifier = node.attributes.identifier ?? "";
|
|
15
|
+
if (identifier.length === 0) {
|
|
16
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.resource.identifier.missing", "error", "Manifest resource is missing an identifier.", QTI_PACKAGE_MANIFEST_PATH);
|
|
17
|
+
}
|
|
18
|
+
const files = parseManifestFiles(node, entriesByPath, diagnostics);
|
|
19
|
+
const href = node.attributes.href === undefined
|
|
20
|
+
? firstXmlManifestFileHref(files)
|
|
21
|
+
: normalizePackagePath(stripHrefSuffix(node.attributes.href), `manifest resource ${identifier || "(missing identifier)"} href`, diagnostics);
|
|
22
|
+
const dependencies = parseManifestDependencies(node, diagnostics);
|
|
23
|
+
resources.push({
|
|
24
|
+
identifier,
|
|
25
|
+
type: node.attributes.type ?? "",
|
|
26
|
+
href,
|
|
27
|
+
files,
|
|
28
|
+
dependencies,
|
|
29
|
+
attributes: { ...node.attributes },
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return resources;
|
|
33
|
+
}
|
|
34
|
+
function parseManifestFiles(resourceNode, entriesByPath, diagnostics) {
|
|
35
|
+
const files = [];
|
|
36
|
+
for (const fileNode of packageDescendants(resourceNode, "file")) {
|
|
37
|
+
const rawHref = fileNode.attributes.href;
|
|
38
|
+
if (!rawHref) {
|
|
39
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.file.href.missing", "error", "Manifest file entry is missing href.", QTI_PACKAGE_MANIFEST_PATH);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const href = normalizePackagePath(stripHrefSuffix(rawHref), "manifest file href", diagnostics);
|
|
43
|
+
if (!href)
|
|
44
|
+
continue;
|
|
45
|
+
files.push({ href, attributes: { ...fileNode.attributes } });
|
|
46
|
+
if (!entriesByPath.has(href)) {
|
|
47
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.file.missing", "error", `Manifest file reference ${href} was not found in the package.`, href);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return files;
|
|
51
|
+
}
|
|
52
|
+
function parseManifestDependencies(resourceNode, diagnostics) {
|
|
53
|
+
const dependencies = [];
|
|
54
|
+
for (const dependencyNode of packageDescendants(resourceNode, "dependency")) {
|
|
55
|
+
const identifierref = dependencyNode.attributes.identifierref;
|
|
56
|
+
if (!identifierref) {
|
|
57
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.dependency.identifierref.missing", "error", "Manifest dependency is missing identifierref.", QTI_PACKAGE_MANIFEST_PATH);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
dependencies.push(identifierref);
|
|
61
|
+
}
|
|
62
|
+
return [...new Set(dependencies)];
|
|
63
|
+
}
|
|
64
|
+
function firstXmlManifestFileHref(files) {
|
|
65
|
+
return files.find((file) => file.href.toLowerCase().endsWith(".xml"))?.href;
|
|
66
|
+
}
|
|
67
|
+
export function indexManifestResources(resources, diagnostics) {
|
|
68
|
+
const byIdentifier = new Map();
|
|
69
|
+
for (const resource of resources) {
|
|
70
|
+
const identifier = resource.identifier;
|
|
71
|
+
if (identifier.length === 0)
|
|
72
|
+
continue;
|
|
73
|
+
if (byIdentifier.has(identifier)) {
|
|
74
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.resource.identifier.duplicate", "error", `Manifest contains duplicate resource identifier ${identifier}.`, QTI_PACKAGE_MANIFEST_PATH);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
byIdentifier.set(identifier, resource);
|
|
78
|
+
}
|
|
79
|
+
return byIdentifier;
|
|
80
|
+
}
|
|
81
|
+
export function diagnoseManifestDependencyReferences(resources, resourcesByIdentifier, diagnostics) {
|
|
82
|
+
for (const resource of resources) {
|
|
83
|
+
for (const dependency of resource.dependencies) {
|
|
84
|
+
if (resourcesByIdentifier.has(dependency))
|
|
85
|
+
continue;
|
|
86
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.dependency.missing", "error", `Manifest resource ${resource.identifier} depends on missing resource ${dependency}.`, QTI_PACKAGE_MANIFEST_PATH);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function diagnosePrimaryResourceHrefs(resources, diagnostics) {
|
|
91
|
+
for (const resource of resources) {
|
|
92
|
+
if (resource.href)
|
|
93
|
+
continue;
|
|
94
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.resource.href.missing", "error", `Manifest resource ${resource.identifier || "(missing identifier)"} is missing a primary XML href.`, QTI_PACKAGE_MANIFEST_PATH);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export function detectPackageShape(itemResources, assessmentTestResources, diagnostics) {
|
|
98
|
+
if (assessmentTestResources.length > 0 && itemResources.length > 0) {
|
|
99
|
+
pushPackageDiagnostic(diagnostics, "package.shape.ambiguous", "error", "Manifest contains both QTI item resources and QTI assessment-test resources.", QTI_PACKAGE_MANIFEST_PATH);
|
|
100
|
+
return "unknown";
|
|
101
|
+
}
|
|
102
|
+
if (assessmentTestResources.length > 0)
|
|
103
|
+
return "assessment-test-resource";
|
|
104
|
+
if (itemResources.length > 0)
|
|
105
|
+
return "manifest-item-resources";
|
|
106
|
+
pushPackageDiagnostic(diagnostics, "package.shape.unsupported", "error", "Manifest does not contain QTI item or assessment-test resources.", QTI_PACKAGE_MANIFEST_PATH);
|
|
107
|
+
return "unknown";
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=qti-package-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-manifest.js","sourceRoot":"","sources":["../src/qti-package-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QtiPackageXmlNode } from "./package-xml.js";
|
|
2
|
+
import type { QtiAssessmentTestPackageModel, QtiPackageItem, QtiStandardAlignment, QtiTimingMetadata } from "./qti-package-types.js";
|
|
3
|
+
export declare function parseTimingMetadata(root: QtiPackageXmlNode, sourcePath: string): QtiTimingMetadata | undefined;
|
|
4
|
+
export declare function parseStandardAlignments(root: QtiPackageXmlNode, sourcePath: string): QtiStandardAlignment[];
|
|
5
|
+
export declare function uniqueStandards(standards: readonly QtiStandardAlignment[]): QtiStandardAlignment[];
|
|
6
|
+
export declare function primaryTiming(assessmentTest: QtiAssessmentTestPackageModel | undefined, items: readonly QtiPackageItem[]): QtiTimingMetadata | undefined;
|
|
7
|
+
export declare function packageTitle(manifestRoot: QtiPackageXmlNode | undefined, assessmentTest: QtiAssessmentTestPackageModel | undefined, items: readonly QtiPackageItem[]): string;
|
|
8
|
+
//# sourceMappingURL=qti-package-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-metadata.d.ts","sourceRoot":"","sources":["../src/qti-package-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,OAAO,KAAK,EACV,6BAA6B,EAC7B,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAkBhC,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,GACjB,iBAAiB,GAAG,SAAS,CAa/B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,GACjB,oBAAoB,EAAE,CAgCxB;AAeD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,oBAAoB,EAAE,CAkBxB;AAED,wBAAgB,aAAa,CAC3B,cAAc,EAAE,6BAA6B,GAAG,SAAS,EACzD,KAAK,EAAE,SAAS,cAAc,EAAE,GAC/B,iBAAiB,GAAG,SAAS,CAI/B;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,iBAAiB,GAAG,SAAS,EAC3C,cAAc,EAAE,6BAA6B,GAAG,SAAS,EACzD,KAAK,EAAE,SAAS,cAAc,EAAE,GAC/B,MAAM,CAaR"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { parseXmlBoolean } from "./parser-values.js";
|
|
2
|
+
import { packageDescendants } from "./qti-package-xml.js";
|
|
3
|
+
/** Known QTI / IMS CP alignment element names plus attribute-driven manifest metadata. */
|
|
4
|
+
const STANDARD_ALIGNMENT_ELEMENT_NAMES = new Set([
|
|
5
|
+
"standard-alignment",
|
|
6
|
+
"qti-standard-alignment",
|
|
7
|
+
"alignment-objective",
|
|
8
|
+
]);
|
|
9
|
+
const STANDARD_ALIGNMENT_ATTRIBUTE_NAMES = new Set([
|
|
10
|
+
"standard-id",
|
|
11
|
+
"standardIdentifier",
|
|
12
|
+
"standard-framework",
|
|
13
|
+
"standardFramework",
|
|
14
|
+
"target-id",
|
|
15
|
+
"targetIdentifier",
|
|
16
|
+
]);
|
|
17
|
+
export function parseTimingMetadata(root, sourcePath) {
|
|
18
|
+
const timeLimits = packageDescendants(root, "qti-time-limits")[0];
|
|
19
|
+
const timeDependent = parseXmlBoolean(root.attributes["time-dependent"]);
|
|
20
|
+
if (!timeLimits && timeDependent === undefined)
|
|
21
|
+
return undefined;
|
|
22
|
+
return {
|
|
23
|
+
sourcePath,
|
|
24
|
+
timeDependent,
|
|
25
|
+
minTime: timeLimits?.attributes["min-time"],
|
|
26
|
+
maxTime: timeLimits?.attributes["max-time"],
|
|
27
|
+
allowLateSubmission: parseXmlBoolean(timeLimits?.attributes["allow-late-submission"]),
|
|
28
|
+
attributes: timeLimits ? { ...timeLimits.attributes } : {},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export function parseStandardAlignments(root, sourcePath) {
|
|
32
|
+
const alignments = [];
|
|
33
|
+
for (const node of packageDescendants(root)) {
|
|
34
|
+
if (!isStandardAlignmentNode(node))
|
|
35
|
+
continue;
|
|
36
|
+
const text = node.text.trim();
|
|
37
|
+
alignments.push({
|
|
38
|
+
sourcePath,
|
|
39
|
+
qtiName: node.localName,
|
|
40
|
+
identifier: firstAttribute(node, [
|
|
41
|
+
"identifier",
|
|
42
|
+
"id",
|
|
43
|
+
"standard-id",
|
|
44
|
+
"standardIdentifier",
|
|
45
|
+
"target-id",
|
|
46
|
+
"targetIdentifier",
|
|
47
|
+
]),
|
|
48
|
+
framework: firstAttribute(node, [
|
|
49
|
+
"framework",
|
|
50
|
+
"standard-framework",
|
|
51
|
+
"standardFramework",
|
|
52
|
+
"educational-framework",
|
|
53
|
+
"educationalFramework",
|
|
54
|
+
]),
|
|
55
|
+
targetName: firstAttribute(node, ["target-name", "targetName", "name"]) ??
|
|
56
|
+
(text.length > 0 ? text : undefined),
|
|
57
|
+
targetUrl: firstAttribute(node, ["href", "url", "uri", "target-url", "targetUrl"]),
|
|
58
|
+
text: text.length > 0 ? text : undefined,
|
|
59
|
+
attributes: { ...node.attributes },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
return alignments;
|
|
63
|
+
}
|
|
64
|
+
function isStandardAlignmentNode(node) {
|
|
65
|
+
if (STANDARD_ALIGNMENT_ELEMENT_NAMES.has(node.localName))
|
|
66
|
+
return true;
|
|
67
|
+
return Object.keys(node.attributes).some((name) => STANDARD_ALIGNMENT_ATTRIBUTE_NAMES.has(name));
|
|
68
|
+
}
|
|
69
|
+
function firstAttribute(node, names) {
|
|
70
|
+
for (const name of names) {
|
|
71
|
+
const value = node.attributes[name];
|
|
72
|
+
if (value && value.trim().length > 0)
|
|
73
|
+
return value.trim();
|
|
74
|
+
}
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
export function uniqueStandards(standards) {
|
|
78
|
+
const seen = new Set();
|
|
79
|
+
const unique = [];
|
|
80
|
+
for (const standard of standards) {
|
|
81
|
+
const key = [
|
|
82
|
+
standard.sourcePath,
|
|
83
|
+
standard.qtiName,
|
|
84
|
+
standard.identifier ?? "",
|
|
85
|
+
standard.framework ?? "",
|
|
86
|
+
standard.targetName ?? "",
|
|
87
|
+
standard.targetUrl ?? "",
|
|
88
|
+
standard.text ?? "",
|
|
89
|
+
].join("\u0000");
|
|
90
|
+
if (seen.has(key))
|
|
91
|
+
continue;
|
|
92
|
+
seen.add(key);
|
|
93
|
+
unique.push(standard);
|
|
94
|
+
}
|
|
95
|
+
return unique;
|
|
96
|
+
}
|
|
97
|
+
export function primaryTiming(assessmentTest, items) {
|
|
98
|
+
if (assessmentTest?.timing)
|
|
99
|
+
return assessmentTest.timing;
|
|
100
|
+
const timedItems = items.filter((item) => item.timing !== undefined);
|
|
101
|
+
return timedItems.length === 1 ? timedItems[0]?.timing : undefined;
|
|
102
|
+
}
|
|
103
|
+
export function packageTitle(manifestRoot, assessmentTest, items) {
|
|
104
|
+
const manifestTitle = manifestRoot
|
|
105
|
+
? packageDescendants(manifestRoot, "title")
|
|
106
|
+
.map((node) => node.text.trim())
|
|
107
|
+
.find((text) => text.length > 0)
|
|
108
|
+
: undefined;
|
|
109
|
+
return (assessmentTest?.title ??
|
|
110
|
+
manifestTitle ??
|
|
111
|
+
items.find((item) => item.title !== undefined)?.title ??
|
|
112
|
+
manifestRoot?.attributes.identifier ??
|
|
113
|
+
"");
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=qti-package-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-metadata.js","sourceRoot":"","sources":["../src/qti-package-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { QtiDiagnostic } from "./types.js";
|
|
2
|
+
/** Add a package parser diagnostic to an existing diagnostics list. */
|
|
3
|
+
export declare function pushPackageDiagnostic(diagnostics: QtiDiagnostic[], code: string, severity: QtiDiagnostic["severity"], message: string, path?: string): void;
|
|
4
|
+
/** Normalize a package-relative path and diagnose absolute or escaping paths. */
|
|
5
|
+
export declare function normalizePackagePath(path: string, context: string, diagnostics: QtiDiagnostic[]): string | undefined;
|
|
6
|
+
//# sourceMappingURL=qti-package-paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-paths.d.ts","sourceRoot":"","sources":["../src/qti-package-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,uEAAuE;AACvE,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,aAAa,EAAE,EAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,EACnC,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,GACZ,IAAI,CAON;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,aAAa,EAAE,GAC3B,MAAM,GAAG,SAAS,CAgCpB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Add a package parser diagnostic to an existing diagnostics list. */
|
|
2
|
+
export function pushPackageDiagnostic(diagnostics, code, severity, message, path) {
|
|
3
|
+
diagnostics.push({
|
|
4
|
+
code,
|
|
5
|
+
severity,
|
|
6
|
+
message,
|
|
7
|
+
path,
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
/** Normalize a package-relative path and diagnose absolute or escaping paths. */
|
|
11
|
+
export function normalizePackagePath(path, context, diagnostics) {
|
|
12
|
+
if (path.startsWith("/") || /^[A-Za-z]:[\\/]/.test(path) || /^[a-z][a-z0-9+.-]*:/i.test(path)) {
|
|
13
|
+
pushPackageDiagnostic(diagnostics, "package.path.absolute", "error", `${context} ${path} must be a package-relative path.`, path);
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const parts = [];
|
|
17
|
+
for (const part of path.split("/")) {
|
|
18
|
+
if (!part || part === ".")
|
|
19
|
+
continue;
|
|
20
|
+
if (part === "..") {
|
|
21
|
+
if (parts.length === 0) {
|
|
22
|
+
pushPackageDiagnostic(diagnostics, "package.path.escape", "error", `${context} ${path} escapes the package root.`, path);
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
parts.pop();
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
parts.push(part);
|
|
29
|
+
}
|
|
30
|
+
return parts.join("/");
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=qti-package-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-paths.js","sourceRoot":"","sources":["../src/qti-package-paths.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,UAAU,qBAAqB,CACnC,WAA4B,EAC5B,IAAY,EACZ,QAAmC,EACnC,OAAe,EACf,IAAa;IAEb,WAAW,CAAC,IAAI,CAAC;QACf,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,OAAe,EACf,WAA4B;IAE5B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9F,qBAAqB,CACnB,WAAW,EACX,uBAAuB,EACvB,OAAO,EACP,GAAG,OAAO,IAAI,IAAI,mCAAmC,EACrD,IAAI,CACL,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG;YAAE,SAAS;QACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,qBAAqB,CACnB,WAAW,EACX,qBAAqB,EACrB,OAAO,EACP,GAAG,OAAO,IAAI,IAAI,4BAA4B,EAC9C,IAAI,CACL,CAAC;gBACF,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,KAAK,CAAC,GAAG,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { QtiDiagnostic, QtiDocument } from "./types.js";
|
|
2
|
+
export type { QtiPackageInflateContext, QtiPackageInflateRaw, QtiPackageParseOptions, } from "./qti-package-zip.js";
|
|
3
|
+
/** Neutral package shape detected from IMS manifest resources. */
|
|
4
|
+
export type QtiPackageShape = "manifest-item-resources" | "assessment-test-resource" | "unknown";
|
|
5
|
+
/** Origin of an assessment item inside a parsed QTI package. */
|
|
6
|
+
export type QtiPackageItemSource = "manifest" | "assessment-test";
|
|
7
|
+
/** Source of a package-local asset reference. */
|
|
8
|
+
export type QtiPackageAssetSource = "manifest-resource" | "item-content" | "assessment-test-content";
|
|
9
|
+
/** Parsed package manifest file entry. */
|
|
10
|
+
export interface QtiManifestFile {
|
|
11
|
+
readonly href: string;
|
|
12
|
+
readonly attributes: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
/** Parsed package manifest resource entry. */
|
|
15
|
+
export interface QtiManifestResource {
|
|
16
|
+
readonly identifier: string;
|
|
17
|
+
readonly type: string;
|
|
18
|
+
readonly href?: string | undefined;
|
|
19
|
+
readonly files: readonly QtiManifestFile[];
|
|
20
|
+
readonly dependencies: readonly string[];
|
|
21
|
+
readonly attributes: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
/** Parsed timing metadata from item or assessment-test XML. */
|
|
24
|
+
export interface QtiTimingMetadata {
|
|
25
|
+
readonly sourcePath: string;
|
|
26
|
+
readonly timeDependent?: boolean | undefined;
|
|
27
|
+
readonly minTime?: string | undefined;
|
|
28
|
+
readonly maxTime?: string | undefined;
|
|
29
|
+
readonly allowLateSubmission?: boolean | undefined;
|
|
30
|
+
readonly attributes: Record<string, string>;
|
|
31
|
+
}
|
|
32
|
+
/** Neutral standard-alignment metadata discovered in package XML. */
|
|
33
|
+
export interface QtiStandardAlignment {
|
|
34
|
+
readonly sourcePath: string;
|
|
35
|
+
readonly qtiName: string;
|
|
36
|
+
readonly identifier?: string | undefined;
|
|
37
|
+
readonly framework?: string | undefined;
|
|
38
|
+
readonly targetName?: string | undefined;
|
|
39
|
+
readonly targetUrl?: string | undefined;
|
|
40
|
+
readonly text?: string | undefined;
|
|
41
|
+
readonly attributes: Record<string, string>;
|
|
42
|
+
}
|
|
43
|
+
/** Assessment item reference from an assessment-test package. */
|
|
44
|
+
export interface QtiAssessmentTestItemRef {
|
|
45
|
+
readonly identifier?: string | undefined;
|
|
46
|
+
readonly href: string;
|
|
47
|
+
readonly attributes: Record<string, string>;
|
|
48
|
+
}
|
|
49
|
+
/** Parsed assessment-test resource model for package-level importers. */
|
|
50
|
+
export interface QtiAssessmentTestPackageModel {
|
|
51
|
+
readonly href: string;
|
|
52
|
+
readonly identifier: string;
|
|
53
|
+
readonly title?: string | undefined;
|
|
54
|
+
readonly manifestResourceIdentifier?: string | undefined;
|
|
55
|
+
readonly itemRefs: readonly QtiAssessmentTestItemRef[];
|
|
56
|
+
readonly timing?: QtiTimingMetadata | undefined;
|
|
57
|
+
readonly standards: readonly QtiStandardAlignment[];
|
|
58
|
+
readonly assetHrefs: readonly string[];
|
|
59
|
+
readonly diagnostics: readonly QtiDiagnostic[];
|
|
60
|
+
readonly attributes: Record<string, string>;
|
|
61
|
+
readonly xml: string;
|
|
62
|
+
}
|
|
63
|
+
/** Parsed assessment item model inside a QTI package. */
|
|
64
|
+
export interface QtiPackageItem {
|
|
65
|
+
readonly href: string;
|
|
66
|
+
readonly source: QtiPackageItemSource;
|
|
67
|
+
readonly manifestResourceIdentifier?: string | undefined;
|
|
68
|
+
readonly assessmentItemRefIdentifier?: string | undefined;
|
|
69
|
+
readonly identifier?: string | undefined;
|
|
70
|
+
readonly title?: string | undefined;
|
|
71
|
+
readonly document?: QtiDocument | undefined;
|
|
72
|
+
readonly timing?: QtiTimingMetadata | undefined;
|
|
73
|
+
readonly standards: readonly QtiStandardAlignment[];
|
|
74
|
+
readonly assetHrefs: readonly string[];
|
|
75
|
+
readonly diagnostics: readonly QtiDiagnostic[];
|
|
76
|
+
readonly xml: string;
|
|
77
|
+
}
|
|
78
|
+
/** Package-local asset discovered from manifest files or XML content references. */
|
|
79
|
+
export interface QtiPackageAsset {
|
|
80
|
+
readonly href: string;
|
|
81
|
+
readonly mediaType?: string | undefined;
|
|
82
|
+
readonly source: QtiPackageAssetSource;
|
|
83
|
+
readonly referencedBy: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
/** Parsed QTI package manifest/resource graph and item/test projection. */
|
|
86
|
+
export interface QtiPackageParseResult {
|
|
87
|
+
readonly ok: boolean;
|
|
88
|
+
readonly title: string;
|
|
89
|
+
readonly packageShape: QtiPackageShape;
|
|
90
|
+
readonly items: readonly QtiPackageItem[];
|
|
91
|
+
readonly assets: readonly QtiPackageAsset[];
|
|
92
|
+
readonly manifestResources: readonly QtiManifestResource[];
|
|
93
|
+
readonly assessmentTest?: QtiAssessmentTestPackageModel | undefined;
|
|
94
|
+
readonly timing?: QtiTimingMetadata | undefined;
|
|
95
|
+
readonly standards: readonly QtiStandardAlignment[];
|
|
96
|
+
readonly diagnostics: readonly QtiDiagnostic[];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=qti-package-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-types.d.ts","sourceRoot":"","sources":["../src/qti-package-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-types.js","sourceRoot":"","sources":["../src/qti-package-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type QtiPackageXmlNode } from "./package-xml.js";
|
|
2
|
+
import { type QtiPackageEntry } from "./qti-package-zip.js";
|
|
3
|
+
import type { QtiDiagnostic } from "./types.js";
|
|
4
|
+
/** Parsed package XML file with lightweight tree and source text. */
|
|
5
|
+
export interface PackageXmlFile {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly xml: string;
|
|
8
|
+
readonly root?: QtiPackageXmlNode | undefined;
|
|
9
|
+
readonly errors: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function parseXmlFiles(entriesByPath: ReadonlyMap<string, QtiPackageEntry>): Map<string, PackageXmlFile>;
|
|
12
|
+
export declare function parsePackageXml(entry: QtiPackageEntry): PackageXmlFile;
|
|
13
|
+
export declare function pushXmlDiagnostics(xmlFile: PackageXmlFile, diagnostics: QtiDiagnostic[]): void;
|
|
14
|
+
export declare function childPackageElements(node: QtiPackageXmlNode, localName?: string): QtiPackageXmlNode[];
|
|
15
|
+
export declare function packageDescendants(node: QtiPackageXmlNode | undefined, localName?: string): QtiPackageXmlNode[];
|
|
16
|
+
export declare function resolvePackageHref(from: string, href: string, diagnostics: QtiDiagnostic[]): string | undefined;
|
|
17
|
+
export declare function stripHrefSuffix(href: string): string;
|
|
18
|
+
export declare function isPackageRelativeHref(href: string | undefined): href is string;
|
|
19
|
+
export declare function joinPackagePath(packagePath: string, localPath: string): string;
|
|
20
|
+
export declare function scopeDiagnosticToPackagePath(packagePath: string, diagnostic: QtiDiagnostic): QtiDiagnostic;
|
|
21
|
+
//# sourceMappingURL=qti-package-xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-xml.d.ts","sourceRoot":"","sources":["../src/qti-package-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAElF,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,qEAAqE;AACrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,wBAAgB,aAAa,CAC3B,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,GAClD,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAO7B;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,cAAc,CAStE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAI9F;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,SAAS,CAAC,EAAE,MAAM,GACjB,iBAAiB,EAAE,CAErB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,SAAS,CAAC,EAAE,MAAM,GACjB,iBAAiB,EAAE,CAQrB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,aAAa,EAAE,GAC3B,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,IAAI,MAAM,CAI9E;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,aAAa,GACxB,aAAa,CAQf"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { parseQtiPackageXmlTree } from "./package-xml.js";
|
|
2
|
+
import { normalizePackagePath, pushPackageDiagnostic } from "./qti-package-paths.js";
|
|
3
|
+
import { decodeUtf8 } from "./qti-package-zip.js";
|
|
4
|
+
export function parseXmlFiles(entriesByPath) {
|
|
5
|
+
const xmlFiles = new Map();
|
|
6
|
+
for (const entry of entriesByPath.values()) {
|
|
7
|
+
if (!entry.path.toLowerCase().endsWith(".xml"))
|
|
8
|
+
continue;
|
|
9
|
+
xmlFiles.set(entry.path, parsePackageXml(entry));
|
|
10
|
+
}
|
|
11
|
+
return xmlFiles;
|
|
12
|
+
}
|
|
13
|
+
export function parsePackageXml(entry) {
|
|
14
|
+
const xml = decodeUtf8(entry.bytes);
|
|
15
|
+
const parsed = parseQtiPackageXmlTree(xml);
|
|
16
|
+
return {
|
|
17
|
+
path: entry.path,
|
|
18
|
+
xml,
|
|
19
|
+
root: parsed.root,
|
|
20
|
+
errors: parsed.errors,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export function pushXmlDiagnostics(xmlFile, diagnostics) {
|
|
24
|
+
for (const message of xmlFile.errors) {
|
|
25
|
+
pushPackageDiagnostic(diagnostics, "xml.parse", "error", message, xmlFile.path);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function childPackageElements(node, localName) {
|
|
29
|
+
return node.children.filter((child) => !localName || child.localName === localName);
|
|
30
|
+
}
|
|
31
|
+
export function packageDescendants(node, localName) {
|
|
32
|
+
if (!node)
|
|
33
|
+
return [];
|
|
34
|
+
const found = [];
|
|
35
|
+
for (const child of node.children) {
|
|
36
|
+
if (!localName || child.localName === localName)
|
|
37
|
+
found.push(child);
|
|
38
|
+
found.push(...packageDescendants(child, localName));
|
|
39
|
+
}
|
|
40
|
+
return found;
|
|
41
|
+
}
|
|
42
|
+
export function resolvePackageHref(from, href, diagnostics) {
|
|
43
|
+
const strippedHref = stripHrefSuffix(href);
|
|
44
|
+
const base = from.includes("/") ? from.slice(0, from.lastIndexOf("/") + 1) : "";
|
|
45
|
+
return normalizePackagePath(`${base}${strippedHref}`, "package reference", diagnostics);
|
|
46
|
+
}
|
|
47
|
+
export function stripHrefSuffix(href) {
|
|
48
|
+
return href.split(/[?#]/, 1)[0] ?? "";
|
|
49
|
+
}
|
|
50
|
+
export function isPackageRelativeHref(href) {
|
|
51
|
+
const trimmed = href?.trim() ?? "";
|
|
52
|
+
if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("//"))
|
|
53
|
+
return false;
|
|
54
|
+
return !/^[a-z][a-z0-9+.-]*:/i.test(trimmed);
|
|
55
|
+
}
|
|
56
|
+
export function joinPackagePath(packagePath, localPath) {
|
|
57
|
+
return localPath.startsWith("/") ? `${packagePath}${localPath}` : `${packagePath}/${localPath}`;
|
|
58
|
+
}
|
|
59
|
+
export function scopeDiagnosticToPackagePath(packagePath, diagnostic) {
|
|
60
|
+
const localPath = diagnostic.path ?? diagnostic.source?.path;
|
|
61
|
+
const path = localPath ? joinPackagePath(packagePath, localPath) : packagePath;
|
|
62
|
+
return {
|
|
63
|
+
...diagnostic,
|
|
64
|
+
path,
|
|
65
|
+
source: diagnostic.source ? { ...diagnostic.source, path } : diagnostic.source,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=qti-package-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-xml.js","sourceRoot":"","sources":["../src/qti-package-xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { QtiDiagnostic } from "./types.js";
|
|
2
|
+
/** Context passed to a caller-owned raw DEFLATE inflater. */
|
|
3
|
+
export interface QtiPackageInflateContext {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly compressedSize: number;
|
|
6
|
+
readonly uncompressedSize: number;
|
|
7
|
+
readonly compressionMethod: number;
|
|
8
|
+
}
|
|
9
|
+
/** Optional raw DEFLATE inflater for ZIP entries compressed with method 8. */
|
|
10
|
+
export type QtiPackageInflateRaw = (bytes: Uint8Array, context: QtiPackageInflateContext) => Uint8Array;
|
|
11
|
+
/** Options for parsing a QTI ZIP package. */
|
|
12
|
+
export interface QtiPackageParseOptions {
|
|
13
|
+
readonly inflateRaw?: QtiPackageInflateRaw | undefined;
|
|
14
|
+
}
|
|
15
|
+
/** Decoded ZIP entry from a QTI package. */
|
|
16
|
+
export interface QtiPackageEntry {
|
|
17
|
+
readonly path: string;
|
|
18
|
+
readonly bytes: Uint8Array;
|
|
19
|
+
}
|
|
20
|
+
/** Read stored ZIP entries and optionally inflate raw DEFLATE entries through caller code. */
|
|
21
|
+
export declare function readQtiPackageZipEntries(bytes: Uint8Array, options: QtiPackageParseOptions, diagnostics: QtiDiagnostic[]): QtiPackageEntry[];
|
|
22
|
+
/** Decode UTF-8 package entry names and XML payloads. */
|
|
23
|
+
export declare function decodeUtf8(bytes: Uint8Array): string;
|
|
24
|
+
//# sourceMappingURL=qti-package-zip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-zip.d.ts","sourceRoot":"","sources":["../src/qti-package-zip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;CACpC;AAED,8EAA8E;AAC9E,MAAM,MAAM,oBAAoB,GAAG,CACjC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,wBAAwB,KAC9B,UAAU,CAAC;AAEhB,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;CACxD;AAED,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,8FAA8F;AAC9F,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,aAAa,EAAE,GAC3B,eAAe,EAAE,CAYnB;AAKD,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAoBpD"}
|