From ae9b04f27f2e6f6a900ffc39cfecce6e10f74f37 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Wed, 19 Aug 2026 11:41:58 +0200 Subject: [PATCH] --- .../typescript-ecom-manager-template.zip | Bin 0 -> 35367 bytes .../typescript-task-manager-template.zip | Bin 0 -> 16493 bytes .../u11_calculate-avg-error/solution.js | 8 + .../u12_find-maximum-error/solution.js | 40 ++ .../u13_temp-converter/assets/js/main.js | 44 +- .../uebungen/u14_counter-error/index.html | 20 +- .../uebungen/u14_counter-error/solution.html | 31 +- .../tag47/qwen-vs-codex/codex/index.html | 44 ++ .../tag47/qwen-vs-codex/codex/script.js | 60 ++ .../tag47/qwen-vs-codex/codex/style.css | 285 ++++++++ .../qwen3.5/assets/css/style.css | 136 ++++ .../qwen-vs-codex/qwen3.5/assets/js/script.js | 59 ++ .../tag47/qwen-vs-codex/qwen3.5/index.html | 33 + .../assets/js/libs/uuid/index.d.ts | 15 + .../assets/js/libs/uuid/index.js | 14 + .../assets/js/libs/uuid/max.d.ts | 2 + .../assets/js/libs/uuid/max.js | 1 + .../assets/js/libs/uuid/md5.d.ts | 2 + .../assets/js/libs/uuid/md5.js | 135 ++++ .../assets/js/libs/uuid/nil.d.ts | 2 + .../assets/js/libs/uuid/nil.js | 1 + .../assets/js/libs/uuid/parse.d.ts | 3 + .../assets/js/libs/uuid/parse.js | 9 + .../assets/js/libs/uuid/regex.d.ts | 2 + .../assets/js/libs/uuid/regex.js | 1 + .../assets/js/libs/uuid/rng.d.ts | 1 + .../assets/js/libs/uuid/rng.js | 4 + .../assets/js/libs/uuid/sha1.d.ts | 2 + .../assets/js/libs/uuid/sha1.js | 70 ++ .../assets/js/libs/uuid/stringify.d.ts | 3 + .../assets/js/libs/uuid/stringify.js | 35 + .../assets/js/libs/uuid/types.d.ts | 22 + .../assets/js/libs/uuid/types.js | 1 + .../assets/js/libs/uuid/uuid-bin.d.ts | 1 + .../assets/js/libs/uuid/uuid-bin.js | 70 ++ .../assets/js/libs/uuid/v1.d.ts | 11 + .../assets/js/libs/uuid/v1.js | 87 +++ .../assets/js/libs/uuid/v1ToV6.d.ts | 3 + .../assets/js/libs/uuid/v1ToV6.js | 10 + .../assets/js/libs/uuid/v3.d.ts | 9 + .../assets/js/libs/uuid/v3.js | 9 + .../assets/js/libs/uuid/v35.d.ts | 7 + .../assets/js/libs/uuid/v35.js | 39 ++ .../assets/js/libs/uuid/v4.d.ts | 4 + .../assets/js/libs/uuid/v4.js | 29 + .../assets/js/libs/uuid/v5.d.ts | 9 + .../assets/js/libs/uuid/v5.js | 9 + .../assets/js/libs/uuid/v6.d.ts | 4 + .../assets/js/libs/uuid/v6.js | 20 + .../assets/js/libs/uuid/v6ToV1.d.ts | 2 + .../assets/js/libs/uuid/v6ToV1.js | 10 + .../assets/js/libs/uuid/v7.d.ts | 9 + .../assets/js/libs/uuid/v7.js | 68 ++ .../assets/js/libs/uuid/validate.d.ts | 2 + .../assets/js/libs/uuid/validate.js | 5 + .../assets/js/libs/uuid/version.d.ts | 2 + .../assets/js/libs/uuid/version.js | 8 + .../assets/js/main.js | 23 + .../assets/js/modules/Counter.js | 36 + .../webseite-html-js-bundled/index.html | 83 +++ .../package-lock.json | 660 ++++++++++++++++++ .../webseite-html-js-bundled/package.json | 17 + .../assets/js/libs/uuid/index.d.ts | 15 + .../assets/js/libs/uuid/index.js | 14 + .../assets/js/libs/uuid/max.d.ts | 2 + .../assets/js/libs/uuid/max.js | 1 + .../assets/js/libs/uuid/md5.d.ts | 2 + .../assets/js/libs/uuid/md5.js | 135 ++++ .../assets/js/libs/uuid/nil.d.ts | 2 + .../assets/js/libs/uuid/nil.js | 1 + .../assets/js/libs/uuid/parse.d.ts | 3 + .../assets/js/libs/uuid/parse.js | 9 + .../assets/js/libs/uuid/regex.d.ts | 2 + .../assets/js/libs/uuid/regex.js | 1 + .../assets/js/libs/uuid/rng.d.ts | 1 + .../assets/js/libs/uuid/rng.js | 4 + .../assets/js/libs/uuid/sha1.d.ts | 2 + .../assets/js/libs/uuid/sha1.js | 70 ++ .../assets/js/libs/uuid/stringify.d.ts | 3 + .../assets/js/libs/uuid/stringify.js | 35 + .../assets/js/libs/uuid/types.d.ts | 22 + .../assets/js/libs/uuid/types.js | 1 + .../assets/js/libs/uuid/uuid-bin.d.ts | 1 + .../assets/js/libs/uuid/uuid-bin.js | 70 ++ .../assets/js/libs/uuid/v1.d.ts | 11 + .../assets/js/libs/uuid/v1.js | 87 +++ .../assets/js/libs/uuid/v1ToV6.d.ts | 3 + .../assets/js/libs/uuid/v1ToV6.js | 10 + .../assets/js/libs/uuid/v3.d.ts | 9 + .../assets/js/libs/uuid/v3.js | 9 + .../assets/js/libs/uuid/v35.d.ts | 7 + .../assets/js/libs/uuid/v35.js | 39 ++ .../assets/js/libs/uuid/v4.d.ts | 4 + .../assets/js/libs/uuid/v4.js | 29 + .../assets/js/libs/uuid/v5.d.ts | 9 + .../assets/js/libs/uuid/v5.js | 9 + .../assets/js/libs/uuid/v6.d.ts | 4 + .../assets/js/libs/uuid/v6.js | 20 + .../assets/js/libs/uuid/v6ToV1.d.ts | 2 + .../assets/js/libs/uuid/v6ToV1.js | 10 + .../assets/js/libs/uuid/v7.d.ts | 9 + .../assets/js/libs/uuid/v7.js | 68 ++ .../assets/js/libs/uuid/validate.d.ts | 2 + .../assets/js/libs/uuid/validate.js | 5 + .../assets/js/libs/uuid/version.d.ts | 2 + .../assets/js/libs/uuid/version.js | 8 + .../webseite-html-js/assets/js/main.js | 23 + .../assets/js/modules/Counter.js | 36 + .../01_counter/webseite-html-js/index.html | 83 +++ .../webseite-html-js/package-lock.json | 660 ++++++++++++++++++ .../01_counter/webseite-html-js/package.json | 17 + 111 files changed, 3878 insertions(+), 24 deletions(-) create mode 100644 04_typescript/projects/typescript-ecom-manager-template.zip create mode 100644 04_typescript/projects/typescript-task-manager-template.zip create mode 100644 06_js-debug/unterricht/tag47/qwen-vs-codex/codex/index.html create mode 100644 06_js-debug/unterricht/tag47/qwen-vs-codex/codex/script.js create mode 100644 06_js-debug/unterricht/tag47/qwen-vs-codex/codex/style.css create mode 100644 06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/css/style.css create mode 100644 06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/js/script.js create mode 100644 06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/index.html create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/main.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/modules/Counter.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/index.html create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package-lock.json create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package.json create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.d.ts create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/main.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package-lock.json create mode 100644 06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package.json diff --git a/04_typescript/projects/typescript-ecom-manager-template.zip b/04_typescript/projects/typescript-ecom-manager-template.zip new file mode 100644 index 0000000000000000000000000000000000000000..52b511fb96737eeb848d71712a509d36db542e80 GIT binary patch literal 35367 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%0Ddu!tKUCnxpi|m zP4JV~z;G;h*saDsSl{C0dLREf_!wyD>ps{wp0Fz}9c+Fb4qgAstB{QTL#{hM%R=A$ z!B%uAK5Rvohl%=h@BsuLewTk2AcYa|LTm6YSz9yo7hdI1&{!Me7 zOc-d}3w!7&1>>6%u$46&=75&uFIf?u)5T-5)zR&a(ho9ZIG)5H--Utiu=ATZD3J3P S1O#@-uPWqB@r4ugzyAR>)Z&u> literal 0 HcmV?d00001 diff --git a/04_typescript/projects/typescript-task-manager-template.zip b/04_typescript/projects/typescript-task-manager-template.zip new file mode 100644 index 0000000000000000000000000000000000000000..af312aacb7c38877a57a47f184c0cd93be3b871d GIT binary patch literal 16493 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 sum + num, 0); + const average = total / numbers.length; + return average; +} + +console.log(calculateAverage([10, 20, 30])); // => 20 +console.log(calculateAverage([5, 15, 25, 35])); // => 20 diff --git a/06_js-debug/uebungen/u12_find-maximum-error/solution.js b/06_js-debug/uebungen/u12_find-maximum-error/solution.js index e69de29..e0fd795 100644 --- a/06_js-debug/uebungen/u12_find-maximum-error/solution.js +++ b/06_js-debug/uebungen/u12_find-maximum-error/solution.js @@ -0,0 +1,40 @@ +// logical error + +function findMaximum(a, b, c) { + if (a >= b && a >= c) { + return a; + } else if (b >= a && b >= c) { + return b; + } else { + return c; + } +} + +const findMaximum2 = (...numbers) => { + return numbers.reduce((max, current) => { + if (current > max) return current; + else return max; + }); +}; + +const findMaximum3 = (...numbers) => { + return Math.max(...numbers); +}; + +console.time('if else'); +console.log(findMaximum(1, 2, 3)); // => 3 +console.log(findMaximum(102, 59, 18)); // => 102 +console.log(findMaximum(532, 532, 345)); // => 532 +console.timeEnd('if else'); + +console.time('reduce'); +console.log(findMaximum2(1, 2, 3)); // => 3 +console.log(findMaximum2(102, 59, 18)); // => 102 +console.log(findMaximum2(532, 532, 345)); // => 532 +console.timeEnd('reduce'); + +console.time('Math.max'); +console.log(findMaximum3(1, 2, 3)); // => 3 +console.log(findMaximum3(102, 59, 18)); // => 102 +console.log(findMaximum3(532, 532, 345)); // => 532 +console.timeEnd('Math.max'); diff --git a/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js b/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js index a9e0d8d..bc6de3e 100644 --- a/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js +++ b/06_js-debug/uebungen/u13_temp-converter/assets/js/main.js @@ -1,17 +1,47 @@ 'use strict'; (() => { - // === DOM & VARS ======= - const DOM = {}; + // ===== DOM ===== + const DOM = { + temperatureForm: document.querySelector('#temperatureForm'), + celsiusInput: document.querySelector('#celsius'), + result: document.querySelector('#result'), + }; - // === INIT ============= - const init = () => {}; + // ===== INIT ===== + const init = () => { + DOM.temperatureForm.addEventListener('submit', handleFormSubmit); + }; - // === EVENTHANDLER ===== + // ===== EVENT HANDLERS ===== + function handleFormSubmit(e) { + e.preventDefault(); // Standardverhalten unterbinden + const celsius = Number(DOM.celsiusInput.value); - // === XHR/FETCH ======== + // falsche Verneinung + if (isNaN(celsius)) { + alert('Please enter a valid number'); + return; + } - // === FUNCTIONS ======== + const fahrenheit = convertToFahrenheit(celsius); + displayResult(fahrenheit); + + DOM.temperatureForm.reset(); + } + + // ===== FUNCTIONS ===== + function convertToFahrenheit(celsius) { + if (typeof celsius !== 'number') return NaN; + + return (celsius * 9) / 5 + 32; + } + + function displayResult(result) { + DOM.result.textContent = result.toFixed(2); + } + + // ===== CALL INIT ===== init(); })(); diff --git a/06_js-debug/uebungen/u14_counter-error/index.html b/06_js-debug/uebungen/u14_counter-error/index.html index 3018487..329ef8f 100644 --- a/06_js-debug/uebungen/u14_counter-error/index.html +++ b/06_js-debug/uebungen/u14_counter-error/index.html @@ -8,15 +8,17 @@
-

Counter

+
+

Counter

-
-
-
- Count: - +
+
+
+ Count: + +
+
-
@@ -38,8 +40,8 @@ // ===== EVENT HANDLER ===== function onClickIncrement() { - let count = counter.count; - count++; + let count = ++counter.count; + // count++; countEl.value = counter.count; } diff --git a/06_js-debug/uebungen/u14_counter-error/solution.html b/06_js-debug/uebungen/u14_counter-error/solution.html index 84fbc04..c46c690 100644 --- a/06_js-debug/uebungen/u14_counter-error/solution.html +++ b/06_js-debug/uebungen/u14_counter-error/solution.html @@ -1,4 +1,4 @@ - + @@ -25,18 +25,33 @@ 'use strict'; (() => { - // === DOM & VARS ======= - const DOM = {}; + // ===== DOM & VARS ===== + const countEl = document.querySelector('#count'); + const btnEl = document.querySelector('#incrementButton'); - // === INIT ============= - const init = () => {}; + let counter = { count: 0 }; - // === EVENTHANDLER ===== + // ===== INIT ===== + const init = () => { + btnEl.addEventListener('click', onClickIncrement); + }; - // === XHR/FETCH ======== + // ===== EVENT HANDLER ===== + function onClickIncrement() { + // variante 1 + // let count = counter.count; + // count++; + // counter = { count: count }; - // === FUNCTIONS ======== + // Variante 2 + // counter = { count: ++counter.count }; // hier ist der präfix-inkrement wichtig - der post-inkrement würde ins "leere" gehen, da er erst zugewiesen wird und dann erhöht und diese somit verloren ginge + // Variante 3 - direkt counter.count erhöhren + counter.count++; + countEl.value = counter.count; + } + + // ===== CALL INIT ===== init(); })(); diff --git a/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/index.html b/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/index.html new file mode 100644 index 0000000..9295971 --- /dev/null +++ b/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/index.html @@ -0,0 +1,44 @@ + + + + + + + AI Assistant (Test) + + + + +
+
+ +
+

AI Assistant (Test)

+

Online · Test environment

+
+
+ +
+
+ +
Hello! The test assistant is online and ready.
+
+ +
+
Run a quick systems check.
+
+ +
+ +
All interface systems are operational. Send a message to continue.
+
+
+ +
+ + + +
+
+ + diff --git a/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/script.js b/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/script.js new file mode 100644 index 0000000..30c183f --- /dev/null +++ b/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/script.js @@ -0,0 +1,60 @@ +"use strict"; + +const chatForm = document.getElementById("chatForm"); +const messageInput = document.getElementById("messageInput"); +const messageLog = document.getElementById("messageLog"); + +const mockResponses = [ + "Mock response received. Systems operational.", + "Test message acknowledged.", + "Processing complete. Everything looks good.", + "Your message has been logged successfully.", + "Simulation active. Ready for the next command." +]; + +function scrollToBottom() { + messageLog.scrollTop = messageLog.scrollHeight; +} + +function appendMessage(text, sender) { + const row = document.createElement("div"); + row.className = `message-row ${sender}`; + + if (sender === "assistant") { + const avatar = document.createElement("div"); + avatar.className = "avatar"; + avatar.setAttribute("aria-hidden", "true"); + avatar.textContent = "AI"; + row.appendChild(avatar); + } + + const bubble = document.createElement("div"); + bubble.className = "bubble"; + bubble.textContent = text; + + row.appendChild(bubble); + messageLog.appendChild(row); + scrollToBottom(); +} + +chatForm.addEventListener("submit", (event) => { + event.preventDefault(); + + const message = messageInput.value.trim(); + if (!message) { + messageInput.focus(); + return; + } + + appendMessage(message, "user"); + messageInput.value = ""; + messageInput.focus(); + + window.setTimeout(() => { + const randomIndex = Math.floor(Math.random() * mockResponses.length); + appendMessage(mockResponses[randomIndex], "assistant"); + }, 1000); +}); + +scrollToBottom(); +messageInput.focus(); diff --git a/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/style.css b/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/style.css new file mode 100644 index 0000000..83095b4 --- /dev/null +++ b/06_js-debug/unterricht/tag47/qwen-vs-codex/codex/style.css @@ -0,0 +1,285 @@ +:root { + color-scheme: dark; + --background: #070b14; + --panel: #111827; + --panel-soft: #182235; + --border: rgba(148, 163, 184, 0.16); + --text: #f8fafc; + --muted: #94a3b8; + --cyan: #22d3ee; + --blue: #2563eb; +} + +* { + box-sizing: border-box; +} + +body { + min-height: 100vh; + margin: 0; + display: grid; + place-items: center; + padding: 20px; + overflow: hidden; + color: var(--text); + font-family: + Inter, + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + sans-serif; + background: + radial-gradient(circle at 20% 15%, rgba(37, 99, 235, 0.15), transparent 32%), + radial-gradient(circle at 80% 85%, rgba(34, 211, 238, 0.11), transparent 30%), var(--background); +} + +.chat-window { + width: min(100%, 460px); + height: min(600px, calc(100vh - 40px)); + display: flex; + flex-direction: column; + overflow: hidden; + border: 1px solid var(--border); + border-radius: 24px; + background: rgba(17, 24, 39, 0.94); + box-shadow: + 0 30px 80px rgba(0, 0, 0, 0.55), + 0 0 40px rgba(34, 211, 238, 0.06); + backdrop-filter: blur(18px); +} + +.chat-header { + flex: 0 0 auto; + display: flex; + align-items: center; + gap: 12px; + min-height: 76px; + padding: 16px 20px; + border-bottom: 1px solid var(--border); + background: rgba(15, 23, 42, 0.82); +} + +.header-icon, +.avatar { + display: grid; + place-items: center; + flex: 0 0 auto; + color: #06101b; + font-weight: 800; + background: linear-gradient(135deg, var(--cyan), #60a5fa); + box-shadow: 0 0 20px rgba(34, 211, 238, 0.28); +} + +.header-icon { + width: 42px; + height: 42px; + border-radius: 14px; + font-size: 20px; +} + +.header-copy { + min-width: 0; +} + +.header-copy h1 { + margin: 0; + overflow: hidden; + font-size: 16px; + letter-spacing: 0.01em; + text-overflow: ellipsis; + white-space: nowrap; +} + +.status { + display: flex; + align-items: center; + gap: 7px; + margin: 4px 0 0; + color: var(--muted); + font-size: 12px; +} + +.status-dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: #34d399; + box-shadow: 0 0 10px #34d399; +} + +.message-log { + flex: 1 1 auto; + min-height: 0; + overflow-y: auto; + padding: 22px 18px; + scroll-behavior: smooth; + scrollbar-color: #334155 transparent; + scrollbar-width: thin; +} + +.message-log::-webkit-scrollbar { + width: 6px; +} + +.message-log::-webkit-scrollbar-thumb { + border-radius: 999px; + background: #334155; +} + +.message-row { + display: flex; + align-items: flex-end; + gap: 9px; + margin-bottom: 16px; + animation: appear 180ms ease-out; +} + +.message-row.user { + justify-content: flex-end; +} + +.avatar { + width: 30px; + height: 30px; + border-radius: 10px; + font-size: 13px; +} + +.bubble { + max-width: 78%; + padding: 11px 14px; + overflow-wrap: anywhere; + border: 1px solid var(--border); + border-radius: 17px 17px 17px 5px; + color: #e2e8f0; + font-size: 14px; + line-height: 1.48; + background: var(--panel-soft); + box-shadow: 0 8px 18px rgba(0, 0, 0, 0.15); +} + +.user .bubble { + border: 0; + border-radius: 17px 17px 5px 17px; + color: white; + background: linear-gradient(135deg, #0891b2, var(--blue)); + box-shadow: 0 8px 22px rgba(37, 99, 235, 0.24); +} + +.input-bar { + flex: 0 0 auto; + display: flex; + gap: 10px; + padding: 15px; + border-top: 1px solid var(--border); + background: rgba(15, 23, 42, 0.92); +} + +.input-bar input { + min-width: 0; + flex: 1; + height: 46px; + padding: 0 15px; + border: 1px solid #334155; + border-radius: 14px; + outline: none; + color: var(--text); + font: inherit; + background: #0b1220; + transition: + border-color 160ms ease, + box-shadow 160ms ease; +} + +.input-bar input::placeholder { + color: #64748b; +} + +.input-bar input:focus { + border-color: var(--cyan); + box-shadow: 0 0 0 3px rgba(34, 211, 238, 0.12); +} + +.input-bar button { + height: 46px; + padding: 0 19px; + border: 0; + border-radius: 14px; + cursor: pointer; + color: #03131d; + font: inherit; + font-weight: 800; + background: linear-gradient(135deg, #67e8f9, #38bdf8); + box-shadow: 0 8px 22px rgba(34, 211, 238, 0.2); + transition: + transform 140ms ease, + filter 140ms ease; +} + +.input-bar button:hover { + filter: brightness(1.08); + transform: translateY(-1px); +} + +.input-bar button:active { + transform: translateY(1px); +} + +.input-bar button:focus-visible, +.input-bar input:focus-visible { + outline: 2px solid var(--cyan); + outline-offset: 2px; +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +@keyframes appear { + from { + opacity: 0; + transform: translateY(6px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@media (max-width: 480px) { + body { + padding: 0; + } + + .chat-window { + width: 100%; + height: 100vh; + height: 100dvh; + border: 0; + border-radius: 0; + } + + .bubble { + max-width: 84%; + } +} + +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + scroll-behavior: auto !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} diff --git a/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/css/style.css b/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/css/style.css new file mode 100644 index 0000000..d61cc9b --- /dev/null +++ b/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/css/style.css @@ -0,0 +1,136 @@ +/* style.css */ +body { + margin: 0; + padding: 0; + background-color: #1e1e1e; + color: white; + font-family: 'Segoe UI', sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +} + +.chat-container { + width: 480px; + height: 600px; + background-color: #2c2c2c; + border-radius: 16px; + box-shadow: 0 0 20px rgba(0, 123, 255, 0.3); + display: flex; + flex-direction: column; + overflow: hidden; +} + +.chat-container .chat-header { + padding: 16px; + background-color: #3c3c3c; + color: #00bfff; + font-size: 18px; + font-weight: bold; + text-align: center; + border-bottom: 1px solid #4c4c4c; +} + +.chat-container .chat-body { + flex: 1; + padding: 16px; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 12px; +} + +.chat-container .message { + display: flex; + align-items: start; + gap: 10px; +} + +.chat-container .message.user { + justify-content: flex-end; +} + +.chat-container .message.user .text { + background-color: #00bfff; + color: white; + padding: 12px 16px; + border-radius: 18px; + max-width: 70%; + margin-left: auto; + position: relative; + animation: fadeIn 0.3s ease; +} + +.chat-container .message.assistant { + justify-content: flex-start; +} + +.chat-container .message.assistant .avatar { + background-color: #3c3c3c; + color: #00bfff; + border-radius: 50%; + width: 36px; + height: 36px; + display: flex; + align-items: center; + justify-content: center; + font-size: 20px; + flex-shrink: 0; +} + +.chat-container .message.assistant .text { + background-color: #2c2c2c; + color: #ccc; + padding: 12px 16px; + border-radius: 18px; + max-width: 70%; + margin-right: auto; + position: relative; + animation: fadeIn 0.3s ease; +} + +.chat-container .chat-input { + display: flex; + gap: 8px; + padding: 12px; + background-color: #3c3c3c; + border-top: 1px solid #4c4c4c; +} + +.chat-container .chat-input input { + flex: 1; + padding: 10px 12px; + border: none; + border-radius: 20px; + background-color: #3c3c3c; + color: white; + outline: none; + font-size: 14px; +} + +.chat-container .chat-input button { + padding: 10px 20px; + border: none; + border-radius: 20px; + background-color: #00bfff; + color: white; + font-weight: bold; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.chat-container .chat-input button:hover { + background-color: #009ddc; +} + +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} diff --git a/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/js/script.js b/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/js/script.js new file mode 100644 index 0000000..7e55a5a --- /dev/null +++ b/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/assets/js/script.js @@ -0,0 +1,59 @@ +// script.js +document.addEventListener('DOMContentLoaded', () => { + const chatBody = document.getElementById('chatBody'); + const chatForm = document.getElementById('chatForm'); + const userInput = document.getElementById('userInput'); + + const mockResponses = [ + 'Mock response received. Systems operational.', + 'Test message acknowledged.', + "I'm here to help with any questions you may have.", + 'Let me look that up for you...', + 'Would you like me to provide more details?', + ]; + + function addMessage(text, isUser = false) { + const messageDiv = document.createElement('div'); + messageDiv.classList.add('message', isUser ? 'user' : 'assistant'); + + if (!isUser) { + const avatar = document.createElement('div'); + avatar.classList.add('avatar'); + avatar.textContent = '🤖'; + messageDiv.appendChild(avatar); + } + + const textDiv = document.createElement('div'); + textDiv.classList.add('text'); + textDiv.textContent = text; + messageDiv.appendChild(textDiv); + + chatBody.appendChild(messageDiv); + chatBody.scrollTop = chatBody.scrollHeight; + userInput.focus(); + } + + function handleSubmit(e) { + e.preventDefault(); + const inputText = userInput.value.trim(); + + if (inputText) { + addMessage(inputText, true); + userInput.value = ''; + + setTimeout(() => { + const randomIndex = Math.floor(Math.random() * mockResponses.length); + addMessage(mockResponses[randomIndex]); + }, 1000); + } + } + + chatForm.addEventListener('submit', handleSubmit); + + // Handle Enter key + userInput.addEventListener('keydown', (e) => { + if (e.key === 'Enter') { + handleSubmit(e); + } + }); +}); diff --git a/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/index.html b/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/index.html new file mode 100644 index 0000000..9cebbd0 --- /dev/null +++ b/06_js-debug/unterricht/tag47/qwen-vs-codex/qwen3.5/index.html @@ -0,0 +1,33 @@ + + + + + + + AI Chat + + + + +
+
AI Assistant (Test)
+
+
+
🤖
+
Hello! How can I assist you today?
+
+
+
Hi, can you help me with something?
+
+
+
🤖
+
Of course! What would you like help with?
+
+
+
+ + +
+
+ + diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.d.ts new file mode 100644 index 0000000..b01542d --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.d.ts @@ -0,0 +1,15 @@ +export { default as MAX } from './max.js'; +export { default as NIL } from './nil.js'; +export { default as parse } from './parse.js'; +export { default as stringify } from './stringify.js'; +export type * from './types.js'; +export { default as v1 } from './v1.js'; +export { default as v1ToV6 } from './v1ToV6.js'; +export { default as v3 } from './v3.js'; +export { default as v4 } from './v4.js'; +export { default as v5 } from './v5.js'; +export { default as v6 } from './v6.js'; +export { default as v6ToV1 } from './v6ToV1.js'; +export { default as v7 } from './v7.js'; +export { default as validate } from './validate.js'; +export { default as version } from './version.js'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.js new file mode 100644 index 0000000..3193e9a --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/index.js @@ -0,0 +1,14 @@ +export { default as MAX } from './max.js'; +export { default as NIL } from './nil.js'; +export { default as parse } from './parse.js'; +export { default as stringify } from './stringify.js'; +export { default as v1 } from './v1.js'; +export { default as v1ToV6 } from './v1ToV6.js'; +export { default as v3 } from './v3.js'; +export { default as v4 } from './v4.js'; +export { default as v5 } from './v5.js'; +export { default as v6 } from './v6.js'; +export { default as v6ToV1 } from './v6ToV1.js'; +export { default as v7 } from './v7.js'; +export { default as validate } from './validate.js'; +export { default as version } from './version.js'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.d.ts new file mode 100644 index 0000000..7a1e972 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.d.ts @@ -0,0 +1,2 @@ +declare const _default: "ffffffff-ffff-ffff-ffff-ffffffffffff"; +export default _default; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.js new file mode 100644 index 0000000..58951f6 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/max.js @@ -0,0 +1 @@ +export default 'ffffffff-ffff-ffff-ffff-ffffffffffff'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.d.ts new file mode 100644 index 0000000..5a55f51 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.d.ts @@ -0,0 +1,2 @@ +declare function md5(bytes: Uint8Array): Uint8Array; +export default md5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.js new file mode 100644 index 0000000..053301d --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/md5.js @@ -0,0 +1,135 @@ +function md5(bytes) { + const words = uint8ToUint32(bytes); + const md5Bytes = wordsToMd5(words, bytes.length * 8); + return uint32ToUint8(md5Bytes); +} +function uint32ToUint8(input) { + const bytes = new Uint8Array(input.length * 4); + for (let i = 0; i < input.length * 4; i++) { + bytes[i] = (input[i >> 2] >>> ((i % 4) * 8)) & 0xff; + } + return bytes; +} +function getOutputLength(inputLength8) { + return (((inputLength8 + 64) >>> 9) << 4) + 14 + 1; +} +function wordsToMd5(x, len) { + const xpad = new Uint32Array(getOutputLength(len)).fill(0); + xpad.set(x); + xpad[len >> 5] |= 0x80 << (len % 32); + xpad[xpad.length - 1] = len; + x = xpad; + let a = 1732584193; + let b = -271733879; + let c = -1732584194; + let d = 271733878; + for (let i = 0; i < x.length; i += 16) { + const olda = a; + const oldb = b; + const oldc = c; + const oldd = d; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + return Uint32Array.of(a, b, c, d); +} +function uint8ToUint32(input) { + if (input.length === 0) { + return new Uint32Array(); + } + const output = new Uint32Array(getOutputLength(input.length * 8)).fill(0); + for (let i = 0; i < input.length; i++) { + output[i >> 2] |= (input[i] & 0xff) << ((i % 4) * 8); + } + return output; +} +function safeAdd(x, y) { + const lsw = (x & 0xffff) + (y & 0xffff); + const msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); +} +function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); +} +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} +function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | (~b & d), a, b, x, s, t); +} +function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & ~d), a, b, x, s, t); +} +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t); +} +export default md5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.d.ts new file mode 100644 index 0000000..b03bb98 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.d.ts @@ -0,0 +1,2 @@ +declare const _default: "00000000-0000-0000-0000-000000000000"; +export default _default; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.js new file mode 100644 index 0000000..de6f830 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/nil.js @@ -0,0 +1 @@ +export default '00000000-0000-0000-0000-000000000000'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.d.ts new file mode 100644 index 0000000..e2e31ac --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.d.ts @@ -0,0 +1,3 @@ +import type { NonSharedArrayBuffer } from './types.js'; +declare function parse(uuid: string): NonSharedArrayBuffer; +export default parse; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.js new file mode 100644 index 0000000..64ac401 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/parse.js @@ -0,0 +1,9 @@ +import validate from './validate.js'; +function parse(uuid) { + if (!validate(uuid)) { + throw TypeError('Invalid UUID'); + } + let v; + return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff); +} +export default parse; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.d.ts new file mode 100644 index 0000000..d39fa3f --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.d.ts @@ -0,0 +1,2 @@ +declare const _default: RegExp; +export default _default; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.js new file mode 100644 index 0000000..3e38591 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/regex.js @@ -0,0 +1 @@ +export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.d.ts new file mode 100644 index 0000000..73e60cf --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.d.ts @@ -0,0 +1 @@ +export default function rng(): Uint8Array; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.js new file mode 100644 index 0000000..0511e89 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/rng.js @@ -0,0 +1,4 @@ +const rnds8 = new Uint8Array(16); +export default function rng() { + return crypto.getRandomValues(rnds8); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.d.ts new file mode 100644 index 0000000..a6552e5 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.d.ts @@ -0,0 +1,2 @@ +declare function sha1(bytes: Uint8Array): Uint8Array; +export default sha1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.js new file mode 100644 index 0000000..e0acfe3 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/sha1.js @@ -0,0 +1,70 @@ +function f(s, x, y, z) { + switch (s) { + case 0: + return (x & y) ^ (~x & z); + case 1: + return x ^ y ^ z; + case 2: + return (x & y) ^ (x & z) ^ (y & z); + case 3: + return x ^ y ^ z; + } +} +function ROTL(x, n) { + return (x << n) | (x >>> (32 - n)); +} +function sha1(bytes) { + const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + const newBytes = new Uint8Array(bytes.length + 1); + newBytes.set(bytes); + newBytes[bytes.length] = 0x80; + bytes = newBytes; + const l = bytes.length / 4 + 2; + const N = Math.ceil(l / 16); + const M = new Array(N); + for (let i = 0; i < N; ++i) { + const arr = new Uint32Array(16); + for (let j = 0; j < 16; ++j) { + arr[j] = + (bytes[i * 64 + j * 4] << 24) | + (bytes[i * 64 + j * 4 + 1] << 16) | + (bytes[i * 64 + j * 4 + 2] << 8) | + bytes[i * 64 + j * 4 + 3]; + } + M[i] = arr; + } + M[N - 1][14] = ((bytes.length - 1) * 8) / 2 ** 32; + M[N - 1][14] = Math.floor(M[N - 1][14]); + M[N - 1][15] = ((bytes.length - 1) * 8) & 0xffffffff; + for (let i = 0; i < N; ++i) { + const W = new Uint32Array(80); + for (let t = 0; t < 16; ++t) { + W[t] = M[i][t]; + } + for (let t = 16; t < 80; ++t) { + W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1); + } + let a = H[0]; + let b = H[1]; + let c = H[2]; + let d = H[3]; + let e = H[4]; + for (let t = 0; t < 80; ++t) { + const s = Math.floor(t / 20); + const T = (ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t]) >>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + H[0] = (H[0] + a) >>> 0; + H[1] = (H[1] + b) >>> 0; + H[2] = (H[2] + c) >>> 0; + H[3] = (H[3] + d) >>> 0; + H[4] = (H[4] + e) >>> 0; + } + return Uint8Array.of(H[0] >> 24, H[0] >> 16, H[0] >> 8, H[0], H[1] >> 24, H[1] >> 16, H[1] >> 8, H[1], H[2] >> 24, H[2] >> 16, H[2] >> 8, H[2], H[3] >> 24, H[3] >> 16, H[3] >> 8, H[3], H[4] >> 24, H[4] >> 16, H[4] >> 8, H[4]); +} +export default sha1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.d.ts new file mode 100644 index 0000000..16cb008 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.d.ts @@ -0,0 +1,3 @@ +export declare function unsafeStringify(arr: Uint8Array, offset?: number): string; +declare function stringify(arr: Uint8Array, offset?: number): string; +export default stringify; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.js new file mode 100644 index 0000000..962738c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/stringify.js @@ -0,0 +1,35 @@ +import validate from './validate.js'; +const byteToHex = []; +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).slice(1)); +} +export function unsafeStringify(arr, offset = 0) { + return (byteToHex[arr[offset + 0]] + + byteToHex[arr[offset + 1]] + + byteToHex[arr[offset + 2]] + + byteToHex[arr[offset + 3]] + + '-' + + byteToHex[arr[offset + 4]] + + byteToHex[arr[offset + 5]] + + '-' + + byteToHex[arr[offset + 6]] + + byteToHex[arr[offset + 7]] + + '-' + + byteToHex[arr[offset + 8]] + + byteToHex[arr[offset + 9]] + + '-' + + byteToHex[arr[offset + 10]] + + byteToHex[arr[offset + 11]] + + byteToHex[arr[offset + 12]] + + byteToHex[arr[offset + 13]] + + byteToHex[arr[offset + 14]] + + byteToHex[arr[offset + 15]]).toLowerCase(); +} +function stringify(arr, offset = 0) { + const uuid = unsafeStringify(arr, offset); + if (!validate(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + return uuid; +} +export default stringify; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.d.ts new file mode 100644 index 0000000..3d276b5 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.d.ts @@ -0,0 +1,22 @@ +export type UUIDTypes = string | TBuf; +export type Version1Options = { + node?: Uint8Array; + clockseq?: number; + random?: Uint8Array; + rng?: () => Uint8Array; + msecs?: number; + nsecs?: number; + _v6?: boolean; +}; +export type Version4Options = { + random?: Uint8Array; + rng?: () => Uint8Array; +}; +export type Version6Options = Version1Options; +export type Version7Options = { + random?: Uint8Array; + msecs?: number; + seq?: number; + rng?: () => Uint8Array; +}; +export type NonSharedArrayBuffer = ReturnType; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/types.js @@ -0,0 +1 @@ +export {}; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.js new file mode 100644 index 0000000..aa4d4ac --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/uuid-bin.js @@ -0,0 +1,70 @@ +import * as assert from 'node:assert/strict'; +import v1 from './v1.js'; +import v3 from './v3.js'; +import v4 from './v4.js'; +import v5 from './v5.js'; +import v6 from './v6.js'; +import v7 from './v7.js'; +function usage() { + console.log('Usage:'); + console.log(' uuid'); + console.log(' uuid v1'); + console.log(' uuid v3 '); + console.log(' uuid v4'); + console.log(' uuid v5 '); + console.log(' uuid v6'); + console.log(' uuid v7'); + console.log(' uuid --help'); + console.log('\nNote: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC9562'); +} +const args = process.argv.slice(2); +if (args.indexOf('--help') >= 0) { + usage(); + process.exit(0); +} +const version = args.shift() || 'v4'; +switch (version) { + case 'v1': + console.log(v1()); + break; + case 'v3': { + const name = args.shift(); + let namespace = args.shift(); + assert.ok(name != null, 'v3 name not specified'); + assert.ok(namespace != null, 'v3 namespace not specified'); + if (namespace === 'URL') { + namespace = v3.URL; + } + if (namespace === 'DNS') { + namespace = v3.DNS; + } + console.log(v3(name, namespace)); + break; + } + case 'v4': + console.log(v4()); + break; + case 'v5': { + const name = args.shift(); + let namespace = args.shift(); + assert.ok(name != null, 'v5 name not specified'); + assert.ok(namespace != null, 'v5 namespace not specified'); + if (namespace === 'URL') { + namespace = v5.URL; + } + if (namespace === 'DNS') { + namespace = v5.DNS; + } + console.log(v5(name, namespace)); + break; + } + case 'v6': + console.log(v6()); + break; + case 'v7': + console.log(v7()); + break; + default: + usage(); + process.exit(1); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.d.ts new file mode 100644 index 0000000..6744f00 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.d.ts @@ -0,0 +1,11 @@ +import type { Version1Options } from './types.js'; +type V1State = { + node?: Uint8Array; + clockseq?: number; + msecs?: number; + nsecs?: number; +}; +declare function v1(options?: Version1Options, buf?: undefined, offset?: number): string; +declare function v1(options: Version1Options | undefined, buf: Buf, offset?: number): Buf; +export declare function updateV1State(state: V1State, now: number, rnds: Uint8Array): V1State; +export default v1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.js new file mode 100644 index 0000000..aa70449 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1.js @@ -0,0 +1,87 @@ +import rng from './rng.js'; +import { unsafeStringify } from './stringify.js'; +const _state = {}; +function v1(options, buf, offset) { + let bytes; + const isV6 = options?._v6 ?? false; + if (options) { + const optionsKeys = Object.keys(options); + if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') { + options = undefined; + } + } + if (options) { + bytes = v1Bytes(options.random ?? options.rng?.() ?? rng(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset); + } + else { + const now = Date.now(); + const rnds = rng(); + updateV1State(_state, now, rnds); + bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset); + } + return buf ?? unsafeStringify(bytes); +} +export function updateV1State(state, now, rnds) { + state.msecs ??= -Infinity; + state.nsecs ??= 0; + if (now === state.msecs) { + state.nsecs++; + if (state.nsecs >= 10000) { + state.node = undefined; + state.nsecs = 0; + } + } + else if (now > state.msecs) { + state.nsecs = 0; + } + else if (now < state.msecs) { + state.node = undefined; + } + if (!state.node) { + state.node = rnds.slice(10, 16); + state.node[0] |= 0x01; + state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff; + } + state.msecs = now; + return state; +} +function v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + nsecs ??= 0; + clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff; + if (node == null) { + node = rnds.slice(10, 16); + node[0] |= 0x01; + } + msecs += 12219292800000; + const t = (msecs & 0xfffffff) * 10000 + nsecs; + const tl = t >>> 0; + buf[offset++] = (tl >>> 24) & 0xff; + buf[offset++] = (tl >>> 16) & 0xff; + buf[offset++] = (tl >>> 8) & 0xff; + buf[offset++] = tl & 0xff; + const tmh = (((msecs / 0x10000000) | 0) * 625 + ((t / 0x100000000) | 0)) & 0xfffffff; + buf[offset++] = (tmh >>> 8) & 0xff; + buf[offset++] = tmh & 0xff; + buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10; + buf[offset++] = (tmh >>> 16) & 0xff; + buf[offset++] = (clockseq >>> 8) | 0x80; + buf[offset++] = clockseq & 0xff; + for (let n = 0; n < 6; ++n) { + buf[offset++] = node[n]; + } + return buf; +} +export default v1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.d.ts new file mode 100644 index 0000000..67924d8 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.d.ts @@ -0,0 +1,3 @@ +import type { NonSharedArrayBuffer } from './types.js'; +export default function v1ToV6(uuid: string): string; +export default function v1ToV6(uuid: Uint8Array): NonSharedArrayBuffer; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.js new file mode 100644 index 0000000..da0f763 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v1ToV6.js @@ -0,0 +1,10 @@ +import parse from './parse.js'; +import { unsafeStringify } from './stringify.js'; +export default function v1ToV6(uuid) { + const v1Bytes = typeof uuid === 'string' ? parse(uuid) : uuid; + const v6Bytes = _v1ToV6(v1Bytes); + return typeof uuid === 'string' ? unsafeStringify(v6Bytes) : v6Bytes; +} +function _v1ToV6(v1Bytes) { + return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.d.ts new file mode 100644 index 0000000..c4142c7 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.d.ts @@ -0,0 +1,9 @@ +import type { UUIDTypes } from './types.js'; +export { DNS, URL } from './v35.js'; +declare function v3(value: string | Uint8Array, namespace: UUIDTypes, buf?: undefined, offset?: number): string; +declare function v3(value: string | Uint8Array, namespace: UUIDTypes, buf: TBuf, offset?: number): TBuf; +declare namespace v3 { + var DNS: string; + var URL: string; +} +export default v3; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.js new file mode 100644 index 0000000..b5c3781 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v3.js @@ -0,0 +1,9 @@ +import md5 from './md5.js'; +import v35, { DNS, URL } from './v35.js'; +export { DNS, URL } from './v35.js'; +function v3(value, namespace, buf, offset) { + return v35(0x30, md5, value, namespace, buf, offset); +} +v3.DNS = DNS; +v3.URL = URL; +export default v3; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.d.ts new file mode 100644 index 0000000..05d0fb5 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.d.ts @@ -0,0 +1,7 @@ +import type { UUIDTypes } from './types.js'; +export declare function stringToBytes(str: string): Uint8Array; +export declare const DNS = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"; +export declare const URL = "6ba7b811-9dad-11d1-80b4-00c04fd430c8"; +type HashFunction = (bytes: Uint8Array) => Uint8Array; +export default function v35(version: 0x30 | 0x50, hash: HashFunction, value: string | Uint8Array, namespace: UUIDTypes, buf?: TBuf, offset?: number): UUIDTypes; +export {}; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.js new file mode 100644 index 0000000..8c5fc66 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v35.js @@ -0,0 +1,39 @@ +import parse from './parse.js'; +import { unsafeStringify } from './stringify.js'; +export function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); + const bytes = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} +export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +export default function v35(version, hash, value, namespace, buf, offset) { + const valueBytes = typeof value === 'string' ? stringToBytes(value) : value; + const namespaceBytes = typeof namespace === 'string' ? parse(namespace) : namespace; + if (typeof namespace === 'string') { + namespace = parse(namespace); + } + if (namespace?.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } + let bytes = new Uint8Array(16 + valueBytes.length); + bytes.set(namespaceBytes); + bytes.set(valueBytes, namespaceBytes.length); + bytes = hash(bytes); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + if (buf) { + offset ??= 0; + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return unsafeStringify(bytes); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.d.ts new file mode 100644 index 0000000..f131da7 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.d.ts @@ -0,0 +1,4 @@ +import type { Version4Options } from './types.js'; +declare function v4(options?: Version4Options, buf?: undefined, offset?: number): string; +declare function v4(options: Version4Options | undefined, buf: TBuf, offset?: number): TBuf; +export default v4; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.js new file mode 100644 index 0000000..b3017c9 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v4.js @@ -0,0 +1,29 @@ +import rng from './rng.js'; +import { unsafeStringify } from './stringify.js'; +function v4(options, buf, offset) { + if (!buf && !options && crypto.randomUUID) { + return crypto.randomUUID(); + } + return _v4(options, buf, offset); +} +function _v4(options, buf, offset) { + options = options || {}; + const rnds = options.random ?? options.rng?.() ?? rng(); + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + if (buf) { + offset = offset || 0; + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + return buf; + } + return unsafeStringify(rnds); +} +export default v4; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.d.ts new file mode 100644 index 0000000..3e7011e --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.d.ts @@ -0,0 +1,9 @@ +import type { UUIDTypes } from './types.js'; +export { DNS, URL } from './v35.js'; +declare function v5(value: string | Uint8Array, namespace: UUIDTypes, buf?: undefined, offset?: number): string; +declare function v5(value: string | Uint8Array, namespace: UUIDTypes, buf: TBuf, offset?: number): TBuf; +declare namespace v5 { + var DNS: string; + var URL: string; +} +export default v5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.js new file mode 100644 index 0000000..bd470a4 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v5.js @@ -0,0 +1,9 @@ +import sha1 from './sha1.js'; +import v35, { DNS, URL } from './v35.js'; +export { DNS, URL } from './v35.js'; +function v5(value, namespace, buf, offset) { + return v35(0x50, sha1, value, namespace, buf, offset); +} +v5.DNS = DNS; +v5.URL = URL; +export default v5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.d.ts new file mode 100644 index 0000000..68f8e7c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.d.ts @@ -0,0 +1,4 @@ +import type { Version6Options } from './types.js'; +declare function v6(options?: Version6Options, buf?: undefined, offset?: number): string; +declare function v6(options: Version6Options | undefined, buf: TBuf, offset?: number): TBuf; +export default v6; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.js new file mode 100644 index 0000000..bd1fc35 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6.js @@ -0,0 +1,20 @@ +import { unsafeStringify } from './stringify.js'; +import v1 from './v1.js'; +import v1ToV6 from './v1ToV6.js'; +function v6(options, buf, offset) { + options ??= {}; + offset ??= 0; + let bytes = v1({ ...options, _v6: true }, new Uint8Array(16)); + bytes = v1ToV6(bytes); + if (buf) { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; i++) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return unsafeStringify(bytes); +} +export default v6; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.d.ts new file mode 100644 index 0000000..3b3ffc2 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.d.ts @@ -0,0 +1,2 @@ +export default function v6ToV1(uuid: string): string; +export default function v6ToV1(uuid: Uint8Array): Uint8Array; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.js new file mode 100644 index 0000000..bfd942f --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v6ToV1.js @@ -0,0 +1,10 @@ +import parse from './parse.js'; +import { unsafeStringify } from './stringify.js'; +export default function v6ToV1(uuid) { + const v6Bytes = typeof uuid === 'string' ? parse(uuid) : uuid; + const v1Bytes = _v6ToV1(v6Bytes); + return typeof uuid === 'string' ? unsafeStringify(v1Bytes) : v1Bytes; +} +function _v6ToV1(v6Bytes) { + return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.d.ts new file mode 100644 index 0000000..f77dfca --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.d.ts @@ -0,0 +1,9 @@ +import type { Version7Options } from './types.js'; +type V7State = { + msecs?: number; + seq?: number; +}; +declare function v7(options?: Version7Options, buf?: undefined, offset?: number): string; +declare function v7(options: Version7Options | undefined, buf: TBuf, offset?: number): TBuf; +export declare function updateV7State(state: V7State, now: number, rnds: Uint8Array): V7State; +export default v7; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.js new file mode 100644 index 0000000..a3a68f8 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/v7.js @@ -0,0 +1,68 @@ +import rng from './rng.js'; +import { unsafeStringify } from './stringify.js'; +const _state = {}; +function v7(options, buf, offset) { + let bytes; + if (options) { + bytes = v7Bytes(options.random ?? options.rng?.() ?? rng(), options.msecs, options.seq, buf, offset); + } + else { + const now = Date.now(); + const rnds = rng(); + updateV7State(_state, now, rnds); + bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset); + } + return buf ?? unsafeStringify(bytes); +} +export function updateV7State(state, now, rnds) { + state.msecs ??= -Infinity; + state.seq ??= 0; + if (now > state.msecs) { + state.seq = v7Sequence(rnds); + state.msecs = now; + } + else { + state.seq = (state.seq + 1) | 0; + if (state.seq === 0) { + state.msecs++; + } + } + return state; +} +function v7Bytes(rnds, msecs, seq, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + seq ??= v7Sequence(rnds); + buf[offset++] = (msecs / 0x10000000000) & 0xff; + buf[offset++] = (msecs / 0x100000000) & 0xff; + buf[offset++] = (msecs / 0x1000000) & 0xff; + buf[offset++] = (msecs / 0x10000) & 0xff; + buf[offset++] = (msecs / 0x100) & 0xff; + buf[offset++] = msecs & 0xff; + buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f); + buf[offset++] = (seq >>> 20) & 0xff; + buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f); + buf[offset++] = (seq >>> 6) & 0xff; + buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03); + buf[offset++] = rnds[11]; + buf[offset++] = rnds[12]; + buf[offset++] = rnds[13]; + buf[offset++] = rnds[14]; + buf[offset++] = rnds[15]; + return buf; +} +function v7Sequence(rnds) { + return ((rnds[6] & 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9]; +} +export default v7; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.d.ts new file mode 100644 index 0000000..57da03d --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.d.ts @@ -0,0 +1,2 @@ +declare function validate(uuid: unknown): boolean; +export default validate; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.js new file mode 100644 index 0000000..444a1a2 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/validate.js @@ -0,0 +1,5 @@ +import REGEX from './regex.js'; +function validate(uuid) { + return typeof uuid === 'string' && REGEX.test(uuid); +} +export default validate; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.d.ts new file mode 100644 index 0000000..f1948dc --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.d.ts @@ -0,0 +1,2 @@ +declare function version(uuid: string): number; +export default version; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.js new file mode 100644 index 0000000..bae91d3 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/libs/uuid/version.js @@ -0,0 +1,8 @@ +import validate from './validate.js'; +function version(uuid) { + if (!validate(uuid)) { + throw TypeError('Invalid UUID'); + } + return parseInt(uuid.slice(14, 15), 16); +} +export default version; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/main.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/main.js new file mode 100644 index 0000000..3cf595f --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/main.js @@ -0,0 +1,23 @@ +import Counter from './modules/Counter.js'; // wichtig mit Dateiendung, da kein Bundler + +(() => { + // === DOM & VARS ======= + const DOM = { + counters: Array.from(document.querySelectorAll('.counter')), + }; + + // === INIT ============= + const init = () => { + DOM.counters.forEach((el) => { + Counter(el); + }); + }; + + // === EVENTHANDLER ===== + + // === XHR/FETCH ======== + + // === FUNCTIONS ======== + + init(); +})(); diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/modules/Counter.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/modules/Counter.js new file mode 100644 index 0000000..61c783c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/assets/js/modules/Counter.js @@ -0,0 +1,36 @@ +import v4 from '../libs/uuid/v4.js'; + +const Counter = (elOrSelector = null) => { + // ===== DOM & VARS ===== + + // TODO: forEach for string selector + const module = elOrSelector || document.querySelector(elOrSelector); + const countEl = module.querySelector('input[id^="count"]'); + const btnEl = module.querySelector('button[id^="incrementButton"]'); + + const id = v4(); + + countEl.id = `count-${id}`; + btnEl.id = `incrementButton-${id}`; + + // console.log('id:', id); + + let counter = { count: 0 }; + + // ===== INIT ===== + const init = () => { + btnEl.addEventListener('click', onClickIncrement); + }; + + // ===== EVENT HANDLER ===== + function onClickIncrement() { + let count = ++counter.count; + // count++; + countEl.value = counter.count; + } + + // ===== CALL INIT ===== + init(); +}; + +export default Counter; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/index.html b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/index.html new file mode 100644 index 0000000..7d39900 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/index.html @@ -0,0 +1,83 @@ + + + + + + Counter Example + + + + +
+
+
+
+
+

HERO

+
+
+
+
+
+
+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsum animi eaque doloremque error voluptate alias + dolorem esse qui voluptatum eius placeat unde consequuntur sequi dolor, repudiandae nobis. Excepturi, + dolores tenetur. +

+
+
+
+

Counter

+
+
+
+ Count: + +
+ +
+
+
+
+ +
+
+
+
+
+

© copyright 2026 Donkey-Coders

+
+
+
+
+

Counter

+
+
+
+ Count: + +
+ +
+
+
+
+ +
+
+
+ + diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package-lock.json b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package-lock.json new file mode 100644 index 0000000..6037535 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package-lock.json @@ -0,0 +1,660 @@ +{ + "name": "webseite-html", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "webseite-html", + "version": "1.0.0", + "dependencies": { + "uuid": "^14.0.2" + }, + "devDependencies": { + "http-server": "^14.1.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", + "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package.json b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package.json new file mode 100644 index 0000000..2e98540 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js-bundled/package.json @@ -0,0 +1,17 @@ +{ + "name": "webseite-html", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "npx http-server -c-1 -p 3000" + }, + "keywords": [], + "type": "commonjs", + "devDependencies": { + "http-server": "^14.1.1" + }, + "dependencies": { + "uuid": "^14.0.2" + } +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.d.ts new file mode 100644 index 0000000..b01542d --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.d.ts @@ -0,0 +1,15 @@ +export { default as MAX } from './max.js'; +export { default as NIL } from './nil.js'; +export { default as parse } from './parse.js'; +export { default as stringify } from './stringify.js'; +export type * from './types.js'; +export { default as v1 } from './v1.js'; +export { default as v1ToV6 } from './v1ToV6.js'; +export { default as v3 } from './v3.js'; +export { default as v4 } from './v4.js'; +export { default as v5 } from './v5.js'; +export { default as v6 } from './v6.js'; +export { default as v6ToV1 } from './v6ToV1.js'; +export { default as v7 } from './v7.js'; +export { default as validate } from './validate.js'; +export { default as version } from './version.js'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.js new file mode 100644 index 0000000..3193e9a --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/index.js @@ -0,0 +1,14 @@ +export { default as MAX } from './max.js'; +export { default as NIL } from './nil.js'; +export { default as parse } from './parse.js'; +export { default as stringify } from './stringify.js'; +export { default as v1 } from './v1.js'; +export { default as v1ToV6 } from './v1ToV6.js'; +export { default as v3 } from './v3.js'; +export { default as v4 } from './v4.js'; +export { default as v5 } from './v5.js'; +export { default as v6 } from './v6.js'; +export { default as v6ToV1 } from './v6ToV1.js'; +export { default as v7 } from './v7.js'; +export { default as validate } from './validate.js'; +export { default as version } from './version.js'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.d.ts new file mode 100644 index 0000000..7a1e972 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.d.ts @@ -0,0 +1,2 @@ +declare const _default: "ffffffff-ffff-ffff-ffff-ffffffffffff"; +export default _default; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.js new file mode 100644 index 0000000..58951f6 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/max.js @@ -0,0 +1 @@ +export default 'ffffffff-ffff-ffff-ffff-ffffffffffff'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.d.ts new file mode 100644 index 0000000..5a55f51 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.d.ts @@ -0,0 +1,2 @@ +declare function md5(bytes: Uint8Array): Uint8Array; +export default md5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.js new file mode 100644 index 0000000..053301d --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/md5.js @@ -0,0 +1,135 @@ +function md5(bytes) { + const words = uint8ToUint32(bytes); + const md5Bytes = wordsToMd5(words, bytes.length * 8); + return uint32ToUint8(md5Bytes); +} +function uint32ToUint8(input) { + const bytes = new Uint8Array(input.length * 4); + for (let i = 0; i < input.length * 4; i++) { + bytes[i] = (input[i >> 2] >>> ((i % 4) * 8)) & 0xff; + } + return bytes; +} +function getOutputLength(inputLength8) { + return (((inputLength8 + 64) >>> 9) << 4) + 14 + 1; +} +function wordsToMd5(x, len) { + const xpad = new Uint32Array(getOutputLength(len)).fill(0); + xpad.set(x); + xpad[len >> 5] |= 0x80 << (len % 32); + xpad[xpad.length - 1] = len; + x = xpad; + let a = 1732584193; + let b = -271733879; + let c = -1732584194; + let d = 271733878; + for (let i = 0; i < x.length; i += 16) { + const olda = a; + const oldb = b; + const oldc = c; + const oldd = d; + a = md5ff(a, b, c, d, x[i], 7, -680876936); + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5gg(b, c, d, a, x[i], 20, -373897302); + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5hh(d, a, b, c, x[i], 11, -358537222); + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651); + a = md5ii(a, b, c, d, x[i], 6, -198630844); + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551); + a = safeAdd(a, olda); + b = safeAdd(b, oldb); + c = safeAdd(c, oldc); + d = safeAdd(d, oldd); + } + return Uint32Array.of(a, b, c, d); +} +function uint8ToUint32(input) { + if (input.length === 0) { + return new Uint32Array(); + } + const output = new Uint32Array(getOutputLength(input.length * 8)).fill(0); + for (let i = 0; i < input.length; i++) { + output[i >> 2] |= (input[i] & 0xff) << ((i % 4) * 8); + } + return output; +} +function safeAdd(x, y) { + const lsw = (x & 0xffff) + (y & 0xffff); + const msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); +} +function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); +} +function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +} +function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | (~b & d), a, b, x, s, t); +} +function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & ~d), a, b, x, s, t); +} +function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t); +} +function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t); +} +export default md5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.d.ts new file mode 100644 index 0000000..b03bb98 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.d.ts @@ -0,0 +1,2 @@ +declare const _default: "00000000-0000-0000-0000-000000000000"; +export default _default; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.js new file mode 100644 index 0000000..de6f830 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/nil.js @@ -0,0 +1 @@ +export default '00000000-0000-0000-0000-000000000000'; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.d.ts new file mode 100644 index 0000000..e2e31ac --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.d.ts @@ -0,0 +1,3 @@ +import type { NonSharedArrayBuffer } from './types.js'; +declare function parse(uuid: string): NonSharedArrayBuffer; +export default parse; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.js new file mode 100644 index 0000000..64ac401 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/parse.js @@ -0,0 +1,9 @@ +import validate from './validate.js'; +function parse(uuid) { + if (!validate(uuid)) { + throw TypeError('Invalid UUID'); + } + let v; + return Uint8Array.of((v = parseInt(uuid.slice(0, 8), 16)) >>> 24, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff, (v = parseInt(uuid.slice(9, 13), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(14, 18), 16)) >>> 8, v & 0xff, (v = parseInt(uuid.slice(19, 23), 16)) >>> 8, v & 0xff, ((v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000) & 0xff, (v / 0x100000000) & 0xff, (v >>> 24) & 0xff, (v >>> 16) & 0xff, (v >>> 8) & 0xff, v & 0xff); +} +export default parse; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.d.ts new file mode 100644 index 0000000..d39fa3f --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.d.ts @@ -0,0 +1,2 @@ +declare const _default: RegExp; +export default _default; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.js new file mode 100644 index 0000000..3e38591 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/regex.js @@ -0,0 +1 @@ +export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.d.ts new file mode 100644 index 0000000..73e60cf --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.d.ts @@ -0,0 +1 @@ +export default function rng(): Uint8Array; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.js new file mode 100644 index 0000000..0511e89 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/rng.js @@ -0,0 +1,4 @@ +const rnds8 = new Uint8Array(16); +export default function rng() { + return crypto.getRandomValues(rnds8); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.d.ts new file mode 100644 index 0000000..a6552e5 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.d.ts @@ -0,0 +1,2 @@ +declare function sha1(bytes: Uint8Array): Uint8Array; +export default sha1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.js new file mode 100644 index 0000000..e0acfe3 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/sha1.js @@ -0,0 +1,70 @@ +function f(s, x, y, z) { + switch (s) { + case 0: + return (x & y) ^ (~x & z); + case 1: + return x ^ y ^ z; + case 2: + return (x & y) ^ (x & z) ^ (y & z); + case 3: + return x ^ y ^ z; + } +} +function ROTL(x, n) { + return (x << n) | (x >>> (32 - n)); +} +function sha1(bytes) { + const K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6]; + const H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0]; + const newBytes = new Uint8Array(bytes.length + 1); + newBytes.set(bytes); + newBytes[bytes.length] = 0x80; + bytes = newBytes; + const l = bytes.length / 4 + 2; + const N = Math.ceil(l / 16); + const M = new Array(N); + for (let i = 0; i < N; ++i) { + const arr = new Uint32Array(16); + for (let j = 0; j < 16; ++j) { + arr[j] = + (bytes[i * 64 + j * 4] << 24) | + (bytes[i * 64 + j * 4 + 1] << 16) | + (bytes[i * 64 + j * 4 + 2] << 8) | + bytes[i * 64 + j * 4 + 3]; + } + M[i] = arr; + } + M[N - 1][14] = ((bytes.length - 1) * 8) / 2 ** 32; + M[N - 1][14] = Math.floor(M[N - 1][14]); + M[N - 1][15] = ((bytes.length - 1) * 8) & 0xffffffff; + for (let i = 0; i < N; ++i) { + const W = new Uint32Array(80); + for (let t = 0; t < 16; ++t) { + W[t] = M[i][t]; + } + for (let t = 16; t < 80; ++t) { + W[t] = ROTL(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1); + } + let a = H[0]; + let b = H[1]; + let c = H[2]; + let d = H[3]; + let e = H[4]; + for (let t = 0; t < 80; ++t) { + const s = Math.floor(t / 20); + const T = (ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[t]) >>> 0; + e = d; + d = c; + c = ROTL(b, 30) >>> 0; + b = a; + a = T; + } + H[0] = (H[0] + a) >>> 0; + H[1] = (H[1] + b) >>> 0; + H[2] = (H[2] + c) >>> 0; + H[3] = (H[3] + d) >>> 0; + H[4] = (H[4] + e) >>> 0; + } + return Uint8Array.of(H[0] >> 24, H[0] >> 16, H[0] >> 8, H[0], H[1] >> 24, H[1] >> 16, H[1] >> 8, H[1], H[2] >> 24, H[2] >> 16, H[2] >> 8, H[2], H[3] >> 24, H[3] >> 16, H[3] >> 8, H[3], H[4] >> 24, H[4] >> 16, H[4] >> 8, H[4]); +} +export default sha1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.d.ts new file mode 100644 index 0000000..16cb008 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.d.ts @@ -0,0 +1,3 @@ +export declare function unsafeStringify(arr: Uint8Array, offset?: number): string; +declare function stringify(arr: Uint8Array, offset?: number): string; +export default stringify; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.js new file mode 100644 index 0000000..962738c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/stringify.js @@ -0,0 +1,35 @@ +import validate from './validate.js'; +const byteToHex = []; +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).slice(1)); +} +export function unsafeStringify(arr, offset = 0) { + return (byteToHex[arr[offset + 0]] + + byteToHex[arr[offset + 1]] + + byteToHex[arr[offset + 2]] + + byteToHex[arr[offset + 3]] + + '-' + + byteToHex[arr[offset + 4]] + + byteToHex[arr[offset + 5]] + + '-' + + byteToHex[arr[offset + 6]] + + byteToHex[arr[offset + 7]] + + '-' + + byteToHex[arr[offset + 8]] + + byteToHex[arr[offset + 9]] + + '-' + + byteToHex[arr[offset + 10]] + + byteToHex[arr[offset + 11]] + + byteToHex[arr[offset + 12]] + + byteToHex[arr[offset + 13]] + + byteToHex[arr[offset + 14]] + + byteToHex[arr[offset + 15]]).toLowerCase(); +} +function stringify(arr, offset = 0) { + const uuid = unsafeStringify(arr, offset); + if (!validate(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + return uuid; +} +export default stringify; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.d.ts new file mode 100644 index 0000000..3d276b5 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.d.ts @@ -0,0 +1,22 @@ +export type UUIDTypes = string | TBuf; +export type Version1Options = { + node?: Uint8Array; + clockseq?: number; + random?: Uint8Array; + rng?: () => Uint8Array; + msecs?: number; + nsecs?: number; + _v6?: boolean; +}; +export type Version4Options = { + random?: Uint8Array; + rng?: () => Uint8Array; +}; +export type Version6Options = Version1Options; +export type Version7Options = { + random?: Uint8Array; + msecs?: number; + seq?: number; + rng?: () => Uint8Array; +}; +export type NonSharedArrayBuffer = ReturnType; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.js new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/types.js @@ -0,0 +1 @@ +export {}; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.js new file mode 100644 index 0000000..aa4d4ac --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/uuid-bin.js @@ -0,0 +1,70 @@ +import * as assert from 'node:assert/strict'; +import v1 from './v1.js'; +import v3 from './v3.js'; +import v4 from './v4.js'; +import v5 from './v5.js'; +import v6 from './v6.js'; +import v7 from './v7.js'; +function usage() { + console.log('Usage:'); + console.log(' uuid'); + console.log(' uuid v1'); + console.log(' uuid v3 '); + console.log(' uuid v4'); + console.log(' uuid v5 '); + console.log(' uuid v6'); + console.log(' uuid v7'); + console.log(' uuid --help'); + console.log('\nNote: may be "URL" or "DNS" to use the corresponding UUIDs defined by RFC9562'); +} +const args = process.argv.slice(2); +if (args.indexOf('--help') >= 0) { + usage(); + process.exit(0); +} +const version = args.shift() || 'v4'; +switch (version) { + case 'v1': + console.log(v1()); + break; + case 'v3': { + const name = args.shift(); + let namespace = args.shift(); + assert.ok(name != null, 'v3 name not specified'); + assert.ok(namespace != null, 'v3 namespace not specified'); + if (namespace === 'URL') { + namespace = v3.URL; + } + if (namespace === 'DNS') { + namespace = v3.DNS; + } + console.log(v3(name, namespace)); + break; + } + case 'v4': + console.log(v4()); + break; + case 'v5': { + const name = args.shift(); + let namespace = args.shift(); + assert.ok(name != null, 'v5 name not specified'); + assert.ok(namespace != null, 'v5 namespace not specified'); + if (namespace === 'URL') { + namespace = v5.URL; + } + if (namespace === 'DNS') { + namespace = v5.DNS; + } + console.log(v5(name, namespace)); + break; + } + case 'v6': + console.log(v6()); + break; + case 'v7': + console.log(v7()); + break; + default: + usage(); + process.exit(1); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.d.ts new file mode 100644 index 0000000..6744f00 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.d.ts @@ -0,0 +1,11 @@ +import type { Version1Options } from './types.js'; +type V1State = { + node?: Uint8Array; + clockseq?: number; + msecs?: number; + nsecs?: number; +}; +declare function v1(options?: Version1Options, buf?: undefined, offset?: number): string; +declare function v1(options: Version1Options | undefined, buf: Buf, offset?: number): Buf; +export declare function updateV1State(state: V1State, now: number, rnds: Uint8Array): V1State; +export default v1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.js new file mode 100644 index 0000000..aa70449 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1.js @@ -0,0 +1,87 @@ +import rng from './rng.js'; +import { unsafeStringify } from './stringify.js'; +const _state = {}; +function v1(options, buf, offset) { + let bytes; + const isV6 = options?._v6 ?? false; + if (options) { + const optionsKeys = Object.keys(options); + if (optionsKeys.length === 1 && optionsKeys[0] === '_v6') { + options = undefined; + } + } + if (options) { + bytes = v1Bytes(options.random ?? options.rng?.() ?? rng(), options.msecs, options.nsecs, options.clockseq, options.node, buf, offset); + } + else { + const now = Date.now(); + const rnds = rng(); + updateV1State(_state, now, rnds); + bytes = v1Bytes(rnds, _state.msecs, _state.nsecs, isV6 ? undefined : _state.clockseq, isV6 ? undefined : _state.node, buf, offset); + } + return buf ?? unsafeStringify(bytes); +} +export function updateV1State(state, now, rnds) { + state.msecs ??= -Infinity; + state.nsecs ??= 0; + if (now === state.msecs) { + state.nsecs++; + if (state.nsecs >= 10000) { + state.node = undefined; + state.nsecs = 0; + } + } + else if (now > state.msecs) { + state.nsecs = 0; + } + else if (now < state.msecs) { + state.node = undefined; + } + if (!state.node) { + state.node = rnds.slice(10, 16); + state.node[0] |= 0x01; + state.clockseq = ((rnds[8] << 8) | rnds[9]) & 0x3fff; + } + state.msecs = now; + return state; +} +function v1Bytes(rnds, msecs, nsecs, clockseq, node, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + nsecs ??= 0; + clockseq ??= ((rnds[8] << 8) | rnds[9]) & 0x3fff; + if (node == null) { + node = rnds.slice(10, 16); + node[0] |= 0x01; + } + msecs += 12219292800000; + const t = (msecs & 0xfffffff) * 10000 + nsecs; + const tl = t >>> 0; + buf[offset++] = (tl >>> 24) & 0xff; + buf[offset++] = (tl >>> 16) & 0xff; + buf[offset++] = (tl >>> 8) & 0xff; + buf[offset++] = tl & 0xff; + const tmh = (((msecs / 0x10000000) | 0) * 625 + ((t / 0x100000000) | 0)) & 0xfffffff; + buf[offset++] = (tmh >>> 8) & 0xff; + buf[offset++] = tmh & 0xff; + buf[offset++] = ((tmh >>> 24) & 0xf) | 0x10; + buf[offset++] = (tmh >>> 16) & 0xff; + buf[offset++] = (clockseq >>> 8) | 0x80; + buf[offset++] = clockseq & 0xff; + for (let n = 0; n < 6; ++n) { + buf[offset++] = node[n]; + } + return buf; +} +export default v1; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.d.ts new file mode 100644 index 0000000..67924d8 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.d.ts @@ -0,0 +1,3 @@ +import type { NonSharedArrayBuffer } from './types.js'; +export default function v1ToV6(uuid: string): string; +export default function v1ToV6(uuid: Uint8Array): NonSharedArrayBuffer; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.js new file mode 100644 index 0000000..da0f763 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v1ToV6.js @@ -0,0 +1,10 @@ +import parse from './parse.js'; +import { unsafeStringify } from './stringify.js'; +export default function v1ToV6(uuid) { + const v1Bytes = typeof uuid === 'string' ? parse(uuid) : uuid; + const v6Bytes = _v1ToV6(v1Bytes); + return typeof uuid === 'string' ? unsafeStringify(v6Bytes) : v6Bytes; +} +function _v1ToV6(v1Bytes) { + return Uint8Array.of(((v1Bytes[6] & 0x0f) << 4) | ((v1Bytes[7] >> 4) & 0x0f), ((v1Bytes[7] & 0x0f) << 4) | ((v1Bytes[4] & 0xf0) >> 4), ((v1Bytes[4] & 0x0f) << 4) | ((v1Bytes[5] & 0xf0) >> 4), ((v1Bytes[5] & 0x0f) << 4) | ((v1Bytes[0] & 0xf0) >> 4), ((v1Bytes[0] & 0x0f) << 4) | ((v1Bytes[1] & 0xf0) >> 4), ((v1Bytes[1] & 0x0f) << 4) | ((v1Bytes[2] & 0xf0) >> 4), 0x60 | (v1Bytes[2] & 0x0f), v1Bytes[3], v1Bytes[8], v1Bytes[9], v1Bytes[10], v1Bytes[11], v1Bytes[12], v1Bytes[13], v1Bytes[14], v1Bytes[15]); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.d.ts new file mode 100644 index 0000000..c4142c7 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.d.ts @@ -0,0 +1,9 @@ +import type { UUIDTypes } from './types.js'; +export { DNS, URL } from './v35.js'; +declare function v3(value: string | Uint8Array, namespace: UUIDTypes, buf?: undefined, offset?: number): string; +declare function v3(value: string | Uint8Array, namespace: UUIDTypes, buf: TBuf, offset?: number): TBuf; +declare namespace v3 { + var DNS: string; + var URL: string; +} +export default v3; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.js new file mode 100644 index 0000000..b5c3781 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v3.js @@ -0,0 +1,9 @@ +import md5 from './md5.js'; +import v35, { DNS, URL } from './v35.js'; +export { DNS, URL } from './v35.js'; +function v3(value, namespace, buf, offset) { + return v35(0x30, md5, value, namespace, buf, offset); +} +v3.DNS = DNS; +v3.URL = URL; +export default v3; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.d.ts new file mode 100644 index 0000000..05d0fb5 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.d.ts @@ -0,0 +1,7 @@ +import type { UUIDTypes } from './types.js'; +export declare function stringToBytes(str: string): Uint8Array; +export declare const DNS = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"; +export declare const URL = "6ba7b811-9dad-11d1-80b4-00c04fd430c8"; +type HashFunction = (bytes: Uint8Array) => Uint8Array; +export default function v35(version: 0x30 | 0x50, hash: HashFunction, value: string | Uint8Array, namespace: UUIDTypes, buf?: TBuf, offset?: number): UUIDTypes; +export {}; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.js new file mode 100644 index 0000000..8c5fc66 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v35.js @@ -0,0 +1,39 @@ +import parse from './parse.js'; +import { unsafeStringify } from './stringify.js'; +export function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); + const bytes = new Uint8Array(str.length); + for (let i = 0; i < str.length; ++i) { + bytes[i] = str.charCodeAt(i); + } + return bytes; +} +export const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +export const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +export default function v35(version, hash, value, namespace, buf, offset) { + const valueBytes = typeof value === 'string' ? stringToBytes(value) : value; + const namespaceBytes = typeof namespace === 'string' ? parse(namespace) : namespace; + if (typeof namespace === 'string') { + namespace = parse(namespace); + } + if (namespace?.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } + let bytes = new Uint8Array(16 + valueBytes.length); + bytes.set(namespaceBytes); + bytes.set(valueBytes, namespaceBytes.length); + bytes = hash(bytes); + bytes[6] = (bytes[6] & 0x0f) | version; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + if (buf) { + offset ??= 0; + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return unsafeStringify(bytes); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.d.ts new file mode 100644 index 0000000..f131da7 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.d.ts @@ -0,0 +1,4 @@ +import type { Version4Options } from './types.js'; +declare function v4(options?: Version4Options, buf?: undefined, offset?: number): string; +declare function v4(options: Version4Options | undefined, buf: TBuf, offset?: number): TBuf; +export default v4; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.js new file mode 100644 index 0000000..b3017c9 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v4.js @@ -0,0 +1,29 @@ +import rng from './rng.js'; +import { unsafeStringify } from './stringify.js'; +function v4(options, buf, offset) { + if (!buf && !options && crypto.randomUUID) { + return crypto.randomUUID(); + } + return _v4(options, buf, offset); +} +function _v4(options, buf, offset) { + options = options || {}; + const rnds = options.random ?? options.rng?.() ?? rng(); + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + rnds[6] = (rnds[6] & 0x0f) | 0x40; + rnds[8] = (rnds[8] & 0x3f) | 0x80; + if (buf) { + offset = offset || 0; + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + return buf; + } + return unsafeStringify(rnds); +} +export default v4; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.d.ts new file mode 100644 index 0000000..3e7011e --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.d.ts @@ -0,0 +1,9 @@ +import type { UUIDTypes } from './types.js'; +export { DNS, URL } from './v35.js'; +declare function v5(value: string | Uint8Array, namespace: UUIDTypes, buf?: undefined, offset?: number): string; +declare function v5(value: string | Uint8Array, namespace: UUIDTypes, buf: TBuf, offset?: number): TBuf; +declare namespace v5 { + var DNS: string; + var URL: string; +} +export default v5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.js new file mode 100644 index 0000000..bd470a4 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v5.js @@ -0,0 +1,9 @@ +import sha1 from './sha1.js'; +import v35, { DNS, URL } from './v35.js'; +export { DNS, URL } from './v35.js'; +function v5(value, namespace, buf, offset) { + return v35(0x50, sha1, value, namespace, buf, offset); +} +v5.DNS = DNS; +v5.URL = URL; +export default v5; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.d.ts new file mode 100644 index 0000000..68f8e7c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.d.ts @@ -0,0 +1,4 @@ +import type { Version6Options } from './types.js'; +declare function v6(options?: Version6Options, buf?: undefined, offset?: number): string; +declare function v6(options: Version6Options | undefined, buf: TBuf, offset?: number): TBuf; +export default v6; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.js new file mode 100644 index 0000000..bd1fc35 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6.js @@ -0,0 +1,20 @@ +import { unsafeStringify } from './stringify.js'; +import v1 from './v1.js'; +import v1ToV6 from './v1ToV6.js'; +function v6(options, buf, offset) { + options ??= {}; + offset ??= 0; + let bytes = v1({ ...options, _v6: true }, new Uint8Array(16)); + bytes = v1ToV6(bytes); + if (buf) { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + for (let i = 0; i < 16; i++) { + buf[offset + i] = bytes[i]; + } + return buf; + } + return unsafeStringify(bytes); +} +export default v6; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.d.ts new file mode 100644 index 0000000..3b3ffc2 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.d.ts @@ -0,0 +1,2 @@ +export default function v6ToV1(uuid: string): string; +export default function v6ToV1(uuid: Uint8Array): Uint8Array; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.js new file mode 100644 index 0000000..bfd942f --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v6ToV1.js @@ -0,0 +1,10 @@ +import parse from './parse.js'; +import { unsafeStringify } from './stringify.js'; +export default function v6ToV1(uuid) { + const v6Bytes = typeof uuid === 'string' ? parse(uuid) : uuid; + const v1Bytes = _v6ToV1(v6Bytes); + return typeof uuid === 'string' ? unsafeStringify(v1Bytes) : v1Bytes; +} +function _v6ToV1(v6Bytes) { + return Uint8Array.of(((v6Bytes[3] & 0x0f) << 4) | ((v6Bytes[4] >> 4) & 0x0f), ((v6Bytes[4] & 0x0f) << 4) | ((v6Bytes[5] & 0xf0) >> 4), ((v6Bytes[5] & 0x0f) << 4) | (v6Bytes[6] & 0x0f), v6Bytes[7], ((v6Bytes[1] & 0x0f) << 4) | ((v6Bytes[2] & 0xf0) >> 4), ((v6Bytes[2] & 0x0f) << 4) | ((v6Bytes[3] & 0xf0) >> 4), 0x10 | ((v6Bytes[0] & 0xf0) >> 4), ((v6Bytes[0] & 0x0f) << 4) | ((v6Bytes[1] & 0xf0) >> 4), v6Bytes[8], v6Bytes[9], v6Bytes[10], v6Bytes[11], v6Bytes[12], v6Bytes[13], v6Bytes[14], v6Bytes[15]); +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.d.ts new file mode 100644 index 0000000..f77dfca --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.d.ts @@ -0,0 +1,9 @@ +import type { Version7Options } from './types.js'; +type V7State = { + msecs?: number; + seq?: number; +}; +declare function v7(options?: Version7Options, buf?: undefined, offset?: number): string; +declare function v7(options: Version7Options | undefined, buf: TBuf, offset?: number): TBuf; +export declare function updateV7State(state: V7State, now: number, rnds: Uint8Array): V7State; +export default v7; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.js new file mode 100644 index 0000000..a3a68f8 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/v7.js @@ -0,0 +1,68 @@ +import rng from './rng.js'; +import { unsafeStringify } from './stringify.js'; +const _state = {}; +function v7(options, buf, offset) { + let bytes; + if (options) { + bytes = v7Bytes(options.random ?? options.rng?.() ?? rng(), options.msecs, options.seq, buf, offset); + } + else { + const now = Date.now(); + const rnds = rng(); + updateV7State(_state, now, rnds); + bytes = v7Bytes(rnds, _state.msecs, _state.seq, buf, offset); + } + return buf ?? unsafeStringify(bytes); +} +export function updateV7State(state, now, rnds) { + state.msecs ??= -Infinity; + state.seq ??= 0; + if (now > state.msecs) { + state.seq = v7Sequence(rnds); + state.msecs = now; + } + else { + state.seq = (state.seq + 1) | 0; + if (state.seq === 0) { + state.msecs++; + } + } + return state; +} +function v7Bytes(rnds, msecs, seq, buf, offset = 0) { + if (rnds.length < 16) { + throw new Error('Random bytes length must be >= 16'); + } + if (!buf) { + buf = new Uint8Array(16); + offset = 0; + } + else { + if (offset < 0 || offset + 16 > buf.length) { + throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`); + } + } + msecs ??= Date.now(); + seq ??= v7Sequence(rnds); + buf[offset++] = (msecs / 0x10000000000) & 0xff; + buf[offset++] = (msecs / 0x100000000) & 0xff; + buf[offset++] = (msecs / 0x1000000) & 0xff; + buf[offset++] = (msecs / 0x10000) & 0xff; + buf[offset++] = (msecs / 0x100) & 0xff; + buf[offset++] = msecs & 0xff; + buf[offset++] = 0x70 | ((seq >>> 28) & 0x0f); + buf[offset++] = (seq >>> 20) & 0xff; + buf[offset++] = 0x80 | ((seq >>> 14) & 0x3f); + buf[offset++] = (seq >>> 6) & 0xff; + buf[offset++] = ((seq << 2) & 0xff) | (rnds[10] & 0x03); + buf[offset++] = rnds[11]; + buf[offset++] = rnds[12]; + buf[offset++] = rnds[13]; + buf[offset++] = rnds[14]; + buf[offset++] = rnds[15]; + return buf; +} +function v7Sequence(rnds) { + return ((rnds[6] & 0x7f) << 24) | (rnds[7] << 16) | (rnds[8] << 8) | rnds[9]; +} +export default v7; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.d.ts new file mode 100644 index 0000000..57da03d --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.d.ts @@ -0,0 +1,2 @@ +declare function validate(uuid: unknown): boolean; +export default validate; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.js new file mode 100644 index 0000000..444a1a2 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/validate.js @@ -0,0 +1,5 @@ +import REGEX from './regex.js'; +function validate(uuid) { + return typeof uuid === 'string' && REGEX.test(uuid); +} +export default validate; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.d.ts b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.d.ts new file mode 100644 index 0000000..f1948dc --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.d.ts @@ -0,0 +1,2 @@ +declare function version(uuid: string): number; +export default version; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.js new file mode 100644 index 0000000..bae91d3 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/libs/uuid/version.js @@ -0,0 +1,8 @@ +import validate from './validate.js'; +function version(uuid) { + if (!validate(uuid)) { + throw TypeError('Invalid UUID'); + } + return parseInt(uuid.slice(14, 15), 16); +} +export default version; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/main.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/main.js new file mode 100644 index 0000000..3cf595f --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/main.js @@ -0,0 +1,23 @@ +import Counter from './modules/Counter.js'; // wichtig mit Dateiendung, da kein Bundler + +(() => { + // === DOM & VARS ======= + const DOM = { + counters: Array.from(document.querySelectorAll('.counter')), + }; + + // === INIT ============= + const init = () => { + DOM.counters.forEach((el) => { + Counter(el); + }); + }; + + // === EVENTHANDLER ===== + + // === XHR/FETCH ======== + + // === FUNCTIONS ======== + + init(); +})(); diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js new file mode 100644 index 0000000..61c783c --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/assets/js/modules/Counter.js @@ -0,0 +1,36 @@ +import v4 from '../libs/uuid/v4.js'; + +const Counter = (elOrSelector = null) => { + // ===== DOM & VARS ===== + + // TODO: forEach for string selector + const module = elOrSelector || document.querySelector(elOrSelector); + const countEl = module.querySelector('input[id^="count"]'); + const btnEl = module.querySelector('button[id^="incrementButton"]'); + + const id = v4(); + + countEl.id = `count-${id}`; + btnEl.id = `incrementButton-${id}`; + + // console.log('id:', id); + + let counter = { count: 0 }; + + // ===== INIT ===== + const init = () => { + btnEl.addEventListener('click', onClickIncrement); + }; + + // ===== EVENT HANDLER ===== + function onClickIncrement() { + let count = ++counter.count; + // count++; + countEl.value = counter.count; + } + + // ===== CALL INIT ===== + init(); +}; + +export default Counter; diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html new file mode 100644 index 0000000..7d39900 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/index.html @@ -0,0 +1,83 @@ + + + + + + Counter Example + + + + +
+
+
+
+
+

HERO

+
+
+
+
+
+
+

+ Lorem ipsum dolor sit amet consectetur adipisicing elit. Ipsum animi eaque doloremque error voluptate alias + dolorem esse qui voluptatum eius placeat unde consequuntur sequi dolor, repudiandae nobis. Excepturi, + dolores tenetur. +

+
+
+
+

Counter

+
+
+
+ Count: + +
+ +
+
+
+
+ +
+
+ + + diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package-lock.json b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package-lock.json new file mode 100644 index 0000000..6037535 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package-lock.json @@ -0,0 +1,660 @@ +{ + "name": "webseite-html", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "webseite-html", + "version": "1.0.0", + "dependencies": { + "uuid": "^14.0.2" + }, + "devDependencies": { + "http-server": "^14.1.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.2.tgz", + "integrity": "sha512-xZe/16rV4aa+HGSOCiY2YeLT1OybRLrrkL/Rqaq7p7GMVXjFh+6wN4oMYgjFmnSnhY8t6Xpdl2l9qmnHYuMHwQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package.json b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package.json new file mode 100644 index 0000000..2e98540 --- /dev/null +++ b/06_js-debug/unterricht/tag48/01_counter/webseite-html-js/package.json @@ -0,0 +1,17 @@ +{ + "name": "webseite-html", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "npx http-server -c-1 -p 3000" + }, + "keywords": [], + "type": "commonjs", + "devDependencies": { + "http-server": "^14.1.1" + }, + "dependencies": { + "uuid": "^14.0.2" + } +}