@longsightgroup/qti3-migrator 0.9.6 → 0.9.8
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 +54 -0
- package/dist/assets.d.ts +10 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +19 -0
- package/dist/assets.js.map +1 -0
- package/dist/diagnostics.d.ts +2 -1
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +7 -0
- package/dist/diagnostics.js.map +1 -1
- package/dist/identifiers.d.ts +3 -0
- package/dist/identifiers.d.ts.map +1 -0
- package/dist/identifiers.js +11 -0
- package/dist/identifiers.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -133
- package/dist/index.js.map +1 -1
- package/dist/item-finalize.d.ts +12 -0
- package/dist/item-finalize.d.ts.map +1 -0
- package/dist/item-finalize.js +93 -0
- package/dist/item-finalize.js.map +1 -0
- package/dist/item-hrefs.d.ts +2 -0
- package/dist/item-hrefs.d.ts.map +1 -0
- package/dist/item-hrefs.js +19 -0
- package/dist/item-hrefs.js.map +1 -0
- package/dist/migrate-items.d.ts +6 -0
- package/dist/migrate-items.d.ts.map +1 -0
- package/dist/migrate-items.js +31 -0
- package/dist/migrate-items.js.map +1 -0
- package/dist/package-result.d.ts +12 -0
- package/dist/package-result.d.ts.map +1 -0
- package/dist/package-result.js +109 -0
- package/dist/package-result.js.map +1 -0
- package/dist/paths.d.ts +4 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +16 -0
- package/dist/paths.js.map +1 -0
- package/dist/resource-migration.d.ts +4 -0
- package/dist/resource-migration.d.ts.map +1 -0
- package/dist/resource-migration.js +128 -0
- package/dist/resource-migration.js.map +1 -0
- package/dist/source.d.ts +5 -0
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +26 -6
- package/dist/source.js.map +1 -1
- package/dist/types.d.ts +43 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/assets.ts +23 -0
- package/src/diagnostics.ts +12 -0
- package/src/identifiers.ts +12 -0
- package/src/index.ts +45 -176
- package/src/item-finalize.ts +133 -0
- package/src/item-hrefs.ts +23 -0
- package/src/migrate-items.ts +39 -0
- package/src/package-result.ts +157 -0
- package/src/paths.ts +33 -0
- package/src/resource-migration.ts +197 -0
- package/src/source.ts +40 -6
- package/src/types.ts +53 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate-items.js","sourceRoot":"","sources":["../src/migrate-items.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAItE,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,IAAY,EACZ,YAAsC,EACtC,OAAoC;IAEpC,IAAI,YAAY,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACjE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,IAAI,QAAQ,KAAK,GAAG,CAAC,EAAE;YACnE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,IAAI,oBAAoB,CAAC,GAAG,CAAC;YAC/D,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC,CAAC,CAAC,CAAC;IACN,CAAC;IACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IACpE,OAAO;QACL;YACE,UAAU,EAAE,MAAM,CAAC,aAAa,EAAE,UAAU,IAAI,uBAAuB,CAAC,IAAI,CAAC;YAC7E,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,KAAK,IAAI,oBAAoB,CAAC,GAAG,CAAC;YAC/D,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,WAAW,EAAE,MAAM,CAAC,WAAW;SAChC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC;QACH,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { QtiMigrationDiagnostic, QtiMigrationResourceEntry, QtiMigrationResult, QtiPackageMigrationResult } from "./types.js";
|
|
2
|
+
export type MigrationPackageEntriesResult = {
|
|
3
|
+
readonly ok: true;
|
|
4
|
+
readonly entries: readonly QtiMigrationResourceEntry[];
|
|
5
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
6
|
+
} | {
|
|
7
|
+
readonly ok: false;
|
|
8
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
9
|
+
};
|
|
10
|
+
export declare function migrationResultToPackage(result: QtiMigrationResult): QtiPackageMigrationResult;
|
|
11
|
+
export declare function migrationResultToPackageEntries(result: QtiMigrationResult): MigrationPackageEntriesResult;
|
|
12
|
+
//# sourceMappingURL=package-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-result.d.ts","sourceRoot":"","sources":["../src/package-result.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,6BAA6B,GACrC;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,OAAO,EAAE,SAAS,yBAAyB,EAAE,CAAC;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzD,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAA;CAAE,CAAC;AAEpF,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,yBAAyB,CAuB9F;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,kBAAkB,GACzB,6BAA6B,CA+B/B"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { detectPackageMediaType } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { writeQti3PackageFilesResult } from "@longsightgroup/qti3-writer";
|
|
3
|
+
import { diagnostic, hasErrors } from "./diagnostics.js";
|
|
4
|
+
import { migrationPackageIdentifier } from "./identifiers.js";
|
|
5
|
+
export function migrationResultToPackage(result) {
|
|
6
|
+
const itemDiagnostics = result.items.flatMap((item) => item.diagnostics);
|
|
7
|
+
const assetDiagnostics = [];
|
|
8
|
+
const assetsByPath = migrationAssetsByPath(result.assets, assetDiagnostics);
|
|
9
|
+
const itemBuildDiagnostics = [];
|
|
10
|
+
const items = buildPackageItems(result, assetsByPath, itemBuildDiagnostics);
|
|
11
|
+
const diagnostics = [
|
|
12
|
+
...result.diagnostics,
|
|
13
|
+
...itemDiagnostics,
|
|
14
|
+
...assetDiagnostics,
|
|
15
|
+
...itemBuildDiagnostics,
|
|
16
|
+
];
|
|
17
|
+
if (hasErrors(diagnostics))
|
|
18
|
+
return { ok: false, diagnostics };
|
|
19
|
+
return {
|
|
20
|
+
ok: true,
|
|
21
|
+
package: {
|
|
22
|
+
identifier: migrationPackageIdentifier(result.title),
|
|
23
|
+
title: result.title,
|
|
24
|
+
items,
|
|
25
|
+
},
|
|
26
|
+
diagnostics,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function migrationResultToPackageEntries(result) {
|
|
30
|
+
const packageResult = migrationResultToPackage(result);
|
|
31
|
+
if (!packageResult.ok) {
|
|
32
|
+
return { ok: false, diagnostics: packageResult.diagnostics };
|
|
33
|
+
}
|
|
34
|
+
const files = writeQti3PackageFilesResult(packageResult.package);
|
|
35
|
+
if (!files.ok) {
|
|
36
|
+
return {
|
|
37
|
+
ok: false,
|
|
38
|
+
diagnostics: [
|
|
39
|
+
...packageResult.diagnostics,
|
|
40
|
+
{
|
|
41
|
+
code: "writer_diagnostics",
|
|
42
|
+
severity: "error",
|
|
43
|
+
message: "QTI 3 writer rejected migrated package files.",
|
|
44
|
+
writerDiagnostics: files.diagnostics,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
ok: true,
|
|
51
|
+
entries: files.files.map((file) => ({
|
|
52
|
+
path: file.path,
|
|
53
|
+
data: file.data,
|
|
54
|
+
mediaType: detectPackageMediaType(file.path),
|
|
55
|
+
})),
|
|
56
|
+
diagnostics: packageResult.diagnostics,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function buildPackageItems(result, assetsByPath, diagnostics) {
|
|
60
|
+
const items = [];
|
|
61
|
+
for (const item of result.items) {
|
|
62
|
+
if (!item.xml) {
|
|
63
|
+
diagnostics.push(diagnostic("package_item_xml_missing", "error", "Migrated item has no QTI 3 XML.", {
|
|
64
|
+
path: item.href,
|
|
65
|
+
sourceFormat: result.sourceFormat,
|
|
66
|
+
}));
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
items.push({
|
|
70
|
+
kind: "xml",
|
|
71
|
+
path: item.href,
|
|
72
|
+
identifier: item.identifier,
|
|
73
|
+
xml: item.xml,
|
|
74
|
+
assets: packageItemAssets(item.assetHrefs ?? [], assetsByPath, diagnostics),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return items;
|
|
78
|
+
}
|
|
79
|
+
function migrationAssetsByPath(assets, diagnostics) {
|
|
80
|
+
const assetsByPath = new Map();
|
|
81
|
+
for (const asset of assets) {
|
|
82
|
+
if (!asset.data) {
|
|
83
|
+
diagnostics.push(diagnostic("package_asset_data_missing", "error", "Migrated package asset has no data.", {
|
|
84
|
+
path: asset.path,
|
|
85
|
+
}));
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
assetsByPath.set(asset.path, {
|
|
89
|
+
path: asset.path,
|
|
90
|
+
data: asset.data,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return assetsByPath;
|
|
94
|
+
}
|
|
95
|
+
function packageItemAssets(hrefs, assetsByPath, diagnostics) {
|
|
96
|
+
const assets = [];
|
|
97
|
+
for (const href of hrefs) {
|
|
98
|
+
const asset = assetsByPath.get(href);
|
|
99
|
+
if (!asset) {
|
|
100
|
+
diagnostics.push(diagnostic("package_asset_missing", "error", "Migrated package item references missing asset.", {
|
|
101
|
+
path: href,
|
|
102
|
+
}));
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
assets.push(asset);
|
|
106
|
+
}
|
|
107
|
+
return assets;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=package-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-result.js","sourceRoot":"","sources":["../src/package-result.ts"],"names":[],"mappings":"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"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { QtiMigrationDiagnostic } from "./types.js";
|
|
2
|
+
/** Normalize a host resource path and map core package-path diagnostics into migrator codes. */
|
|
3
|
+
export declare function normalizeMigrationResourcePath(path: string, context: string, diagnostics: QtiMigrationDiagnostic[]): string | undefined;
|
|
4
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD,gGAAgG;AAChG,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,sBAAsB,EAAE,GACpC,MAAM,GAAG,SAAS,CAsBpB"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { normalizePackagePath } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { diagnostic } from "./diagnostics.js";
|
|
3
|
+
/** Normalize a host resource path and map core package-path diagnostics into migrator codes. */
|
|
4
|
+
export function normalizeMigrationResourcePath(path, context, diagnostics) {
|
|
5
|
+
const coreDiagnostics = [];
|
|
6
|
+
const normalized = normalizePackagePath(path.replaceAll("\\", "/"), context, coreDiagnostics);
|
|
7
|
+
diagnostics.push(...coreDiagnostics.map((entry) => diagnostic(`resource_${entry.code}`, entry.severity === "error" ? "error" : "warning", entry.message, {
|
|
8
|
+
path: entry.path,
|
|
9
|
+
})));
|
|
10
|
+
if (normalized === "") {
|
|
11
|
+
diagnostics.push(diagnostic("resource_path_empty", "error", `${context} must not be empty.`, { path }));
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return normalized;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,gGAAgG;AAChG,MAAM,UAAU,8BAA8B,CAC5C,IAAY,EACZ,OAAe,EACf,WAAqC;IAErC,MAAM,eAAe,GAAoB,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC9F,WAAW,CAAC,IAAI,CACd,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/B,UAAU,CACR,YAAY,KAAK,CAAC,IAAI,EAAE,EACxB,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAChD,KAAK,CAAC,OAAO,EACb;QACE,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CACF,CACF,CACF,CAAC;IACF,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,CACd,UAAU,CAAC,qBAAqB,EAAE,OAAO,EAAE,GAAG,OAAO,qBAAqB,EAAE,EAAE,IAAI,EAAE,CAAC,CACtF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { QtiMigrationOptions, QtiMigrationResourceInput, QtiResourceMigrationResult } from "./types.js";
|
|
2
|
+
/** Migrate one QTI resource and its local file closure into launchable QTI 3 package entries. */
|
|
3
|
+
export declare function migrateQtiResourceToQti3(input: QtiMigrationResourceInput, options?: QtiMigrationOptions): Promise<QtiResourceMigrationResult>;
|
|
4
|
+
//# sourceMappingURL=resource-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-migration.d.ts","sourceRoot":"","sources":["../src/resource-migration.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAEV,mBAAmB,EAEnB,yBAAyB,EAGzB,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAQpB,iGAAiG;AACjG,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,yBAAyB,EAChC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,0BAA0B,CAAC,CA0GrC"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { decodeUtf8 } from "@longsightgroup/qti3-core";
|
|
2
|
+
import { migrationPackageAssets, resourceClosureAssetHrefs } from "./assets.js";
|
|
3
|
+
import { aggregateMigrationDiagnostics, diagnostic } from "./diagnostics.js";
|
|
4
|
+
import { finalizeItemResults } from "./item-finalize.js";
|
|
5
|
+
import { migrateItemXml } from "./migrate-items.js";
|
|
6
|
+
import { normalizeMigrationResourcePath } from "./paths.js";
|
|
7
|
+
import { migrationResultToPackageEntries } from "./package-result.js";
|
|
8
|
+
import { resolveOptions } from "./options.js";
|
|
9
|
+
import { detectMigrationSource, migrationEntriesFromFileMap, } from "./source.js";
|
|
10
|
+
/** Migrate one QTI resource and its local file closure into launchable QTI 3 package entries. */
|
|
11
|
+
export async function migrateQtiResourceToQti3(input, options = {}) {
|
|
12
|
+
const resolvedOptions = resolveOptions(options);
|
|
13
|
+
const normalized = normalizeResourceInput(input);
|
|
14
|
+
if (normalized.diagnostics.length) {
|
|
15
|
+
return failedResourceMigrationResult({
|
|
16
|
+
title: input.title ?? input.sourcePath,
|
|
17
|
+
diagnostics: normalized.diagnostics,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
const sourceEntry = normalized.entries.find((entry) => entry.path === normalized.sourcePath);
|
|
21
|
+
if (!sourceEntry) {
|
|
22
|
+
return failedResourceMigrationResult({
|
|
23
|
+
title: input.title ?? normalized.sourcePath,
|
|
24
|
+
diagnostics: [
|
|
25
|
+
diagnostic("resource_source_missing", "error", `QTI resource source path ${normalized.sourcePath} was not found in the resource files.`, { path: normalized.sourcePath }),
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const sourceXml = decodeUtf8(sourceEntry.bytes);
|
|
30
|
+
const source = {
|
|
31
|
+
filename: normalized.sourcePath,
|
|
32
|
+
isPackage: false,
|
|
33
|
+
entries: [],
|
|
34
|
+
xml: sourceXml,
|
|
35
|
+
};
|
|
36
|
+
const detection = detectMigrationSource(source);
|
|
37
|
+
if (!detection.supported || !detection.sourceFormat) {
|
|
38
|
+
return failedResourceMigrationResult({
|
|
39
|
+
title: input.title ?? normalized.sourcePath,
|
|
40
|
+
sourceFormat: detection.sourceFormat,
|
|
41
|
+
diagnostics: [
|
|
42
|
+
diagnostic("source_unsupported", "error", `Unsupported QTI migration source: ${detection.reason}.`, { path: normalized.sourcePath, sourceFormat: detection.sourceFormat }),
|
|
43
|
+
],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const assetHrefs = resourceClosureAssetHrefs(normalized.entries);
|
|
47
|
+
const items = finalizeItemResults(migrateItemXml(sourceXml, normalized.sourcePath, detection.sourceFormat, resolvedOptions), normalized.sourcePath, resolvedOptions).map((item) => ({ ...item, assetHrefs }));
|
|
48
|
+
const migration = {
|
|
49
|
+
title: input.title ?? items[0]?.title ?? normalized.sourcePath,
|
|
50
|
+
sourceFormat: detection.sourceFormat,
|
|
51
|
+
parts: [partFromItems("PART_1", input.title ?? "Imported Resource", items)],
|
|
52
|
+
items,
|
|
53
|
+
assets: migrationPackageAssets(normalized.entries),
|
|
54
|
+
diagnostics: [],
|
|
55
|
+
};
|
|
56
|
+
const packageEntries = migrationResultToPackageEntries(migration);
|
|
57
|
+
if (!packageEntries.ok) {
|
|
58
|
+
return failedResourceMigrationResult({
|
|
59
|
+
title: migration.title,
|
|
60
|
+
sourceFormat: detection.sourceFormat,
|
|
61
|
+
migration,
|
|
62
|
+
diagnostics: aggregateMigrationDiagnostics(migration, packageEntries.diagnostics),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const diagnostics = aggregateMigrationDiagnostics(migration, packageEntries.diagnostics);
|
|
66
|
+
const itemHrefs = items.map((item) => item.href);
|
|
67
|
+
const launchHref = itemHrefs[0];
|
|
68
|
+
if (!launchHref) {
|
|
69
|
+
return failedResourceMigrationResult({
|
|
70
|
+
title: migration.title,
|
|
71
|
+
sourceFormat: detection.sourceFormat,
|
|
72
|
+
migration,
|
|
73
|
+
diagnostics: [
|
|
74
|
+
...diagnostics,
|
|
75
|
+
diagnostic("resource_launch_href_missing", "error", "Migrated resource did not produce a launchable item path.", { path: normalized.sourcePath, sourceFormat: detection.sourceFormat }),
|
|
76
|
+
],
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
ok: true,
|
|
81
|
+
title: migration.title,
|
|
82
|
+
status: diagnostics.some((entry) => entry.severity === "warning")
|
|
83
|
+
? "converted_with_warnings"
|
|
84
|
+
: "converted",
|
|
85
|
+
sourceFormat: detection.sourceFormat,
|
|
86
|
+
launchHref,
|
|
87
|
+
itemHrefs,
|
|
88
|
+
entries: packageEntries.entries,
|
|
89
|
+
diagnostics,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function normalizeResourceInput(input) {
|
|
93
|
+
const diagnostics = [];
|
|
94
|
+
const sourcePath = normalizeMigrationResourcePath(input.sourcePath, "resource source path", diagnostics);
|
|
95
|
+
const { entries, diagnostics: entryDiagnostics } = migrationEntriesFromFileMap(input.files, (path) => normalizeMigrationResourcePath(path, "resource file path", diagnostics));
|
|
96
|
+
return {
|
|
97
|
+
sourcePath: sourcePath ?? input.sourcePath.replaceAll("\\", "/"),
|
|
98
|
+
entries,
|
|
99
|
+
diagnostics: [...diagnostics, ...entryDiagnostics],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
function partFromItems(identifier, title, items) {
|
|
103
|
+
return { identifier, title, itemHrefs: items.map((item) => item.href) };
|
|
104
|
+
}
|
|
105
|
+
function failedResourceMigrationResult(options) {
|
|
106
|
+
const migration = options.migration ??
|
|
107
|
+
{
|
|
108
|
+
title: options.title,
|
|
109
|
+
sourceFormat: options.sourceFormat,
|
|
110
|
+
parts: [],
|
|
111
|
+
items: [],
|
|
112
|
+
assets: [],
|
|
113
|
+
diagnostics: options.diagnostics,
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
title: migration.title,
|
|
118
|
+
status: "failed",
|
|
119
|
+
sourceFormat: options.sourceFormat ?? migration.sourceFormat,
|
|
120
|
+
itemHrefs: migration.items.map((item) => item.href),
|
|
121
|
+
entries: [],
|
|
122
|
+
diagnostics: options.diagnostics.length
|
|
123
|
+
? options.diagnostics
|
|
124
|
+
: aggregateMigrationDiagnostics(migration),
|
|
125
|
+
migration,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=resource-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-migration.js","sourceRoot":"","sources":["../src/resource-migration.ts"],"names":[],"mappings":"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"}
|
package/dist/source.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export interface MigrationSource {
|
|
|
10
10
|
readonly entries: readonly MigrationEntry[];
|
|
11
11
|
readonly xml?: string | undefined;
|
|
12
12
|
}
|
|
13
|
+
export declare function buildMigrationEntry(path: string, bytes: Uint8Array): MigrationEntry;
|
|
14
|
+
export declare function migrationEntriesFromFileMap(files: Readonly<Record<string, Uint8Array>>, normalizePath: (path: string) => string | undefined): {
|
|
15
|
+
readonly entries: readonly MigrationEntry[];
|
|
16
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
17
|
+
};
|
|
13
18
|
export declare function readMigrationSource(input: QtiMigrationSourceInput): MigrationSource;
|
|
14
19
|
export declare function detectQtiMigrationSource(input: QtiMigrationSourceInput): QtiMigrationDetectionResult;
|
|
15
20
|
export declare function detectMigrationSource(source: MigrationSource): QtiMigrationDetectionResult;
|
package/dist/source.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,cAAc,CAMnF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAC3C,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAClD;IACD,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzD,CAsBA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,GAAG,eAAe,CAoBnF;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,uBAAuB,GAC7B,2BAA2B,CAY7B;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,2BAA2B,CAiB1F;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACtD,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,SAAS,sBAAsB,EAAE,CAAC;CACzD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAuC/D"}
|
package/dist/source.js
CHANGED
|
@@ -2,6 +2,30 @@ import { unzipSync } from "fflate";
|
|
|
2
2
|
import { decodeUtf8 } from "@longsightgroup/qti3-core";
|
|
3
3
|
import { diagnostic } from "./diagnostics.js";
|
|
4
4
|
import { attr, findAllDescendantsByLocalName, localName, parseXml, textOf } from "./xml.js";
|
|
5
|
+
export function buildMigrationEntry(path, bytes) {
|
|
6
|
+
return {
|
|
7
|
+
path,
|
|
8
|
+
bytes,
|
|
9
|
+
text: isMigrationTextPath(path) ? decodeUtf8(bytes) : undefined,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function migrationEntriesFromFileMap(files, normalizePath) {
|
|
13
|
+
const diagnostics = [];
|
|
14
|
+
const entries = [];
|
|
15
|
+
const seenPaths = new Set();
|
|
16
|
+
for (const [path, bytes] of Object.entries(files)) {
|
|
17
|
+
const normalizedPath = normalizePath(path);
|
|
18
|
+
if (!normalizedPath)
|
|
19
|
+
continue;
|
|
20
|
+
if (seenPaths.has(normalizedPath)) {
|
|
21
|
+
diagnostics.push(diagnostic("resource_file_duplicate", "error", `Resource file path ${normalizedPath} is duplicated after normalization.`, { path: normalizedPath }));
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
seenPaths.add(normalizedPath);
|
|
25
|
+
entries.push(buildMigrationEntry(normalizedPath, bytes));
|
|
26
|
+
}
|
|
27
|
+
return { entries, diagnostics };
|
|
28
|
+
}
|
|
5
29
|
export function readMigrationSource(input) {
|
|
6
30
|
if (input.xml !== undefined) {
|
|
7
31
|
return { filename: input.filename, isPackage: false, entries: [], xml: input.xml };
|
|
@@ -13,11 +37,7 @@ export function readMigrationSource(input) {
|
|
|
13
37
|
const unzipped = unzipSync(input.bytes);
|
|
14
38
|
const entries = Object.entries(unzipped)
|
|
15
39
|
.filter(([path]) => !path.endsWith("/"))
|
|
16
|
-
.map(([path, bytes]) => (
|
|
17
|
-
path: path.replaceAll("\\", "/"),
|
|
18
|
-
bytes,
|
|
19
|
-
text: isTextPath(path) ? decodeUtf8(bytes) : undefined,
|
|
20
|
-
}));
|
|
40
|
+
.map(([path, bytes]) => buildMigrationEntry(path.replaceAll("\\", "/"), bytes));
|
|
21
41
|
return { filename: input.filename, isPackage: true, entries };
|
|
22
42
|
}
|
|
23
43
|
return {
|
|
@@ -191,7 +211,7 @@ function isLegacyTestResource(type) {
|
|
|
191
211
|
function isZip(bytes) {
|
|
192
212
|
return bytes.length >= 4 && bytes[0] === 0x50 && bytes[1] === 0x4b;
|
|
193
213
|
}
|
|
194
|
-
function
|
|
214
|
+
function isMigrationTextPath(path) {
|
|
195
215
|
return /\.(xml|html?|txt|json|css|js)$/i.test(path);
|
|
196
216
|
}
|
|
197
217
|
//# sourceMappingURL=source.js.map
|
package/dist/source.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9C,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAe5F,MAAM,UAAU,mBAAmB,CAAC,KAA8B;IAChE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAM9C,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAe5F,MAAM,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAiB;IACjE,OAAO;QACL,IAAI;QACJ,KAAK;QACL,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,KAA2C,EAC3C,aAAmD;IAKnD,MAAM,WAAW,GAA6B,EAAE,CAAC;IACjD,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc;YAAE,SAAS;QAC9B,IAAI,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CACd,UAAU,CACR,yBAAyB,EACzB,OAAO,EACP,sBAAsB,cAAc,qCAAqC,EACzE,EAAE,IAAI,EAAE,cAAc,EAAE,CACzB,CACF,CAAC;YACF,SAAS;QACX,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAA8B;IAChE,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACrF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;aACrC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aACvC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAChE,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK;QAChB,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,KAA8B;IAE9B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,CAAC;YACb,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB;YACrE,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAuB;IAC3D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,iBAAiB,CAAC,CAAC;QAChG,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YACpB,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,0BAA0B;gBAClC,SAAS,EAAE,IAAI;aAChB,CAAC;QACJ,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACtF,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAiBD,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,WAAW,GAA6B,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC;IACjC,MAAM,KAAK,GACT,MAAM,CAAC,6BAA6B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACxB,sBAAsB,CAAC;IACzB,MAAM,aAAa,GAAG,6BAA6B,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,6BAA6B,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aACjC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,YAAY,KAAK,GAAG,CAAC,EAAE;YACnE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE;YAClC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzF,KAAK;SACN,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,SAAS;SACxB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACzD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,SAAS;SACxB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACzD,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;SAChC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAC3C,WAAW,CAAC,IAAI,CACd,UAAU,CACR,wBAAwB,EACxB,OAAO,EACP,6EAA6E,EAC7E,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAC5B,CACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7F,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO;YACL,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACxE,OAAO;YACL,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5E,OAAO;YACL,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QACxC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACjE,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG;QACtD,MAAM,EACJ,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,sBAAsB;QAC1F,SAAS,EAAE,IAAI;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,CAAC;IACjC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACnD,MAAM,aAAa,GAAG;QACpB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QACvB,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC;QAChC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;QAC5B,cAAc;KACf;SACE,IAAI,CAAC,GAAG,CAAC;SACT,WAAW,EAAE,CAAC;IACjB,IAAI,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QAClC,IAAI,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,YAAY,EAAE,OAAO;gBACrB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,sBAAsB;gBAC9B,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,CAAC;QACD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,sBAAsB;YAC9B,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,iBAAiB,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC1D,OAAO;YACL,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,OAAO;YACrB,UAAU,EAAE,IAAI;YAChB,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IACD,OAAO;QACL,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,oBAAoB,QAAQ,EAAE;QACtC,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,CACL,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACnC,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QACrC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAChC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,KAAK,CAAC,KAAiB;IAC9B,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AACrE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtD,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Qti3AuthoringItem, Qti3WriterDiagnostic } from "@longsightgroup/qti3-writer";
|
|
1
|
+
import type { Qti3AuthoringItem, Qti3PackageAuthoringInput, Qti3WriterDiagnostic } from "@longsightgroup/qti3-writer";
|
|
2
2
|
export type QtiMigrationSourceFormat = "qti12" | "qti21" | "qti22";
|
|
3
3
|
export type QtiMigrationRepairPolicy = "none" | "safe";
|
|
4
4
|
export type QtiMigrationUnsupportedPolicy = "diagnostic" | "stub" | "skip";
|
|
@@ -8,6 +8,12 @@ export interface QtiMigrationSourceInput {
|
|
|
8
8
|
readonly xml?: string | undefined;
|
|
9
9
|
readonly mime?: string | undefined;
|
|
10
10
|
}
|
|
11
|
+
/** Local file closure for migrating one QTI resource from a larger host package. */
|
|
12
|
+
export interface QtiMigrationResourceInput {
|
|
13
|
+
readonly sourcePath: string;
|
|
14
|
+
readonly files: Readonly<Record<string, Uint8Array>>;
|
|
15
|
+
readonly title?: string | undefined;
|
|
16
|
+
}
|
|
11
17
|
export interface QtiMigrationOptions {
|
|
12
18
|
readonly repairPolicy?: QtiMigrationRepairPolicy | undefined;
|
|
13
19
|
readonly unsupportedPolicy?: QtiMigrationUnsupportedPolicy | undefined;
|
|
@@ -46,6 +52,7 @@ export interface QtiMigrationItemResult {
|
|
|
46
52
|
readonly identifier: string;
|
|
47
53
|
readonly title: string;
|
|
48
54
|
readonly href: string;
|
|
55
|
+
readonly assetHrefs?: readonly string[] | undefined;
|
|
49
56
|
readonly authoringItem?: Qti3AuthoringItem | undefined;
|
|
50
57
|
readonly xml?: string | undefined;
|
|
51
58
|
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
@@ -58,4 +65,39 @@ export interface QtiMigrationResult {
|
|
|
58
65
|
readonly assets: readonly QtiMigrationAsset[];
|
|
59
66
|
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
60
67
|
}
|
|
68
|
+
/** File emitted by resource-level migration for host storage or packaging. */
|
|
69
|
+
export interface QtiMigrationResourceEntry {
|
|
70
|
+
readonly path: string;
|
|
71
|
+
readonly data: Uint8Array | string;
|
|
72
|
+
readonly mediaType?: string | undefined;
|
|
73
|
+
}
|
|
74
|
+
export type QtiResourceMigrationStatus = "converted" | "converted_with_warnings" | "failed";
|
|
75
|
+
export type QtiPackageMigrationResult = {
|
|
76
|
+
readonly ok: true;
|
|
77
|
+
readonly package: Qti3PackageAuthoringInput;
|
|
78
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
79
|
+
} | {
|
|
80
|
+
readonly ok: false;
|
|
81
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
82
|
+
};
|
|
83
|
+
/** Result of migrating one host-package resource and its local file closure. */
|
|
84
|
+
export type QtiResourceMigrationResult = {
|
|
85
|
+
readonly ok: true;
|
|
86
|
+
readonly title: string;
|
|
87
|
+
readonly status: "converted" | "converted_with_warnings";
|
|
88
|
+
readonly sourceFormat: QtiMigrationSourceFormat;
|
|
89
|
+
readonly launchHref: string;
|
|
90
|
+
readonly itemHrefs: readonly string[];
|
|
91
|
+
readonly entries: readonly QtiMigrationResourceEntry[];
|
|
92
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
93
|
+
} | {
|
|
94
|
+
readonly ok: false;
|
|
95
|
+
readonly title: string;
|
|
96
|
+
readonly status: "failed";
|
|
97
|
+
readonly sourceFormat?: QtiMigrationSourceFormat | undefined;
|
|
98
|
+
readonly itemHrefs: readonly string[];
|
|
99
|
+
readonly entries: readonly QtiMigrationResourceEntry[];
|
|
100
|
+
readonly diagnostics: readonly QtiMigrationDiagnostic[];
|
|
101
|
+
readonly migration: QtiMigrationResult;
|
|
102
|
+
};
|
|
61
103
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@longsightgroup/qti3-migrator",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.8",
|
|
4
4
|
"description": "Framework-neutral QTI 1.2 and QTI 2.x to QTI 3 migration utilities.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"assessment",
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@xmldom/xmldom": "^0.8.11",
|
|
51
51
|
"fflate": "^0.8.2",
|
|
52
|
-
"@longsightgroup/qti3-
|
|
53
|
-
"@longsightgroup/qti3-
|
|
52
|
+
"@longsightgroup/qti3-core": "0.9.8",
|
|
53
|
+
"@longsightgroup/qti3-writer": "0.9.8"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {}
|
|
56
56
|
}
|
package/src/assets.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { detectPackageMediaType } from "@longsightgroup/qti3-core";
|
|
2
|
+
|
|
3
|
+
import type { MigrationEntry } from "./source.js";
|
|
4
|
+
import type { QtiMigrationAsset } from "./types.js";
|
|
5
|
+
|
|
6
|
+
export function migrationPackageAssets(entries: readonly MigrationEntry[]): QtiMigrationAsset[] {
|
|
7
|
+
return entries
|
|
8
|
+
.filter((entry) => !entry.path.toLowerCase().endsWith(".xml"))
|
|
9
|
+
.map((entry) => ({
|
|
10
|
+
path: entry.path,
|
|
11
|
+
data: entry.bytes,
|
|
12
|
+
mediaType: detectPackageMediaType(entry.path),
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Asset hrefs for resource-level migration. Every migrated item receives the full non-XML file
|
|
18
|
+
* closure so host-provided dependencies remain available regardless of which sibling item references
|
|
19
|
+
* them.
|
|
20
|
+
*/
|
|
21
|
+
export function resourceClosureAssetHrefs(entries: readonly MigrationEntry[]): readonly string[] {
|
|
22
|
+
return migrationPackageAssets(entries).map((asset) => asset.path);
|
|
23
|
+
}
|
package/src/diagnostics.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
QtiMigrationDiagnostic,
|
|
3
3
|
QtiMigrationDiagnosticSeverity,
|
|
4
|
+
QtiMigrationResult,
|
|
4
5
|
QtiMigrationSourceFormat,
|
|
5
6
|
} from "./types.js";
|
|
6
7
|
|
|
@@ -19,3 +20,14 @@ export function diagnostic(
|
|
|
19
20
|
export function hasErrors(diagnostics: readonly QtiMigrationDiagnostic[]): boolean {
|
|
20
21
|
return diagnostics.some((entry) => entry.severity === "error");
|
|
21
22
|
}
|
|
23
|
+
|
|
24
|
+
export function aggregateMigrationDiagnostics(
|
|
25
|
+
migration: QtiMigrationResult,
|
|
26
|
+
extraDiagnostics: readonly QtiMigrationDiagnostic[] = [],
|
|
27
|
+
): readonly QtiMigrationDiagnostic[] {
|
|
28
|
+
return [
|
|
29
|
+
...migration.diagnostics,
|
|
30
|
+
...migration.items.flatMap((item) => item.diagnostics),
|
|
31
|
+
...extraDiagnostics,
|
|
32
|
+
];
|
|
33
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function migrationPathIdentifier(path: string): string {
|
|
2
|
+
return sanitizeMigrationIdentifier(path, "ITEM", "ITEM");
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function migrationPackageIdentifier(title: string): string {
|
|
6
|
+
return sanitizeMigrationIdentifier(title, "PACKAGE", "PACKAGE");
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function sanitizeMigrationIdentifier(value: string, fallback: string, prefix: string): string {
|
|
10
|
+
const normalized = value.replace(/\.[^.]+$/, "").replace(/[^A-Za-z0-9_]/g, "_") || fallback;
|
|
11
|
+
return /^[A-Za-z_]/.test(normalized) ? normalized : `${prefix}_${normalized}`;
|
|
12
|
+
}
|