diff --git a/.changeset/thin-eggs-look.md b/.changeset/thin-eggs-look.md new file mode 100644 index 00000000..d8eafb43 --- /dev/null +++ b/.changeset/thin-eggs-look.md @@ -0,0 +1,7 @@ +--- +"hyperbook": minor +"@hyperbook/markdown": minor +"hyperbook-studio": minor +--- + +Add h5p element diff --git a/packages/hyperbook/build.ts b/packages/hyperbook/build.ts index 9dc123ce..6b5f784e 100644 --- a/packages/hyperbook/build.ts +++ b/packages/hyperbook/build.ts @@ -6,6 +6,7 @@ import { hyperproject, vfile, hyperbook } from "@hyperbook/fs"; import { runArchive } from "./archive"; import { makeDir } from "./helpers/make-dir"; import { rimraf } from "rimraf"; +import extractZip from "extract-zip"; import { Link, Hyperproject, @@ -22,7 +23,7 @@ export async function runBuildProject( project: Hyperproject, rootProject: Hyperproject, out?: string, - filter?: string + filter?: string, ): Promise { const name = hyperproject.getName(project); if (project.type === "book") { @@ -33,7 +34,7 @@ export async function runBuildProject( project.basePath, name, out, - filter + filter, ); } else { console.log(`${chalk.cyan(`[${name}]`)} Building Library.`); @@ -53,7 +54,7 @@ async function runBuild( basePath?: string, prefix?: string, out?: string, - filter?: string + filter?: string, ): Promise { console.log(`${chalk.blue(`[${prefix}]`)} Reading hyperbook.json.`); const hyperbookJson = await hyperbook.getJson(root); @@ -91,7 +92,7 @@ async function runBuild( rootOut = path.join(out, ".hyperbook", "out", basePath || ""); } console.log( - `${chalk.blue(`[${prefix}]`)} Cleaning output folder ${rootOut}.` + `${chalk.blue(`[${prefix}]`)} Cleaning output folder ${rootOut}.`, ); await runArchive(root, rootOut, prefix); @@ -133,7 +134,7 @@ async function runBuild( const pagesAndSections = await hyperbook.getPagesAndSections(root); const pageList = hyperbook.getPageList( pagesAndSections.sections, - pagesAndSections.pages + pagesAndSections.pages, ); const searchDocuments: any[] = []; @@ -180,7 +181,7 @@ async function runBuild( }); const permaFileOut = path.join( permaOut, - file.markdown.data.permaid + ".html" + file.markdown.data.permaid + ".html", ); await fs.writeFile(permaFileOut, result.value); } @@ -190,7 +191,7 @@ async function runBuild( readline.cursorTo(process.stdout, 0); } process.stdout.write( - `${chalk.blue(`[${prefix}]`)} Buildung book: [${i++}/${bookFiles.length}]` + `${chalk.blue(`[${prefix}]`)} Buildung book: [${i++}/${bookFiles.length}]`, ); if (process.env.CI) { process.stdout.write("\n"); @@ -202,7 +203,7 @@ async function runBuild( const glossaryOut = path.join(rootOut, "glossary"); if (filter) { glossaryFiles = glossaryFiles.filter((f) => - f.path.absolute?.endsWith(filter) + f.path.absolute?.endsWith(filter), ); } @@ -242,7 +243,7 @@ async function runBuild( readline.cursorTo(process.stdout, 0); } process.stdout.write( - `${chalk.blue(`[${prefix}]`)} Buildung glossary: [${i++}/${glossaryFiles.length}]` + `${chalk.blue(`[${prefix}]`)} Buildung glossary: [${i++}/${glossaryFiles.length}]`, ); if (process.env.CI) { process.stdout.write("\n"); @@ -250,6 +251,12 @@ async function runBuild( } process.stdout.write("\n"); + const assetsPath = path.join(__dirname, "assets"); + const assetsOut = path.join(rootOut, ASSETS_FOLDER); + await mkdir(assetsOut, { + recursive: true, + }); + let otherFiles = await vfile.listForFolder(root, "public"); i = 1; for (let file of otherFiles) { @@ -257,16 +264,40 @@ async function runBuild( await makeDir(directoryOut, { recursive: true, }); - if (file.path.href) { + if (file.path.href && file.extension !== ".h5p") { const fileOut = path.join(rootOut, file.path.href); await cp(file.path.absolute, fileOut); + } else if (file.path.href && file.extension === ".h5p") { + const fileOut = path.join(rootOut, file.path.href); + await extractZip(file.path.absolute, { + dir: fileOut, + }); + + const h5pLibraries = path.join(assetsOut, "directive-h5p", "libraries"); + await makeDir(h5pLibraries, { recursive: true }); + + const files = await fs.readdir(fileOut); + const libraryFolders = files.filter( + (file) => !["content", "h5p.json"].includes(file), + ); + for (const libraryFolder of libraryFolders) { + await cp( + path.join(fileOut, libraryFolder), + path.join(h5pLibraries, libraryFolder), + { + recursive: true, + force: true, + }, + ); + await rimraf(path.join(fileOut, libraryFolder)); + } } if (!process.env.CI) { readline.clearLine(process.stdout, 0); readline.cursorTo(process.stdout, 0); } process.stdout.write( - `${chalk.blue(`[${prefix}]`)} Copying public files: [${i++}/${otherFiles.length}]` + `${chalk.blue(`[${prefix}]`)} Copying public files: [${i++}/${otherFiles.length}]`, ); if (process.env.CI) { process.stdout.write("\n"); @@ -274,12 +305,6 @@ async function runBuild( } process.stdout.write("\n"); - const assetsPath = path.join(__dirname, "assets"); - const assetsOut = path.join(rootOut, ASSETS_FOLDER); - await mkdir(assetsOut, { - recursive: true, - }); - i = 1; for (let directive of directives) { const assetsDirectivePath = path.join(assetsPath, `directive-${directive}`); @@ -289,7 +314,7 @@ async function runBuild( readline.cursorTo(process.stdout, 0); } process.stdout.write( - `${chalk.blue(`[${prefix}]`)} Copying directive assets: [${i++}/${directives.size}]` + `${chalk.blue(`[${prefix}]`)} Copying directive assets: [${i++}/${directives.size}]`, ); if (process.env.CI) { process.stdout.write("\n"); @@ -303,7 +328,7 @@ async function runBuild( } catch (e) { process.stdout.write("\n"); process.stdout.write( - `${chalk.red(`[${prefix}]`)} Failed copying directive assets: ${directive}` + `${chalk.red(`[${prefix}]`)} Failed copying directive assets: ${directive}`, ); process.stdout.write("\n"); } @@ -337,7 +362,7 @@ async function runBuild( readline.cursorTo(process.stdout, 0); } process.stdout.write( - `${chalk.blue(`[${prefix}]`)} Copying hyperbook assets: [${i++}/${mainAssets.length}]` + `${chalk.blue(`[${prefix}]`)} Copying hyperbook assets: [${i++}/${mainAssets.length}]`, ); if (process.env.CI) { process.stdout.write("\n"); @@ -357,7 +382,7 @@ async function runBuild( foundLanguage = true; } catch (e) { console.log( - `${chalk.yellow(`[${prefix}]`)} ${hyperbookJson.language} is no valid value for the lanuage key. See https://github.com/MihaiValentin/lunr-languages for possible values. Falling back to English.` + `${chalk.yellow(`[${prefix}]`)} ${hyperbookJson.language} is no valid value for the lanuage key. See https://github.com/MihaiValentin/lunr-languages for possible values. Falling back to English.`, ); } } @@ -396,17 +421,31 @@ const SEARCH_DOCUMENTS = ${JSON.stringify(documents)}; .readdir(path.join(__dirname, "locales")) .then((files) => files.map((file) => file.split(".")[0])); let language = "en"; - if (hyperbookJson.language && supportLanguages.includes(hyperbookJson.language)) { + if ( + hyperbookJson.language && + supportLanguages.includes(hyperbookJson.language) + ) { language = hyperbookJson.language; } - const i18nJS = await fs.readFile(path.join(rootOut, ASSETS_FOLDER, "i18n.js"), "utf-8"); - const locales = await fs.readFile(path.join(__dirname, "locales", `${language}.json`), "utf-8"); - await fs.writeFile(path.join(rootOut, ASSETS_FOLDER, "i18n.js"), i18nJS.replace(/\/\/[\s]*LOCALES[\s\S]*?[\s]*\/\/[\s]*LOCALES/g, ` + const i18nJS = await fs.readFile( + path.join(rootOut, ASSETS_FOLDER, "i18n.js"), + "utf-8", + ); + const locales = await fs.readFile( + path.join(__dirname, "locales", `${language}.json`), + "utf-8", + ); + await fs.writeFile( + path.join(rootOut, ASSETS_FOLDER, "i18n.js"), + i18nJS.replace( + /\/\/[\s]*LOCALES[\s\S]*?[\s]*\/\/[\s]*LOCALES/g, + ` // GENERATED const locales = ${locales}; -`)); - +`, + ), + ); console.log(`${chalk.green(`[${prefix}]`)} Build success: ${rootOut}`); } diff --git a/packages/hyperbook/package.json b/packages/hyperbook/package.json index 0b814dea..08ed36a6 100644 --- a/packages/hyperbook/package.json +++ b/packages/hyperbook/package.json @@ -51,6 +51,7 @@ "cpy": "11.1.0", "cross-spawn": "7.0.6", "domutils": "^3.2.2", + "extract-zip": "^2.0.1", "got": "12.6.0", "htmlparser2": "^10.0.0", "lunr": "^2.3.9", diff --git a/packages/markdown/assets/directive-h5p/client.js b/packages/markdown/assets/directive-h5p/client.js new file mode 100644 index 00000000..11cab4b5 --- /dev/null +++ b/packages/markdown/assets/directive-h5p/client.js @@ -0,0 +1,55 @@ +hyperbook.h5p = (function () { + /** + * Initialize H5P elements within the given root element. + * @param {HTMLElement} [root=document] - The root element to initialize. + */ + + const save = (id) => + H5P.getUserData(id, "state", (error, userData) => { + if (!error) { + store.h5p.put({ id, userData }); + } + }); + + const init = async (root) => { + const els = root.getElementsByClassName("directive-h5p"); + const assets = `${HYPERBOOK_ASSETS}directive-h5p`; + + const h5pBaseOptions = { + frameJs: `${assets}/frame.bundle.js`, + frameCss: `${assets}/styles/h5p.css`, + librariesPath: `${assets}/libraries`, + saveFreq: 1, + contentUserData: undefined, + frame: false, + copyright: false, + export: false, + icon: false, + embed: false, + }; + + for (const el of els) { + const h5pFrame = el.querySelector(".h5p-frame"); + const src = el.getAttribute("data-src"); + const id = el.getAttribute("data-id"); + if (h5pFrame && src) { + const result = await store.h5p.get(id); + const h5pOptions = { + ...h5pBaseOptions, + id, + h5pJsonPath: src, + contentUserData: result + ? [{ state: JSON.stringify(result.userData) }] + : undefined, + }; + + new H5PStandalone.H5P(h5pFrame, h5pOptions); + + // save from time to time + setInterval(() => save(id), 1000); + } + } + }; + + init(document); +})(); diff --git a/packages/markdown/assets/directive-h5p/style.css b/packages/markdown/assets/directive-h5p/style.css new file mode 100644 index 00000000..1a381520 --- /dev/null +++ b/packages/markdown/assets/directive-h5p/style.css @@ -0,0 +1,11 @@ +.directive-h5p .h5p-frame { + border: 1px solid var(--color-spacer); + border-radius: 8px; + overflow: hidden; + padding: 8px; + background-color: #fefefe; +} + +.directive-h5p { + margin-bottom: 8px; +} diff --git a/packages/markdown/assets/store.js b/packages/markdown/assets/store.js index 35bea3a5..82dfaefd 100644 --- a/packages/markdown/assets/store.js +++ b/packages/markdown/assets/store.js @@ -23,7 +23,8 @@ store.version(1).stores({ slideshow: `id,active`, tabs: `id,active`, excalidraw: `id,excalidrawElements,appState,files`, - webide: `id,html,css,js` + webide: `id,html,css,js`, + h5p: `id,userData`, }); var sqlIdeDB = new Dexie("SQL-IDE"); sqlIdeDB.version(0.1).stores({ diff --git a/packages/markdown/dev.md b/packages/markdown/dev.md index 588cf441..23fb8e02 100644 --- a/packages/markdown/dev.md +++ b/packages/markdown/dev.md @@ -3,256 +3,6 @@ name: Web IDE permaid: webide --- -# Web IDE +## H5P -The Web IDE allows running HTML, CSS and JavaScript code in a sandboxed environment. It is useful for teaching and learning purposes, as well as for testing code snippets. It only supports one HTML, one CSS and one JS file. - -## Usage - -To use the Web IDE, you need to wrap your code in a `:::webide` block. Inside this block, you can use `html`, `css` and `js` code blocks. You can fill the code blocks with boilerplate, or you can leave them empty. - -````md -:::webide - -```js -``` - -```css -``` - -```html -

My Heading

-``` - -::: -```` - -:::webide - -```js -``` - -```css -``` - -```html -

My Heading

-``` - -::: - -### Hide tabs - -You can hide tabs by remove the code block. For example, if you want to hide the CSS tab, you can remove the `css` code block. - -````md -:::webide - -```js -``` - -```html -

My Heading

-``` - -::: -```` - -:::webide - -```js -``` - -```html -

My Heading

-``` - -::: - -### Custom template - -By default, the Web IDE uses a simple template. You can customize the template by adding a `html template` code block inside the `webide` block. The default code block is: - -```html - - - WebIDE - - - -###HTML### - -``` - -The `###CSS###`, `###HTML###` and `###JS###` placeholders will be replaced by the content of the `css`, `html` and `js` code blocks. - -Here is an example of a custom template, for example if you want to add a custom library: - -````md -:::webide - -```js -// do this for 30 seconds -var duration = 30 * 1000; -var end = Date.now() + duration; - -(function frame() { - // launch a few confetti from the left edge - confetti({ - particleCount: 7, - angle: 60, - spread: 55, - origin: { x: 0 } - }); - // and launch a few from the right edge - confetti({ - particleCount: 7, - angle: 120, - spread: 55, - origin: { x: 1 } - }); - - // keep going until we are out of time - if (Date.now() < end) { - requestAnimationFrame(frame); - } -}()); -``` - -```html -

Celebrate

-``` - -```html template - - - WebIDE - - - - -###HTML### - -``` - -::: -```` - -:::webide - -```js -// do this for 30 seconds -var duration = 30 * 1000; -var end = Date.now() + duration; - -(function frame() { - // launch a few confetti from the left edge - confetti({ - particleCount: 7, - angle: 60, - spread: 55, - origin: { x: 0 } - }); - // and launch a few from the right edge - confetti({ - particleCount: 7, - angle: 120, - spread: 55, - origin: { x: 1 } - }); - - // keep going until we are out of time - if (Date.now() < end) { - requestAnimationFrame(frame); - } -}()); -``` - -```html -

Celebrate

-``` - -```html template - - - WebIDE - - - - -###HTML### - -``` - -::: - -## Example - -````md -:::webide - -```js -let a = document.getElementsByClassName("my-class"); -a[0].style.backgroundColor = "palevioletred"; -``` - -```css -.my-class { - color: papayawhip; - font-size: 20px; - text-weight: bold; - text-align: center; - padding: 10px; -} -``` - -```html -
Test
-``` - -::: -```` - -:::webide - -```js -let a = document.getElementsByClassName("my-class"); -a[0].style.backgroundColor = "palevioletred"; -``` - -```css -.my-class { - color: papayawhip; - font-size: 20px; - text-weight: bold; - text-align: center; - padding: 10px; -} -``` - -```html -
Test
-``` - -::: +::h5p{src="h5p-test"} diff --git a/packages/markdown/package.json b/packages/markdown/package.json index de44fc83..b4617b36 100644 --- a/packages/markdown/package.json +++ b/packages/markdown/package.json @@ -85,6 +85,7 @@ "chokidar": "4.0.3", "dexie": "^4.0.11", "dexie-export-import": "^4.1.4", + "h5p-standalone": "^3.8.0", "live-server": "^1.2.2", "lunr": "^2.3.9", "lunr-languages": "^1.14.0", diff --git a/packages/markdown/postbuild.mjs b/packages/markdown/postbuild.mjs index 4e689c11..5dfcacba 100644 --- a/packages/markdown/postbuild.mjs +++ b/packages/markdown/postbuild.mjs @@ -8,7 +8,12 @@ async function postbuild() { dst: path.join("./dist", "assets", "dexie.min.js"), }, { - src: path.join("./node_modules", "dexie-export-import", "dist", "dexie-export-import.js"), + src: path.join( + "./node_modules", + "dexie-export-import", + "dist", + "dexie-export-import.js", + ), dst: path.join("./dist", "assets", "dexie-export-import.js"), }, { @@ -111,23 +116,59 @@ async function postbuild() { }, { src: path.join("./node_modules", "abcjs", "dist", "abcjs-basic-min.js"), - dst: path.join("./dist", "assets", "directive-abc-music", "abcjs-basic-min.js"), + dst: path.join( + "./dist", + "assets", + "directive-abc-music", + "abcjs-basic-min.js", + ), }, { - src: path.join("./node_modules", "@webcoder49", "code-input", "code-input.min.css"), + src: path.join( + "./node_modules", + "@webcoder49", + "code-input", + "code-input.min.css", + ), dst: path.join("./dist", "assets", "code-input", "code-input.min.css"), }, { - src: path.join("./node_modules", "@webcoder49", "code-input", "code-input.min.js"), + src: path.join( + "./node_modules", + "@webcoder49", + "code-input", + "code-input.min.js", + ), dst: path.join("./dist", "assets", "code-input", "code-input.min.js"), }, { - src: path.join("./node_modules", "@webcoder49", "code-input", "plugins", "indent.min.js"), + src: path.join( + "./node_modules", + "@webcoder49", + "code-input", + "plugins", + "indent.min.js", + ), dst: path.join("./dist", "assets", "code-input", "indent.min.js"), }, { - src: path.join("./node_modules", "@webcoder49", "code-input", "plugins", "auto-close-brackets.min.js"), - dst: path.join("./dist", "assets", "code-input", "auto-close-brackets.min.js"), + src: path.join( + "./node_modules", + "@webcoder49", + "code-input", + "plugins", + "auto-close-brackets.min.js", + ), + dst: path.join( + "./dist", + "assets", + "code-input", + "auto-close-brackets.min.js", + ), + }, + { + src: path.join("./node_modules", "h5p-standalone", "dist"), + dst: path.join("./dist", "assets", "directive-h5p"), }, ]; diff --git a/packages/markdown/src/process.ts b/packages/markdown/src/process.ts index 2469ae04..07dae355 100644 --- a/packages/markdown/src/process.ts +++ b/packages/markdown/src/process.ts @@ -53,6 +53,7 @@ import remarkDirectiveAbcMusic from "./remarkDirectiveAbcMusic"; import remarkDirectivePyide from "./remarkDirectivePyide"; import { i18n } from "./i18n"; import remarkDirectiveWebide from "./remarkDirectiveWebide"; +import remarkDirectiveH5P from "./remarkDirectiveH5P"; export const remark = (ctx: HyperbookContext) => { i18n.init(ctx.config.language || "en"); @@ -91,6 +92,7 @@ export const remark = (ctx: HyperbookContext) => { remarkDirectiveStruktog(ctx), remarkDirectiveGeogebra(ctx), remarkDirectiveWebide(ctx), + remarkDirectiveH5P(ctx), remarkCode(ctx), remarkMath, /* needs to be last directive */ diff --git a/packages/markdown/src/remarkDirectiveH5P.ts b/packages/markdown/src/remarkDirectiveH5P.ts new file mode 100644 index 00000000..efeb55c3 --- /dev/null +++ b/packages/markdown/src/remarkDirectiveH5P.ts @@ -0,0 +1,51 @@ +// Register directive nodes in mdast: +/// +// +import { HyperbookContext } from "@hyperbook/types"; +import { Root } from "mdast"; +import { visit } from "unist-util-visit"; +import { VFile } from "vfile"; +import { + expectLeafDirective, + isDirective, + registerDirective, +} from "./remarkHelper"; +import hash from "./objectHash"; + +export default (ctx: HyperbookContext) => () => { + const name = "h5p"; + return (tree: Root, file: VFile) => { + visit(tree, function (node) { + if (isDirective(node) && node.name === name) { + const data = node.data || (node.data = {}); + const { src, id = hash(node), ...props } = node.attributes || {}; + + expectLeafDirective(node, file, name); + registerDirective( + file, + name, + ["main.bundle.js", "client.js"], + ["style.css"], + ); + + const {} = node.attributes || {}; + data.hName = "div"; + data.hProperties = { + class: "directive-h5p", + "data-src": src ? ctx.makeUrl(src, "public") : undefined, + "data-id": id, + }; + data.hChildren = [ + { + type: "element", + tagName: "div", + properties: { + class: "h5p-frame", + }, + children: [], + }, + ]; + } + }); + }; +}; diff --git a/platforms/vscode/snipptes/hyperbook.code-snippets b/platforms/vscode/snipptes/hyperbook.code-snippets index 619b6e52..94c39389 100644 --- a/platforms/vscode/snipptes/hyperbook.code-snippets +++ b/platforms/vscode/snipptes/hyperbook.code-snippets @@ -13,18 +13,14 @@ "prefix": [":download"], "body": ["::download[${2:title}]{src=\"$1\"}", "$0"] }, + "Element H5P": { + "prefix": [":h5p"], + "body": ["::h5p{src=\"$1\"}", "$0"] + }, "Element Archive": { "prefix": [":archive"], "body": ["::archive[${2:title}]{name=\"$1\"}", "$0"] }, - "Element Bitflow Flow": { - "prefix": [":flow"], - "body": ["::flow{src=\"$1\" height=400}", "$0"] - }, - "Element Bitflow Task": { - "prefix": [":task"], - "body": ["::task{src=\"$1\" height=400}", "$0"] - }, "Element Bookmarks": { "prefix": [":bookmarks"], "body": ["::bookmarks", "", "$0"] diff --git a/platforms/vscode/src/extension.ts b/platforms/vscode/src/extension.ts index a4c0e3fb..731dab32 100644 --- a/platforms/vscode/src/extension.ts +++ b/platforms/vscode/src/extension.ts @@ -189,11 +189,51 @@ export function activate(context: vscode.ExtensionContext) { '"', ); + const h5pProvider = vscode.languages.registerCompletionItemProvider( + DocumentSelectorMarkdown, + { + async provideCompletionItems(document, position) { + const linePrefix = document + .lineAt(position) + .text.slice(0, position.character); + const findTerm = linePrefix.match(/.*:(h5p)\[.+\]{\s*src=\"/); + if (findTerm === null) { + return undefined; + } + + const workspaceFolder = await hyperbook.findRoot(document.uri.path); + + if (!workspaceFolder) { + return undefined; + } + + return vscode.workspace + .findFiles(new vscode.RelativePattern(workspaceFolder, "public/**")) + .then((files) => { + return files + .filter((f) => f.path.endsWith(".h5p")) + .map((f) => { + const p = path.relative( + path.join(workspaceFolder, "public"), + f.path, + ); + return new vscode.CompletionItem( + p, + vscode.CompletionItemKind.File, + ); + }); + }); + }, + }, + '"', + ); + context.subscriptions.push( bookProvider, publicProvider, glossaryProvider, archiveProvider, + h5pProvider, ); } diff --git a/platforms/vscode/syntaxes/hyperbook.json b/platforms/vscode/syntaxes/hyperbook.json index 8e44b023..db679c40 100644 --- a/platforms/vscode/syntaxes/hyperbook.json +++ b/platforms/vscode/syntaxes/hyperbook.json @@ -18,6 +18,9 @@ { "include": "#directive-download" }, + { + "include": "#directive-h5p" + }, { "include": "#directive-emoji" }, @@ -214,6 +217,33 @@ } } }, + "directive-h5p": { + "name": "meta.directive.h5p.hyperbook", + "match": "(^|\\G)(:{1,})(h5p){(.*)}\\s*$", + "captures": { + "2": { + "name": "punctuation.definition.directive.level.hyperbook" + }, + "3": { + "name": "entity.name.function.directive.h5p.hyperbook" + }, + "4": { + "patterns": [ + { + "match": "(src)=\"([^\"]*)\"", + "captures": { + "1": { + "name": "keyword.parameter.directive.h5p.hyperbook" + }, + "2": { + "name": "string.quoted.double.untitled" + } + } + } + ] + } + } + }, "directive-emoji": { "name": "meta.directive.emoji.hyperbook", "match": "(:)([a-zA-z]+)(:)", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eada488e..7fb7004b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -171,6 +171,9 @@ importers: domutils: specifier: ^3.2.2 version: 3.2.2 + extract-zip: + specifier: ^2.0.1 + version: 2.0.1 got: specifier: 12.6.0 version: 12.6.0 @@ -340,6 +343,9 @@ importers: dexie-export-import: specifier: ^4.1.4 version: 4.1.4(dexie@4.0.11) + h5p-standalone: + specifier: ^3.8.0 + version: 3.8.0(@swc/core@1.10.4) live-server: specifier: ^1.2.2 version: 1.2.2 @@ -366,7 +372,7 @@ importers: version: 6.0.3 vitest: specifier: ^3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0) + version: 3.0.5(@types/debug@4.1.12)(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0) wavesurfer.js: specifier: ^7.9.0 version: 7.9.0 @@ -731,6 +737,71 @@ packages: '@chevrotain/utils@11.0.3': resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + '@commitlint/cli@17.8.1': + resolution: {integrity: sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg==} + engines: {node: '>=v14'} + hasBin: true + + '@commitlint/config-validator@17.8.1': + resolution: {integrity: sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA==} + engines: {node: '>=v14'} + + '@commitlint/ensure@17.8.1': + resolution: {integrity: sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow==} + engines: {node: '>=v14'} + + '@commitlint/execute-rule@17.8.1': + resolution: {integrity: sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ==} + engines: {node: '>=v14'} + + '@commitlint/format@17.8.1': + resolution: {integrity: sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg==} + engines: {node: '>=v14'} + + '@commitlint/is-ignored@17.8.1': + resolution: {integrity: sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g==} + engines: {node: '>=v14'} + + '@commitlint/lint@17.8.1': + resolution: {integrity: sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA==} + engines: {node: '>=v14'} + + '@commitlint/load@17.8.1': + resolution: {integrity: sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA==} + engines: {node: '>=v14'} + + '@commitlint/message@17.8.1': + resolution: {integrity: sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA==} + engines: {node: '>=v14'} + + '@commitlint/parse@17.8.1': + resolution: {integrity: sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw==} + engines: {node: '>=v14'} + + '@commitlint/read@17.8.1': + resolution: {integrity: sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w==} + engines: {node: '>=v14'} + + '@commitlint/resolve-extends@17.8.1': + resolution: {integrity: sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q==} + engines: {node: '>=v14'} + + '@commitlint/rules@17.8.1': + resolution: {integrity: sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA==} + engines: {node: '>=v14'} + + '@commitlint/to-lines@17.8.1': + resolution: {integrity: sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA==} + engines: {node: '>=v14'} + + '@commitlint/top-level@17.8.1': + resolution: {integrity: sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA==} + engines: {node: '>=v14'} + + '@commitlint/types@17.8.1': + resolution: {integrity: sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ==} + engines: {node: '>=v14'} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -1563,6 +1634,9 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -1575,9 +1649,15 @@ packages: '@types/node@20.12.12': resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} + '@types/node@20.5.1': + resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + '@types/node@22.13.1': resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/object-hash@3.0.6': resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} @@ -1632,6 +1712,9 @@ packages: '@types/ws@8.5.14': resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + '@types/yauzl@2.10.3': + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.23.0': resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1853,6 +1936,10 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + abcjs@6.4.4: resolution: {integrity: sha512-dT3Z2vb8yihbiPMzSoup0JOcvO2je4qpFNlTD+kS5VBelE3AASAs18dS5qeMWkZeqCz7kI/hz62B2lpMDugWLA==} @@ -1994,6 +2081,9 @@ packages: resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} engines: {node: '>=0.10.0'} + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-slice@1.1.0: resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} engines: {node: '>=0.10.0'} @@ -2006,6 +2096,10 @@ packages: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -2219,6 +2313,14 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + caniuse-lite@1.0.30001697: resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} @@ -2400,6 +2502,9 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + component-emitter@1.3.1: resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} @@ -2426,6 +2531,15 @@ packages: constants-browserify@1.0.0: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} + conventional-changelog-angular@6.0.0: + resolution: {integrity: sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg==} + engines: {node: '>=14'} + + conventional-commits-parser@4.0.0: + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} + hasBin: true + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2456,6 +2570,24 @@ packages: cose-base@2.2.0: resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig-typescript-loader@4.4.0: + resolution: {integrity: sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==} + engines: {node: '>=v14.21.3'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=4' + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + cpy@11.1.0: resolution: {integrity: sha512-QGHetPSSuprVs+lJmMDcivvrBwTKASzXQ5qxFvRC2RFESjjod71bDvFvhxTjDgkNjrrb72AI6JPjfYwxrIy33A==} engines: {node: '>=18'} @@ -2685,6 +2817,10 @@ packages: dagre-d3-es@7.0.11: resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -2708,6 +2844,14 @@ packages: supports-color: optional: true + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + decircular@1.0.0: resolution: {integrity: sha512-YhCtYW0jQs9+gzL2vDLxanRhMHeKa55kw5z2oheI6D+MQA7KafrqtiGKhhpKCLZQurm2a9h0LkP9T5z5gy+A0A==} engines: {node: '>=18'} @@ -2861,6 +3005,10 @@ packages: dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dotenv@8.6.0: resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} engines: {node: '>=10'} @@ -3121,6 +3269,11 @@ packages: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} + extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3272,6 +3425,10 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -3337,6 +3494,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -3349,6 +3510,11 @@ packages: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -3379,6 +3545,10 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} engines: {node: '>=0.10.0'} @@ -3440,6 +3610,9 @@ packages: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} + h5p-standalone@3.8.0: + resolution: {integrity: sha512-YAu2b+L6HJTZ55Mxm9PstMMz13zYeEMbv2h8Q3XYlv/yl/ijlCyg18tHTEhgnW3uai1pzTju9xQopCiW6LUmFw==} + hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} @@ -3448,6 +3621,10 @@ packages: engines: {node: '>=0.4.7'} hasBin: true + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} @@ -3702,6 +3879,10 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} @@ -3871,6 +4052,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-obj@3.0.0: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} @@ -3883,6 +4068,10 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -3930,6 +4119,10 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + is-typed-array@1.1.10: resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} @@ -4050,6 +4243,13 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -4242,6 +4442,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} deprecated: This package is deprecated. Use the optional chaining (?.) operator instead. @@ -4252,6 +4455,9 @@ packages: lodash.isboolean@3.0.3: resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + lodash.isinteger@4.0.4: resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} @@ -4264,15 +4470,30 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -4335,6 +4556,14 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + map-stream@0.1.0: resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} @@ -4413,6 +4642,10 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -4608,6 +4841,10 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -4629,6 +4866,10 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -4754,6 +4995,10 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -5302,6 +5547,10 @@ packages: queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -5342,10 +5591,18 @@ packages: resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} engines: {node: '>=0.10.0'} + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -5384,6 +5641,10 @@ packages: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -5495,6 +5756,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated @@ -5659,6 +5924,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.1: resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} @@ -5851,6 +6121,9 @@ packages: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} @@ -5953,6 +6226,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -6029,6 +6306,13 @@ packages: engines: {node: '>=10'} hasBin: true + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -6091,6 +6375,10 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -6145,10 +6433,22 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + type-fest@4.33.0: resolution: {integrity: sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==} engines: {node: '>=16'} @@ -6243,6 +6543,10 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + unix-crypt-td-js@1.1.4: resolution: {integrity: sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==} @@ -6605,6 +6909,10 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -7063,6 +7371,118 @@ snapshots: '@chevrotain/utils@11.0.3': {} + '@commitlint/cli@17.8.1(@swc/core@1.10.4)': + dependencies: + '@commitlint/format': 17.8.1 + '@commitlint/lint': 17.8.1 + '@commitlint/load': 17.8.1(@swc/core@1.10.4) + '@commitlint/read': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/config-validator@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + ajv: 8.17.1 + + '@commitlint/ensure@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@17.8.1': {} + + '@commitlint/format@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + chalk: 4.1.2 + + '@commitlint/is-ignored@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + semver: 7.5.4 + + '@commitlint/lint@17.8.1': + dependencies: + '@commitlint/is-ignored': 17.8.1 + '@commitlint/parse': 17.8.1 + '@commitlint/rules': 17.8.1 + '@commitlint/types': 17.8.1 + + '@commitlint/load@17.8.1(@swc/core@1.10.4)': + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/execute-rule': 17.8.1 + '@commitlint/resolve-extends': 17.8.1 + '@commitlint/types': 17.8.1 + '@types/node': 20.5.1 + chalk: 4.1.2 + cosmiconfig: 8.3.6(typescript@5.7.3) + cosmiconfig-typescript-loader: 4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.7.3))(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.5.1)(typescript@5.7.3))(typescript@5.7.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@20.5.1)(typescript@5.7.3) + typescript: 5.7.3 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + + '@commitlint/message@17.8.1': {} + + '@commitlint/parse@17.8.1': + dependencies: + '@commitlint/types': 17.8.1 + conventional-changelog-angular: 6.0.0 + conventional-commits-parser: 4.0.0 + + '@commitlint/read@17.8.1': + dependencies: + '@commitlint/top-level': 17.8.1 + '@commitlint/types': 17.8.1 + fs-extra: 11.3.0 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + + '@commitlint/resolve-extends@17.8.1': + dependencies: + '@commitlint/config-validator': 17.8.1 + '@commitlint/types': 17.8.1 + import-fresh: 3.3.1 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + + '@commitlint/rules@17.8.1': + dependencies: + '@commitlint/ensure': 17.8.1 + '@commitlint/message': 17.8.1 + '@commitlint/to-lines': 17.8.1 + '@commitlint/types': 17.8.1 + execa: 5.1.1 + + '@commitlint/to-lines@17.8.1': {} + + '@commitlint/top-level@17.8.1': + dependencies: + find-up: 5.0.0 + + '@commitlint/types@17.8.1': + dependencies: + chalk: 4.1.2 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -7817,6 +8237,8 @@ snapshots: '@types/minimatch@5.1.2': {} + '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': {} '@types/node@12.20.55': {} @@ -7829,10 +8251,14 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.5.1': {} + '@types/node@22.13.1': dependencies: undici-types: 6.20.0 + '@types/normalize-package-data@2.4.4': {} + '@types/object-hash@3.0.6': {} '@types/pako@2.0.3': {} @@ -7888,6 +8314,11 @@ snapshots: dependencies: '@types/node': 22.13.1 + '@types/yauzl@2.10.3': + dependencies: + '@types/node': 20.12.12 + optional: true + '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0)(typescript@5.7.3))(eslint@9.19.0)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -7987,6 +8418,14 @@ snapshots: chai: 5.1.2 tinyrainbow: 2.0.0 + '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0))': + dependencies: + '@vitest/spy': 3.0.5 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + vite: 6.1.0(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0) + '@vitest/mocker@3.0.5(vite@6.1.0(@types/node@22.13.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.5 @@ -8187,6 +8626,11 @@ snapshots: '@xtuc/long@4.2.2': {} + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + abcjs@6.4.4: {} abort-controller@3.0.0: @@ -8333,12 +8777,16 @@ snapshots: array-each@1.0.1: {} + array-ify@1.0.0: {} + array-slice@1.1.0: {} array-union@2.1.0: {} array-unique@0.3.2: {} + arrify@1.0.1: {} + asn1.js@4.10.1: dependencies: bn.js: 4.12.1 @@ -8609,6 +9057,14 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + caniuse-lite@1.0.30001697: {} capital-case@1.0.4: @@ -8818,6 +9274,11 @@ snapshots: commander@8.3.0: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + component-emitter@1.3.1: {} compress-commons@6.0.2: @@ -8851,6 +9312,17 @@ snapshots: constants-browserify@1.0.0: {} + conventional-changelog-angular@6.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-commits-parser@4.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + meow: 8.1.2 + split2: 3.2.2 + convert-source-map@2.0.0: {} copy-descriptor@0.1.1: {} @@ -8885,6 +9357,22 @@ snapshots: dependencies: layout-base: 2.0.1 + cosmiconfig-typescript-loader@4.4.0(@types/node@20.5.1)(cosmiconfig@8.3.6(typescript@5.7.3))(ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.5.1)(typescript@5.7.3))(typescript@5.7.3): + dependencies: + '@types/node': 20.5.1 + cosmiconfig: 8.3.6(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.4)(@types/node@20.5.1)(typescript@5.7.3) + typescript: 5.7.3 + + cosmiconfig@8.3.6(typescript@5.7.3): + dependencies: + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.7.3 + cpy@11.1.0: dependencies: copy-file: 11.0.0 @@ -9175,6 +9663,8 @@ snapshots: d3: 7.9.0 lodash-es: 4.17.21 + dargs@7.0.0: {} + dataloader@1.4.0: {} dayjs@1.11.13: {} @@ -9187,6 +9677,13 @@ snapshots: dependencies: ms: 2.1.3 + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + decircular@1.0.0: {} decode-named-character-reference@1.0.2: @@ -9334,6 +9831,10 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dotenv@8.6.0: {} dunder-proto@1.0.1: @@ -9386,7 +9887,6 @@ snapshots: end-of-stream@1.4.4: dependencies: once: 1.4.0 - optional: true enhanced-resolve@5.18.1: dependencies: @@ -9677,6 +10177,16 @@ snapshots: transitivePeerDependencies: - supports-color + extract-zip@2.0.1: + dependencies: + debug: 4.4.0 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + fast-deep-equal@3.1.3: {} fast-fifo@1.3.2: {} @@ -9839,6 +10349,12 @@ snapshots: fs-constants@1.0.0: optional: true + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -9915,6 +10431,10 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + get-stream@6.0.1: {} get-symbol-description@1.0.0: @@ -9924,6 +10444,14 @@ snapshots: get-value@2.0.6: {} + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + github-from-package@0.0.0: optional: true @@ -9969,6 +10497,10 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + global-dirs@0.1.1: + dependencies: + ini: 1.3.8 + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 @@ -10059,6 +10591,13 @@ snapshots: section-matter: 1.0.0 strip-bom-string: 1.0.0 + h5p-standalone@3.8.0(@swc/core@1.10.4): + dependencies: + '@commitlint/cli': 17.8.1(@swc/core@1.10.4) + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + hachure-fill@0.5.2: {} handlebars@4.7.8: @@ -10070,6 +10609,8 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 + hard-rejection@2.1.0: {} + has-bigints@1.0.2: {} has-flag@3.0.0: {} @@ -10416,6 +10957,8 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + indent-string@5.0.0: {} inflight@1.0.6: @@ -10580,12 +11123,16 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + is-obj@3.0.0: {} is-path-cwd@3.0.0: {} is-path-inside@4.0.0: {} + is-plain-obj@1.1.0: {} + is-plain-obj@2.1.0: {} is-plain-obj@4.1.0: {} @@ -10630,6 +11177,10 @@ snapshots: dependencies: has-symbols: 1.0.3 + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + is-typed-array@1.1.10: dependencies: available-typed-arrays: 1.0.5 @@ -10729,6 +11280,14 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonparse@1.3.1: {} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -10942,12 +11501,16 @@ snapshots: lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + lodash.get@4.4.2: {} lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} + lodash.isfunction@3.0.9: {} + lodash.isinteger@4.0.4: {} lodash.isnumber@3.0.3: {} @@ -10956,12 +11519,22 @@ snapshots: lodash.isstring@4.0.1: {} + lodash.kebabcase@4.1.1: {} + lodash.merge@4.6.2: {} + lodash.mergewith@4.6.2: {} + lodash.once@4.1.1: {} + lodash.snakecase@4.1.1: {} + lodash.startcase@4.4.0: {} + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} log-symbols@4.1.0: @@ -11016,6 +11589,10 @@ snapshots: map-cache@0.2.2: {} + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + map-stream@0.1.0: {} map-visit@1.0.0: @@ -11198,6 +11775,20 @@ snapshots: memorystream@0.3.1: {} + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -11576,6 +12167,8 @@ snapshots: mimic-response@4.0.0: {} + min-indent@1.0.1: {} + minimalistic-assert@1.0.1: {} minimalistic-crypto-utils@1.0.1: {} @@ -11596,6 +12189,12 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + minimist@1.2.8: {} minipass@4.2.8: {} @@ -11759,6 +12358,13 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.16.1 + semver: 7.7.1 + validate-npm-package-license: 3.0.4 + normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 @@ -12306,7 +12912,6 @@ snapshots: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - optional: true punycode.js@2.3.1: {} @@ -12330,6 +12935,8 @@ snapshots: queue-tick@1.0.1: {} + quick-lru@4.0.1: {} + quick-lru@5.1.1: {} randombytes@2.1.0: @@ -12369,12 +12976,25 @@ snapshots: react@19.0.0: {} + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -12433,6 +13053,11 @@ snapshots: dependencies: resolve: 1.22.10 + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + regenerator-runtime@0.14.1: {} regex-not@1.0.2: @@ -12598,6 +13223,10 @@ snapshots: resolve-from@5.0.0: {} + resolve-global@1.0.0: + dependencies: + global-dirs: 0.1.1 + resolve-url@0.2.1: {} resolve@1.22.10: @@ -12774,6 +13403,10 @@ snapshots: semver@6.3.1: {} + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.7.1: {} send@1.1.0: @@ -13018,6 +13651,10 @@ snapshots: dependencies: extend-shallow: 3.0.2 + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + split@0.3.3: dependencies: through: 2.3.8 @@ -13131,6 +13768,10 @@ snapshots: strip-final-newline@2.0.0: {} + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -13222,6 +13863,12 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + text-extensions@1.9.0: {} + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + through@2.3.8: {} timers-browserify@2.0.12: @@ -13274,6 +13921,8 @@ snapshots: trim-lines@3.0.1: {} + trim-newlines@3.0.1: {} + trough@2.2.0: {} ts-api-utils@2.0.1(typescript@5.7.3): @@ -13332,6 +13981,26 @@ snapshots: optionalDependencies: '@swc/core': 1.10.4 + ts-node@10.9.2(@swc/core@1.10.4)(@types/node@20.5.1)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.5.1 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.4 + tslib@2.6.2: {} tslib@2.8.1: {} @@ -13349,8 +14018,14 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.18.1: {} + type-fest@0.21.3: {} + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + type-fest@4.33.0: {} typed-array-length@1.0.4: @@ -13465,6 +14140,8 @@ snapshots: universalify@0.1.2: {} + universalify@2.0.1: {} + unix-crypt-td-js@1.1.4: {} unpipe@1.0.0: {} @@ -13554,6 +14231,27 @@ snapshots: '@types/unist': 3.0.2 vfile-message: 4.0.2 + vite-node@3.0.5(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0): + dependencies: + cac: 6.7.14 + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.2 + vite: 6.1.0(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite-node@3.0.5(@types/node@22.13.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0): dependencies: cac: 6.7.14 @@ -13575,6 +14273,19 @@ snapshots: - tsx - yaml + vite@6.1.0(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.34.4 + optionalDependencies: + '@types/node': 20.5.1 + fsevents: 2.3.3 + lightningcss: 1.28.2 + sass: 1.84.0 + terser: 5.38.1 + yaml: 2.7.0 + vite@6.1.0(@types/node@22.13.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0): dependencies: esbuild: 0.24.2 @@ -13588,6 +14299,45 @@ snapshots: terser: 5.38.1 yaml: 2.7.0 + vitest@3.0.5(@types/debug@4.1.12)(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0): + dependencies: + '@vitest/expect': 3.0.5 + '@vitest/mocker': 3.0.5(vite@6.1.0(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.5 + '@vitest/runner': 3.0.5 + '@vitest/snapshot': 3.0.5 + '@vitest/spy': 3.0.5 + '@vitest/utils': 3.0.5 + chai: 5.1.2 + debug: 4.4.0 + expect-type: 1.1.0 + magic-string: 0.30.17 + pathe: 2.0.2 + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinypool: 1.0.2 + tinyrainbow: 2.0.0 + vite: 6.1.0(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0) + vite-node: 3.0.5(@types/node@20.5.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 20.5.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@3.0.5(@types/debug@4.1.12)(@types/node@22.13.1)(lightningcss@1.28.2)(sass@1.84.0)(terser@5.38.1)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.5 @@ -13865,6 +14615,8 @@ snapshots: yaml@2.7.0: {} + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/website/de/book/elements/h5p.md b/website/de/book/elements/h5p.md new file mode 100644 index 00000000..62036ea3 --- /dev/null +++ b/website/de/book/elements/h5p.md @@ -0,0 +1,20 @@ +--- +name: H5P +permaid: h5p +lang: de +--- +# H5P + +H5P ist ein freies und quelloffenes Content-Collaboration-Framework, das auf JavaScript basiert. H5P steht für HTML5 Package und hat zum Ziel, es jedem zu erleichtern, interaktive HTML5-Inhalte zu erstellen, zu teilen und wiederzuverwenden. H5P ist ein beliebtes Werkzeug zur Erstellung interaktiver Inhalte wie Quizze, Präsentationen und Spiele. + +Sie können H5P-Inhalte in Ihr Buch einbetten, indem Sie das `h5p`-Element verwenden. Sie können H5P-Inhalte aus einer Datei laden. + +Das `src`-Attribut wird verwendet, um den Pfad zur H5P-Datei anzugeben. + +```md +::h5p{src="/test.h5p"} +``` + +::h5p{src="/test.h5p"} + +Der beste Weg, H5P-Inhalte zu erstellen, ist die Nutzung der [ZUM Apps](https://apps.zum.de) Website. Sie können H5P-Inhalte auf der Website erstellen und bearbeiten und dann die Inhalte als H5P-Datei herunterladen. Dafür können Sie die Schaltfläche "Reuse" verwenden. Sie können die h5p-Datei dann in Ihren öffentlichen Ordner legen und sie in einem h5p-Element verwenden. diff --git a/website/de/book/elements/test.h5p b/website/de/book/elements/test.h5p new file mode 100644 index 00000000..0cef46c9 Binary files /dev/null and b/website/de/book/elements/test.h5p differ diff --git a/website/de/public/test.h5p b/website/de/public/test.h5p new file mode 100644 index 00000000..0cef46c9 Binary files /dev/null and b/website/de/public/test.h5p differ diff --git a/website/en/book/changelog.md b/website/en/book/changelog.md index 310b6f24..f66bd40a 100644 --- a/website/en/book/changelog.md +++ b/website/en/book/changelog.md @@ -38,6 +38,18 @@ If you need a new feature, open an [issue](https://github.com/openpatch/hyperboo :::: --> +## v0.50.0 + +::::tabs + +:::tab{title="New :rocket:" id="new"} + +- The h5p element allows you to embed H5P content directly into your hyperbook. H5P is an open-source platform for creating, sharing, and reusing interactive content. With the h5p element, you can easily integrate H5P content such as quizzes, interactive videos, and presentations into your hyperbook. [Learn more](/elements/h5p) + +::: + +:::: + ## v0.49.4 ::::tabs diff --git a/website/en/book/elements/h5p.md b/website/en/book/elements/h5p.md new file mode 100644 index 00000000..07b4aae7 --- /dev/null +++ b/website/en/book/elements/h5p.md @@ -0,0 +1,20 @@ +--- +name: H5P +permaid: h5p +--- + +# H5P + +H5P is a free and open-source content collaboration framework based on JavaScript. H5P is short for HTML5 Package, and aims to make it easy for everyone to create, share and reuse interactive HTML5 content. H5P is a popular tool for creating interactive content, such as quizzes, presentations, and games. + +You can embed H5P content in your book using the `h5p` element. You can load an H5P content from a file. + +The src attribute is used to specify the path to the H5P file. + +```md +::h5p{src="/test.h5p"} +``` + +::h5p{src="/test.h5p"} + +The best way to create H5P content is to use the [ZUM Apps](https://apps.zum.de) website. You can create and edit H5P content on the website, and then download the content as an H5P file. For this you can use the Reuse button. You can then put the h5p file into your public folder and use it in a h5p-element. diff --git a/website/en/book/elements/p5.md b/website/en/book/elements/p5.md index 9a123fc9..3a6a5ec7 100644 --- a/website/en/book/elements/p5.md +++ b/website/en/book/elements/p5.md @@ -1,5 +1,6 @@ --- name: P5 +permaid: p5 --- # P5 diff --git a/website/en/public/test.h5p b/website/en/public/test.h5p new file mode 100644 index 00000000..4ad5919f Binary files /dev/null and b/website/en/public/test.h5p differ