@longsightgroup/qti3-core 0.10.3 → 0.10.5
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 +35 -0
- package/dist/attempt-state.d.ts.map +1 -1
- package/dist/attempt-state.js +2 -27
- package/dist/attempt-state.js.map +1 -1
- package/dist/content-text.d.ts.map +1 -1
- package/dist/content-text.js +31 -9
- package/dist/content-text.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/package-xml.d.ts +1 -0
- package/dist/package-xml.d.ts.map +1 -1
- package/dist/package-xml.js +1 -0
- package/dist/package-xml.js.map +1 -1
- package/dist/parser-custom-interactions.js +1 -0
- package/dist/parser-custom-interactions.js.map +1 -1
- package/dist/parser-item-metadata.d.ts.map +1 -1
- package/dist/parser-item-metadata.js +1 -0
- package/dist/parser-item-metadata.js.map +1 -1
- package/dist/parser-values.d.ts +5 -1
- package/dist/parser-values.d.ts.map +1 -1
- package/dist/parser-values.js +31 -5
- package/dist/parser-values.js.map +1 -1
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +65 -34
- package/dist/parser.js.map +1 -1
- package/dist/processing-evaluator-comparison.d.ts.map +1 -1
- package/dist/processing-evaluator-comparison.js +16 -6
- package/dist/processing-evaluator-comparison.js.map +1 -1
- package/dist/processing-evaluator-variable.d.ts.map +1 -1
- package/dist/processing-evaluator-variable.js +1 -1
- package/dist/processing-evaluator-variable.js.map +1 -1
- package/dist/processing-mapping.d.ts.map +1 -1
- package/dist/processing-mapping.js +15 -7
- package/dist/processing-mapping.js.map +1 -1
- package/dist/processing-values.d.ts +4 -4
- package/dist/processing-values.d.ts.map +1 -1
- package/dist/processing-values.js +28 -14
- package/dist/processing-values.js.map +1 -1
- package/dist/processing-variables.d.ts +3 -1
- package/dist/processing-variables.d.ts.map +1 -1
- package/dist/processing-variables.js +38 -2
- package/dist/processing-variables.js.map +1 -1
- package/dist/qti-namespaces.d.ts +7 -0
- package/dist/qti-namespaces.d.ts.map +1 -0
- package/dist/qti-namespaces.js +7 -0
- package/dist/qti-namespaces.js.map +1 -0
- package/dist/qti-package-assets.d.ts +3 -2
- package/dist/qti-package-assets.d.ts.map +1 -1
- package/dist/qti-package-assets.js.map +1 -1
- package/dist/qti-package-items.d.ts +1 -0
- package/dist/qti-package-items.d.ts.map +1 -1
- package/dist/qti-package-items.js +55 -41
- package/dist/qti-package-items.js.map +1 -1
- package/dist/qti-package-manifest.d.ts +3 -2
- package/dist/qti-package-manifest.d.ts.map +1 -1
- package/dist/qti-package-manifest.js +4 -3
- package/dist/qti-package-manifest.js.map +1 -1
- package/dist/qti-package-metadata.d.ts +3 -2
- package/dist/qti-package-metadata.d.ts.map +1 -1
- package/dist/qti-package-metadata.js +8 -4
- package/dist/qti-package-metadata.js.map +1 -1
- package/dist/qti-package-plan.d.ts +41 -0
- package/dist/qti-package-plan.d.ts.map +1 -0
- package/dist/qti-package-plan.js +85 -0
- package/dist/qti-package-plan.js.map +1 -0
- package/dist/qti-package-stream.d.ts +38 -0
- package/dist/qti-package-stream.d.ts.map +1 -0
- package/dist/qti-package-stream.js +149 -0
- package/dist/qti-package-stream.js.map +1 -0
- package/dist/qti-package-xml.d.ts +4 -2
- package/dist/qti-package-xml.d.ts.map +1 -1
- package/dist/qti-package-xml.js +10 -5
- package/dist/qti-package-xml.js.map +1 -1
- package/dist/qti-package-zip.d.ts +17 -1
- package/dist/qti-package-zip.d.ts.map +1 -1
- package/dist/qti-package-zip.js +60 -5
- package/dist/qti-package-zip.js.map +1 -1
- package/dist/qti-package.d.ts +3 -3
- package/dist/qti-package.d.ts.map +1 -1
- package/dist/qti-package.js +23 -47
- package/dist/qti-package.js.map +1 -1
- package/dist/response-validation.d.ts +12 -2
- package/dist/response-validation.d.ts.map +1 -1
- package/dist/response-validation.js +122 -19
- package/dist/response-validation.js.map +1 -1
- package/dist/session.js +1 -1
- package/dist/session.js.map +1 -1
- package/dist/trusted-item-session.d.ts.map +1 -1
- package/dist/trusted-item-session.js +5 -3
- package/dist/trusted-item-session.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/validation-primitives.d.ts +5 -1
- package/dist/validation-primitives.d.ts.map +1 -1
- package/dist/validation-primitives.js +40 -2
- package/dist/validation-primitives.js.map +1 -1
- package/dist/xml.d.ts.map +1 -1
- package/dist/xml.js +28 -0
- package/dist/xml.js.map +1 -1
- package/package.json +1 -1
- package/src/attempt-state.ts +2 -26
- package/src/content-text.ts +45 -9
- package/src/index.ts +11 -0
- package/src/package-xml.ts +2 -0
- package/src/parser-custom-interactions.ts +1 -0
- package/src/parser-item-metadata.ts +1 -0
- package/src/parser-values.ts +31 -5
- package/src/parser.ts +122 -91
- package/src/processing-evaluator-comparison.ts +24 -5
- package/src/processing-evaluator-variable.ts +1 -0
- package/src/processing-mapping.ts +22 -6
- package/src/processing-values.ts +59 -14
- package/src/processing-variables.ts +47 -2
- package/src/qti-namespaces.ts +8 -0
- package/src/qti-package-assets.ts +3 -4
- package/src/qti-package-items.ts +101 -84
- package/src/qti-package-manifest.ts +15 -7
- package/src/qti-package-metadata.ts +19 -6
- package/src/qti-package-plan.ts +168 -0
- package/src/qti-package-stream.ts +254 -0
- package/src/qti-package-xml.ts +16 -3
- package/src/qti-package-zip.ts +128 -3
- package/src/qti-package.ts +30 -81
- package/src/response-validation.ts +185 -20
- package/src/session.ts +1 -0
- package/src/trusted-item-session.ts +5 -3
- package/src/types.ts +2 -0
- package/src/validation-primitives.ts +43 -3
- package/src/xml.ts +37 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-package-manifest.js","sourceRoot":"","sources":["../src/qti-package-manifest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"qti-package-manifest.js","sourceRoot":"","sources":["../src/qti-package-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export declare function parseTimeLimits(node: QtiPackageXmlNode | undefined, sou
|
|
|
6
6
|
export declare function parseItemSessionControl(node: QtiPackageXmlNode | undefined, sourcePath: string, diagnostics: QtiDiagnostic[]): QtiItemSessionControl | undefined;
|
|
7
7
|
export declare function parseStandardAlignments(root: QtiPackageXmlNode, sourcePath: string): QtiStandardAlignment[];
|
|
8
8
|
export declare function uniqueStandards(standards: readonly QtiStandardAlignment[]): QtiStandardAlignment[];
|
|
9
|
-
export declare function
|
|
10
|
-
export declare function
|
|
9
|
+
export declare function primaryTimingFromScan(assessmentTest: QtiAssessmentTestPackageModel | undefined, timedItemCount: number, soleItemTiming: QtiTimingMetadata | undefined): QtiTimingMetadata | undefined;
|
|
10
|
+
export declare function primaryTiming(assessmentTest: QtiAssessmentTestPackageModel | undefined, items: readonly Pick<QtiPackageItem, "timing">[]): QtiTimingMetadata | undefined;
|
|
11
|
+
export declare function packageTitle(manifestRoot: QtiPackageXmlNode | undefined, assessmentTest: QtiAssessmentTestPackageModel | undefined, items: readonly Pick<QtiPackageItem, "title">[]): string;
|
|
11
12
|
//# sourceMappingURL=qti-package-metadata.d.ts.map
|
|
@@ -1 +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;AAI1D,OAAO,KAAK,EACV,6BAA6B,EAC7B,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
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;AAI1D,OAAO,KAAK,EACV,6BAA6B,EAC7B,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAmBhD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,aAAa,EAAE,EAC5B,gBAAgB,CAAC,EAAE,aAAa,GAC/B,iBAAiB,GAAG,SAAS,CAc/B;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,aAAa,EAAE,GAC3B,aAAa,GAAG,SAAS,CAgC3B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,aAAa,EAAE,GAC3B,qBAAqB,GAAG,SAAS,CAanC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,iBAAiB,EACvB,UAAU,EAAE,MAAM,GACjB,oBAAoB,EAAE,CAiCxB;AA4DD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,SAAS,oBAAoB,EAAE,GACzC,oBAAoB,EAAE,CAsBxB;AAuDD,wBAAgB,qBAAqB,CACnC,cAAc,EAAE,6BAA6B,GAAG,SAAS,EACzD,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,iBAAiB,GAAG,SAAS,GAC5C,iBAAiB,GAAG,SAAS,CAG/B;AAED,wBAAgB,aAAa,CAC3B,cAAc,EAAE,6BAA6B,GAAG,SAAS,EACzD,KAAK,EAAE,SAAS,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,GAC/C,iBAAiB,GAAG,SAAS,CAO/B;AAED,wBAAgB,YAAY,CAC1B,YAAY,EAAE,iBAAiB,GAAG,SAAS,EAC3C,cAAc,EAAE,6BAA6B,GAAG,SAAS,EACzD,KAAK,EAAE,SAAS,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,GAC9C,MAAM,CAaR"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { parseXmlBoolean } from "./parser-values.js";
|
|
2
2
|
import { pushPackageDiagnostic } from "./qti-package-paths.js";
|
|
3
3
|
import { childPackageElements, packageDescendants } from "./qti-package-xml.js";
|
|
4
|
+
import { QTI_ASI_NAMESPACE, QTI_PACKAGE_MANIFEST_NAMESPACE } from "./qti-namespaces.js";
|
|
4
5
|
/** Known QTI / IMS CP alignment element names plus attribute-driven manifest metadata. */
|
|
5
6
|
const STANDARD_ALIGNMENT_ELEMENT_NAMES = new Set([
|
|
6
7
|
"standard-alignment",
|
|
@@ -16,7 +17,7 @@ const STANDARD_ALIGNMENT_ATTRIBUTE_NAMES = new Set([
|
|
|
16
17
|
"targetIdentifier",
|
|
17
18
|
]);
|
|
18
19
|
export function parseTimingMetadata(root, sourcePath, diagnostics, parsedTimeLimits) {
|
|
19
|
-
const timeLimitsNode = childPackageElements(root, "qti-time-limits")[0];
|
|
20
|
+
const timeLimitsNode = childPackageElements(root, "qti-time-limits", QTI_ASI_NAMESPACE)[0];
|
|
20
21
|
const timeLimits = parsedTimeLimits ?? parseTimeLimits(timeLimitsNode, sourcePath, diagnostics);
|
|
21
22
|
const timeDependent = parseXmlBoolean(root.attributes["time-dependent"]);
|
|
22
23
|
if (!timeLimitsNode && timeDependent === undefined)
|
|
@@ -202,15 +203,18 @@ function optionalFiniteNumber(raw) {
|
|
|
202
203
|
const value = Number(raw);
|
|
203
204
|
return Number.isFinite(value) ? value : undefined;
|
|
204
205
|
}
|
|
205
|
-
export function
|
|
206
|
+
export function primaryTimingFromScan(assessmentTest, timedItemCount, soleItemTiming) {
|
|
206
207
|
if (assessmentTest?.timing)
|
|
207
208
|
return assessmentTest.timing;
|
|
209
|
+
return timedItemCount === 1 ? soleItemTiming : undefined;
|
|
210
|
+
}
|
|
211
|
+
export function primaryTiming(assessmentTest, items) {
|
|
208
212
|
const timedItems = items.filter((item) => item.timing !== undefined);
|
|
209
|
-
return timedItems.length === 1 ? timedItems[0]?.timing : undefined;
|
|
213
|
+
return primaryTimingFromScan(assessmentTest, timedItems.length, timedItems.length === 1 ? timedItems[0]?.timing : undefined);
|
|
210
214
|
}
|
|
211
215
|
export function packageTitle(manifestRoot, assessmentTest, items) {
|
|
212
216
|
const manifestTitle = manifestRoot
|
|
213
|
-
? packageDescendants(manifestRoot, "title")
|
|
217
|
+
? packageDescendants(manifestRoot, "title", QTI_PACKAGE_MANIFEST_NAMESPACE)
|
|
214
218
|
.map((node) => node.text.trim())
|
|
215
219
|
.find((text) => text.length > 0)
|
|
216
220
|
: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-package-metadata.js","sourceRoot":"","sources":["../src/qti-package-metadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"qti-package-metadata.js","sourceRoot":"","sources":["../src/qti-package-metadata.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { QtiPackageXmlNode } from "./package-xml.js";
|
|
2
|
+
import { type PackageXmlFile } from "./qti-package-xml.js";
|
|
3
|
+
import type { QtiAssessmentTestPackageModel, QtiManifestResource, QtiPackageItem, QtiPackageParseResult, QtiPackageShape, QtiStandardAlignment, QtiTimingMetadata } from "./qti-package-types.js";
|
|
4
|
+
import type { QtiDiagnostic } from "./types.js";
|
|
5
|
+
/** Package metadata without extracted bodies or retained item models. */
|
|
6
|
+
export type QtiPackageSummary = Omit<QtiPackageParseResult, "items" | "entries"> & {
|
|
7
|
+
readonly itemCount: number;
|
|
8
|
+
};
|
|
9
|
+
/** Inspect manifest semantics against an entry inventory without reading item bodies. */
|
|
10
|
+
export declare function inspectPackageManifest(entriesByPath: {
|
|
11
|
+
has(path: string): boolean;
|
|
12
|
+
}, manifestXml: PackageXmlFile | undefined, diagnostics: QtiDiagnostic[]): {
|
|
13
|
+
manifestRoot: QtiPackageXmlNode | undefined;
|
|
14
|
+
manifestResources: QtiManifestResource[];
|
|
15
|
+
resourcesByIdentifier: Map<string, QtiManifestResource>;
|
|
16
|
+
itemResources: QtiManifestResource[];
|
|
17
|
+
assessmentTestResources: QtiManifestResource[];
|
|
18
|
+
packageShape: QtiPackageShape;
|
|
19
|
+
};
|
|
20
|
+
export interface BuildPackageSummaryInput {
|
|
21
|
+
readonly manifestRoot: QtiPackageXmlNode | undefined;
|
|
22
|
+
readonly manifestResources: readonly QtiManifestResource[];
|
|
23
|
+
readonly resourcesByIdentifier: ReadonlyMap<string, QtiManifestResource>;
|
|
24
|
+
readonly packageShape: QtiPackageShape;
|
|
25
|
+
readonly assessmentTest: QtiAssessmentTestPackageModel | undefined;
|
|
26
|
+
readonly assetItems: readonly Pick<QtiPackageItem, "href" | "manifestResourceIdentifier" | "assetHrefs">[];
|
|
27
|
+
readonly titleItems: readonly Pick<QtiPackageItem, "title">[];
|
|
28
|
+
readonly timedItemCount: number;
|
|
29
|
+
readonly soleItemTiming: QtiTimingMetadata | undefined;
|
|
30
|
+
readonly itemStandards: readonly QtiStandardAlignment[];
|
|
31
|
+
readonly entriesByPath: {
|
|
32
|
+
has(path: string): boolean;
|
|
33
|
+
};
|
|
34
|
+
readonly diagnostics: QtiDiagnostic[];
|
|
35
|
+
readonly itemCount: number;
|
|
36
|
+
}
|
|
37
|
+
/** Build canonical package metadata shared by sync and incremental parsers. */
|
|
38
|
+
export declare function buildPackageSummary(input: BuildPackageSummaryInput): QtiPackageSummary;
|
|
39
|
+
export declare function failedPackageSummary(diagnostics: QtiDiagnostic[]): QtiPackageSummary;
|
|
40
|
+
export declare function enforceDiagnosticLimit(diagnostics: QtiDiagnostic[], maxDiagnostics: number): void;
|
|
41
|
+
//# sourceMappingURL=qti-package-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-plan.d.ts","sourceRoot":"","sources":["../src/qti-package-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAmB1D,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EACV,6BAA6B,EAC7B,mBAAmB,EACnB,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,yEAAyE;AACzE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,EAAE,OAAO,GAAG,SAAS,CAAC,GAAG;IACjF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,yFAAyF;AACzF,wBAAgB,sBAAsB,CACpC,aAAa,EAAE;IAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAC7C,WAAW,EAAE,cAAc,GAAG,SAAS,EACvC,WAAW,EAAE,aAAa,EAAE;;;;;;;EAoD7B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,iBAAiB,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC3D,QAAQ,CAAC,qBAAqB,EAAE,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACzE,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IACvC,QAAQ,CAAC,cAAc,EAAE,6BAA6B,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,UAAU,EAAE,SAAS,IAAI,CAChC,cAAc,EACd,MAAM,GAAG,4BAA4B,GAAG,YAAY,CACrD,EAAE,CAAC;IACJ,QAAQ,CAAC,UAAU,EAAE,SAAS,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,EAAE,CAAC;IAC9D,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,aAAa,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IACvD,QAAQ,CAAC,WAAW,EAAE,aAAa,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,iBAAiB,CA0BtF;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,iBAAiB,CAapF;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,aAAa,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CASjG"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { collectPackageAssets } from "./qti-package-assets.js";
|
|
2
|
+
import { QTI_PACKAGE_MANIFEST_PATH } from "./qti-package-manifest.js";
|
|
3
|
+
import { packageTitle, parseStandardAlignments, primaryTimingFromScan, uniqueStandards, } from "./qti-package-metadata.js";
|
|
4
|
+
import { pushPackageDiagnostic } from "./qti-package-paths.js";
|
|
5
|
+
import { detectPackageShape, diagnoseManifestDependencyReferences, diagnosePrimaryResourceHrefs, indexManifestResources, isQtiAssessmentTestResource, isQtiItemResource, parseManifestResources, } from "./qti-package-manifest.js";
|
|
6
|
+
import { pushXmlDiagnostics } from "./qti-package-xml.js";
|
|
7
|
+
import { QTI_PACKAGE_MANIFEST_NAMESPACE } from "./qti-namespaces.js";
|
|
8
|
+
/** Inspect manifest semantics against an entry inventory without reading item bodies. */
|
|
9
|
+
export function inspectPackageManifest(entriesByPath, manifestXml, diagnostics) {
|
|
10
|
+
if (!manifestXml) {
|
|
11
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.missing", "error", "QTI package does not contain imsmanifest.xml.", QTI_PACKAGE_MANIFEST_PATH);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
pushXmlDiagnostics(manifestXml, diagnostics);
|
|
15
|
+
}
|
|
16
|
+
const manifestRoot = manifestXml?.root?.localName === "manifest" &&
|
|
17
|
+
manifestXml.root.uri === QTI_PACKAGE_MANIFEST_NAMESPACE
|
|
18
|
+
? manifestXml.root
|
|
19
|
+
: undefined;
|
|
20
|
+
if (manifestXml?.root && !manifestRoot) {
|
|
21
|
+
pushPackageDiagnostic(diagnostics, "package.manifest.root", "error", manifestXml.root.localName === "manifest"
|
|
22
|
+
? `Expected imsmanifest.xml manifest in namespace ${QTI_PACKAGE_MANIFEST_NAMESPACE}, found ${manifestXml.root.uri ?? "(none)"}.`
|
|
23
|
+
: `Expected imsmanifest.xml root manifest, found ${manifestXml.root.localName}.`, QTI_PACKAGE_MANIFEST_PATH);
|
|
24
|
+
}
|
|
25
|
+
const manifestResources = manifestRoot
|
|
26
|
+
? parseManifestResources(manifestRoot, entriesByPath, diagnostics)
|
|
27
|
+
: [];
|
|
28
|
+
const resourcesByIdentifier = indexManifestResources(manifestResources, diagnostics);
|
|
29
|
+
diagnoseManifestDependencyReferences(manifestResources, resourcesByIdentifier, diagnostics);
|
|
30
|
+
const itemResources = manifestResources.filter((resource) => isQtiItemResource(resource.type));
|
|
31
|
+
const assessmentTestResources = manifestResources.filter((resource) => isQtiAssessmentTestResource(resource.type));
|
|
32
|
+
diagnosePrimaryResourceHrefs([...itemResources, ...assessmentTestResources], diagnostics);
|
|
33
|
+
const packageShape = detectPackageShape(itemResources, assessmentTestResources, diagnostics);
|
|
34
|
+
return {
|
|
35
|
+
manifestRoot,
|
|
36
|
+
manifestResources,
|
|
37
|
+
resourcesByIdentifier,
|
|
38
|
+
itemResources,
|
|
39
|
+
assessmentTestResources,
|
|
40
|
+
packageShape,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Build canonical package metadata shared by sync and incremental parsers. */
|
|
44
|
+
export function buildPackageSummary(input) {
|
|
45
|
+
const assets = collectPackageAssets(input.resourcesByIdentifier, input.assessmentTest, input.assetItems, input.entriesByPath, input.diagnostics);
|
|
46
|
+
return {
|
|
47
|
+
ok: input.diagnostics.every((diagnostic) => diagnostic.severity !== "error"),
|
|
48
|
+
title: packageTitle(input.manifestRoot, input.assessmentTest, input.titleItems),
|
|
49
|
+
packageShape: input.packageShape,
|
|
50
|
+
manifestResources: input.manifestResources,
|
|
51
|
+
assessmentTest: input.assessmentTest,
|
|
52
|
+
assets,
|
|
53
|
+
standards: uniqueStandards([
|
|
54
|
+
...(input.manifestRoot
|
|
55
|
+
? parseStandardAlignments(input.manifestRoot, QTI_PACKAGE_MANIFEST_PATH)
|
|
56
|
+
: []),
|
|
57
|
+
...(input.assessmentTest?.standards ?? []),
|
|
58
|
+
...input.itemStandards,
|
|
59
|
+
]),
|
|
60
|
+
timing: primaryTimingFromScan(input.assessmentTest, input.timedItemCount, input.soleItemTiming),
|
|
61
|
+
diagnostics: input.diagnostics,
|
|
62
|
+
itemCount: input.itemCount,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function failedPackageSummary(diagnostics) {
|
|
66
|
+
return {
|
|
67
|
+
ok: false,
|
|
68
|
+
title: "",
|
|
69
|
+
packageShape: "unknown",
|
|
70
|
+
manifestResources: [],
|
|
71
|
+
assessmentTest: undefined,
|
|
72
|
+
assets: [],
|
|
73
|
+
standards: [],
|
|
74
|
+
timing: undefined,
|
|
75
|
+
itemCount: 0,
|
|
76
|
+
diagnostics,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function enforceDiagnosticLimit(diagnostics, maxDiagnostics) {
|
|
80
|
+
if (diagnostics.length < maxDiagnostics)
|
|
81
|
+
return;
|
|
82
|
+
diagnostics.length = maxDiagnostics;
|
|
83
|
+
pushPackageDiagnostic(diagnostics, "package.diagnostics.limit", "error", "Package processing stopped at the diagnostic limit.");
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=qti-package-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-plan.js","sourceRoot":"","sources":["../src/qti-package-plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type QtiPackageSummary } from "./qti-package-plan.js";
|
|
2
|
+
import type { QtiPackageItem } from "./qti-package-types.js";
|
|
3
|
+
/** An immutable entry inventory and host-owned, bounded reads of decoded entry bytes. */
|
|
4
|
+
export interface QtiPackageSource {
|
|
5
|
+
readonly entries: readonly {
|
|
6
|
+
readonly path: string;
|
|
7
|
+
readonly size: number;
|
|
8
|
+
}[];
|
|
9
|
+
/** Enforce maxBytes during extraction, before allocating an oversized body. */
|
|
10
|
+
readonly readEntry: (path: string, maxBytes: number) => Promise<Uint8Array>;
|
|
11
|
+
}
|
|
12
|
+
/** Explicit resource budgets for an incremental package read. */
|
|
13
|
+
export interface QtiPackageStreamLimits {
|
|
14
|
+
readonly maxEntries: number;
|
|
15
|
+
readonly maxEntryBytes: number;
|
|
16
|
+
readonly maxTotalBytes: number;
|
|
17
|
+
readonly maxDiagnostics: number;
|
|
18
|
+
}
|
|
19
|
+
/** Package metadata without extracted bodies or retained item models. */
|
|
20
|
+
export type QtiPackageStreamSummary = QtiPackageSummary;
|
|
21
|
+
/** Items are provisional until the terminal summary reports ok; hosts must stage them. */
|
|
22
|
+
export type QtiPackageStreamEvent = {
|
|
23
|
+
readonly kind: "item";
|
|
24
|
+
readonly index: number;
|
|
25
|
+
readonly item: QtiPackageItem;
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "summary";
|
|
28
|
+
readonly summary: QtiPackageStreamSummary;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Parse immutable package entries sequentially with canonical package semantics.
|
|
32
|
+
*
|
|
33
|
+
* The caller owns ZIP/object storage and must not collect item events when bounded
|
|
34
|
+
* memory is required. Assets are described in the terminal summary, never loaded.
|
|
35
|
+
* Breaking iteration stops subsequent reads. Read failures become safe diagnostics.
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseQtiPackageStream(source: QtiPackageSource, limits: QtiPackageStreamLimits): AsyncGenerator<QtiPackageStreamEvent>;
|
|
38
|
+
//# sourceMappingURL=qti-package-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-stream.d.ts","sourceRoot":"","sources":["../src/qti-package-stream.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,yFAAyF;AACzF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9E,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7E;AAED,iEAAiE;AACjE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,yEAAyE;AACzE,MAAM,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAExD,0FAA0F;AAC1F,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;CAAE,GAChF;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAA;CAAE,CAAC;AAE5E;;;;;;GAMG;AACH,wBAAuB,qBAAqB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,sBAAsB,GAC7B,cAAc,CAAC,qBAAqB,CAAC,CA6FvC"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { itemReferencesForPackageShape, parseAssessmentTestPackageModel, parsePackageItem, } from "./qti-package-items.js";
|
|
2
|
+
import { QTI_PACKAGE_MANIFEST_PATH } from "./qti-package-manifest.js";
|
|
3
|
+
import { buildPackageSummary, enforceDiagnosticLimit, failedPackageSummary, inspectPackageManifest, } from "./qti-package-plan.js";
|
|
4
|
+
import { normalizePackagePath, pushPackageDiagnostic } from "./qti-package-paths.js";
|
|
5
|
+
import { parsePackageXml } from "./qti-package-xml.js";
|
|
6
|
+
/**
|
|
7
|
+
* Parse immutable package entries sequentially with canonical package semantics.
|
|
8
|
+
*
|
|
9
|
+
* The caller owns ZIP/object storage and must not collect item events when bounded
|
|
10
|
+
* memory is required. Assets are described in the terminal summary, never loaded.
|
|
11
|
+
* Breaking iteration stops subsequent reads. Read failures become safe diagnostics.
|
|
12
|
+
*/
|
|
13
|
+
export async function* parseQtiPackageStream(source, limits) {
|
|
14
|
+
const diagnostics = [];
|
|
15
|
+
const inventory = inspectInventory(source, limits, diagnostics);
|
|
16
|
+
if (!inventory) {
|
|
17
|
+
yield { kind: "summary", summary: failedPackageSummary(diagnostics) };
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const read = createEntryReader(source, inventory, limits, diagnostics);
|
|
21
|
+
const manifestEntry = await read(QTI_PACKAGE_MANIFEST_PATH);
|
|
22
|
+
const manifest = inspectPackageManifest(inventory, manifestEntry ? parsePackageXml(manifestEntry) : undefined, diagnostics);
|
|
23
|
+
// Only the primary assessment test supplies the package structure. The shared
|
|
24
|
+
// parser diagnoses additional test resources without loading their bodies.
|
|
25
|
+
const testEntries = new Map();
|
|
26
|
+
const testHref = manifest.assessmentTestResources[0]?.href;
|
|
27
|
+
if (testHref !== undefined) {
|
|
28
|
+
const entry = await read(testHref);
|
|
29
|
+
if (entry)
|
|
30
|
+
testEntries.set(testHref, entry);
|
|
31
|
+
}
|
|
32
|
+
const assessmentTest = parseAssessmentTestPackageModel(manifest.packageShape, manifest.assessmentTestResources, testEntries, new Map(), diagnostics);
|
|
33
|
+
const references = itemReferencesForPackageShape(manifest.packageShape, manifest.itemResources, assessmentTest, diagnostics);
|
|
34
|
+
const assetItems = [];
|
|
35
|
+
const itemStandards = [];
|
|
36
|
+
const titleItems = [];
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
let itemCount = 0;
|
|
39
|
+
let timedItemCount = 0;
|
|
40
|
+
let soleItemTiming;
|
|
41
|
+
for (const reference of references) {
|
|
42
|
+
if (diagnostics.length >= limits.maxDiagnostics)
|
|
43
|
+
break;
|
|
44
|
+
if (seen.has(reference.href)) {
|
|
45
|
+
pushPackageDiagnostic(diagnostics, "package.item.reference.duplicate", "warning", `Package item ${reference.href} is referenced more than once.`, reference.href);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
seen.add(reference.href);
|
|
49
|
+
const entry = await read(reference.href);
|
|
50
|
+
if (!entry)
|
|
51
|
+
continue;
|
|
52
|
+
const item = parsePackageItem(reference, entry, undefined, diagnostics);
|
|
53
|
+
if (item.title !== undefined && titleItems.length === 0) {
|
|
54
|
+
titleItems.push({ title: item.title });
|
|
55
|
+
}
|
|
56
|
+
if (item.timing !== undefined) {
|
|
57
|
+
timedItemCount += 1;
|
|
58
|
+
soleItemTiming = item.timing;
|
|
59
|
+
}
|
|
60
|
+
itemStandards.push(...item.standards);
|
|
61
|
+
assetItems.push({
|
|
62
|
+
href: item.href,
|
|
63
|
+
manifestResourceIdentifier: item.manifestResourceIdentifier,
|
|
64
|
+
assetHrefs: item.assetHrefs,
|
|
65
|
+
});
|
|
66
|
+
yield { kind: "item", index: itemCount++, item };
|
|
67
|
+
}
|
|
68
|
+
enforceDiagnosticLimit(diagnostics, limits.maxDiagnostics);
|
|
69
|
+
yield {
|
|
70
|
+
kind: "summary",
|
|
71
|
+
summary: buildPackageSummary({
|
|
72
|
+
manifestRoot: manifest.manifestRoot,
|
|
73
|
+
manifestResources: manifest.manifestResources,
|
|
74
|
+
resourcesByIdentifier: manifest.resourcesByIdentifier,
|
|
75
|
+
packageShape: manifest.packageShape,
|
|
76
|
+
assessmentTest,
|
|
77
|
+
assetItems,
|
|
78
|
+
titleItems,
|
|
79
|
+
timedItemCount,
|
|
80
|
+
soleItemTiming,
|
|
81
|
+
itemStandards,
|
|
82
|
+
entriesByPath: inventory,
|
|
83
|
+
diagnostics,
|
|
84
|
+
itemCount,
|
|
85
|
+
}),
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function createEntryReader(source, inventory, limits, diagnostics) {
|
|
89
|
+
return async (path) => {
|
|
90
|
+
const size = inventory.get(path);
|
|
91
|
+
if (size === undefined)
|
|
92
|
+
return undefined;
|
|
93
|
+
try {
|
|
94
|
+
const bytes = await source.readEntry(path, limits.maxEntryBytes);
|
|
95
|
+
if (!(bytes instanceof Uint8Array) || bytes.byteLength !== size) {
|
|
96
|
+
pushPackageDiagnostic(diagnostics, "package.entry.size", "error", "Package entry size does not match its immutable inventory.", path);
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
return { path, bytes };
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
pushPackageDiagnostic(diagnostics, "package.entry.read", "error", "Package entry could not be read.", path);
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function inspectInventory(source, limits, diagnostics) {
|
|
108
|
+
if (!validStreamLimits(limits)) {
|
|
109
|
+
pushPackageDiagnostic(diagnostics, "package.limits.invalid", "error", "Package limits must be positive safe integers.");
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
if (source.entries.length > limits.maxEntries) {
|
|
113
|
+
pushPackageDiagnostic(diagnostics, "package.entries.limit", "error", "Package contains more entries than allowed.");
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
const inventory = new Map();
|
|
117
|
+
let total = 0;
|
|
118
|
+
for (const entry of source.entries) {
|
|
119
|
+
const path = normalizePackagePath(entry.path, "entry", diagnostics);
|
|
120
|
+
if (!path)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (path !== entry.path || inventory.has(path)) {
|
|
123
|
+
pushPackageDiagnostic(diagnostics, "package.entry.duplicate", "error", "Package inventory paths must be unique and canonical.", entry.path);
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
total += entry.size;
|
|
127
|
+
if (!Number.isSafeInteger(entry.size) ||
|
|
128
|
+
entry.size < 0 ||
|
|
129
|
+
entry.size > limits.maxEntryBytes ||
|
|
130
|
+
!Number.isSafeInteger(total) ||
|
|
131
|
+
total > limits.maxTotalBytes) {
|
|
132
|
+
pushPackageDiagnostic(diagnostics, "package.bytes.limit", "error", "Package entry or total size exceeds its configured budget.", path);
|
|
133
|
+
return undefined;
|
|
134
|
+
}
|
|
135
|
+
inventory.set(path, entry.size);
|
|
136
|
+
}
|
|
137
|
+
return inventory;
|
|
138
|
+
}
|
|
139
|
+
function validStreamLimits(limits) {
|
|
140
|
+
return (Number.isSafeInteger(limits.maxEntries) &&
|
|
141
|
+
limits.maxEntries > 0 &&
|
|
142
|
+
Number.isSafeInteger(limits.maxEntryBytes) &&
|
|
143
|
+
limits.maxEntryBytes > 0 &&
|
|
144
|
+
Number.isSafeInteger(limits.maxTotalBytes) &&
|
|
145
|
+
limits.maxTotalBytes > 0 &&
|
|
146
|
+
Number.isSafeInteger(limits.maxDiagnostics) &&
|
|
147
|
+
limits.maxDiagnostics > 0);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=qti-package-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qti-package-stream.js","sourceRoot":"","sources":["../src/qti-package-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,8 +11,10 @@ export interface PackageXmlFile {
|
|
|
11
11
|
export declare function parseXmlFiles(entriesByPath: ReadonlyMap<string, QtiPackageEntry>): Map<string, PackageXmlFile>;
|
|
12
12
|
export declare function parsePackageXml(entry: QtiPackageEntry): PackageXmlFile;
|
|
13
13
|
export declare function pushXmlDiagnostics(xmlFile: PackageXmlFile, diagnostics: QtiDiagnostic[]): void;
|
|
14
|
-
|
|
15
|
-
export declare function
|
|
14
|
+
/** Return direct package-XML children, optionally restricted by local name and namespace. */
|
|
15
|
+
export declare function childPackageElements(node: QtiPackageXmlNode, localName?: string, namespaceUri?: string): QtiPackageXmlNode[];
|
|
16
|
+
/** Return package-XML descendants, optionally restricted by local name and namespace. */
|
|
17
|
+
export declare function packageDescendants(node: QtiPackageXmlNode | undefined, localName?: string, namespaceUri?: string): QtiPackageXmlNode[];
|
|
16
18
|
export declare function resolvePackageHref(from: string, href: string, diagnostics: QtiDiagnostic[]): string | undefined;
|
|
17
19
|
export declare function stripHrefSuffix(href: string): string;
|
|
18
20
|
export declare function isPackageRelativeHref(href: string | undefined): href is string;
|
|
@@ -1 +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,
|
|
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,6FAA6F;AAC7F,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,iBAAiB,EACvB,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,CAMrB;AAED,yFAAyF;AACzF,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,iBAAiB,GAAG,SAAS,EACnC,SAAS,CAAC,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,GACpB,iBAAiB,EAAE,CAarB;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,CASf"}
|
package/dist/qti-package-xml.js
CHANGED
|
@@ -25,17 +25,22 @@ export function pushXmlDiagnostics(xmlFile, diagnostics) {
|
|
|
25
25
|
pushPackageDiagnostic(diagnostics, "xml.parse", "error", message, xmlFile.path);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
/** Return direct package-XML children, optionally restricted by local name and namespace. */
|
|
29
|
+
export function childPackageElements(node, localName, namespaceUri) {
|
|
30
|
+
return node.children.filter((child) => (!localName || child.localName === localName) &&
|
|
31
|
+
(namespaceUri === undefined || child.uri === namespaceUri));
|
|
30
32
|
}
|
|
31
|
-
|
|
33
|
+
/** Return package-XML descendants, optionally restricted by local name and namespace. */
|
|
34
|
+
export function packageDescendants(node, localName, namespaceUri) {
|
|
32
35
|
if (!node)
|
|
33
36
|
return [];
|
|
34
37
|
const found = [];
|
|
35
38
|
for (const child of node.children) {
|
|
36
|
-
if (!localName || child.localName === localName)
|
|
39
|
+
if ((!localName || child.localName === localName) &&
|
|
40
|
+
(namespaceUri === undefined || child.uri === namespaceUri)) {
|
|
37
41
|
found.push(child);
|
|
38
|
-
|
|
42
|
+
}
|
|
43
|
+
found.push(...packageDescendants(child, localName, namespaceUri));
|
|
39
44
|
}
|
|
40
45
|
return found;
|
|
41
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qti-package-xml.js","sourceRoot":"","sources":["../src/qti-package-xml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAA0B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,UAAU,EAAwB,MAAM,sBAAsB,CAAC;AAWxE,MAAM,UAAU,aAAa,CAC3B,aAAmD;IAEnD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACnD,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QACzD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG;QACH,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAuB,EAAE,WAA4B;IACtF,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,qBAAqB,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAuB,EACvB,SAAkB;
|
|
1
|
+
{"version":3,"file":"qti-package-xml.js","sourceRoot":"","sources":["../src/qti-package-xml.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,28 @@ export interface QtiPackageInflateContext {
|
|
|
5
5
|
readonly compressedSize: number;
|
|
6
6
|
readonly uncompressedSize: number;
|
|
7
7
|
readonly compressionMethod: number;
|
|
8
|
+
/** Maximum output bytes the inflater may materialize for this entry. */
|
|
9
|
+
readonly maxOutputLength: number;
|
|
8
10
|
}
|
|
9
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* Optional raw DEFLATE inflater for ZIP entries compressed with method 8.
|
|
13
|
+
* Implementations must enforce `context.maxOutputLength` while expanding input.
|
|
14
|
+
*/
|
|
10
15
|
export type QtiPackageInflateRaw = (bytes: Uint8Array, context: QtiPackageInflateContext) => Uint8Array;
|
|
16
|
+
/** Resource budgets applied before and after QTI package entry expansion. */
|
|
17
|
+
export interface QtiPackageResourceLimits {
|
|
18
|
+
readonly maxEntries: number;
|
|
19
|
+
readonly maxEntryUncompressedBytes: number;
|
|
20
|
+
readonly maxTotalUncompressedBytes: number;
|
|
21
|
+
readonly maxCompressionRatio: number;
|
|
22
|
+
}
|
|
23
|
+
/** Conservative default budgets for untrusted QTI package ZIP input. */
|
|
24
|
+
export declare const DEFAULT_QTI_PACKAGE_RESOURCE_LIMITS: QtiPackageResourceLimits;
|
|
11
25
|
/** Options for parsing a QTI ZIP package. */
|
|
12
26
|
export interface QtiPackageParseOptions {
|
|
13
27
|
readonly inflateRaw?: QtiPackageInflateRaw | undefined;
|
|
28
|
+
/** Overrides for the default package resource budgets. */
|
|
29
|
+
readonly limits?: Partial<QtiPackageResourceLimits> | undefined;
|
|
14
30
|
}
|
|
15
31
|
/** Decoded ZIP entry from a QTI package. */
|
|
16
32
|
export interface QtiPackageEntry {
|
|
@@ -1 +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;
|
|
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;IACnC,wEAAwE;IACxE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,CACjC,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,wBAAwB,KAC9B,UAAU,CAAC;AAEhB,6EAA6E;AAC7E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,yBAAyB,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,wEAAwE;AACxE,eAAO,MAAM,mCAAmC,EAAE,wBAKhD,CAAC;AAEH,6CAA6C;AAC7C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACvD,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC;CACjE;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"}
|