@webwriter/quiz 1.1.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +8 -0
- package/LICENSE +6 -6
- package/README.md +778 -0
- package/assets/icons/grip-horizontal.svg +8 -0
- package/assets/icons/grip-vertical.svg +8 -0
- package/assets/icons/truefalse.svg +6 -0
- package/custom-elements.json +2779 -0
- package/custom.d.ts +180 -176
- package/dist/api/index.d.ts +27 -0
- package/dist/api/index.js +40 -0
- package/dist/migrate.js +1434 -0
- package/dist/widgets/webwriter-choice-item.js +4036 -3895
- package/dist/widgets/webwriter-choice.js +2269 -5821
- package/dist/widgets/webwriter-gap-item.js +3987 -0
- package/dist/widgets/webwriter-gap.js +2908 -0
- package/dist/widgets/webwriter-mark.js +4335 -3489
- package/dist/widgets/webwriter-order-item.js +4014 -3306
- package/dist/widgets/webwriter-order.js +2944 -4386
- package/dist/widgets/webwriter-pairing-item.js +1058 -2421
- package/dist/widgets/webwriter-pairing.js +2993 -4383
- package/dist/widgets/webwriter-quiz-hint.js +2469 -0
- package/dist/widgets/webwriter-quiz.js +4933 -6099
- package/dist/widgets/webwriter-speech.js +6077 -5230
- package/dist/widgets/webwriter-task-prompt.js +4775 -2165
- package/dist/widgets/webwriter-task.js +2364 -8382
- package/dist/widgets/webwriter-text.js +4169 -4337
- package/dist/widgets/webwriter-true-false.js +4674 -0
- package/editing-config.json +106 -0
- package/lit-localize.json +21 -15
- package/localization/de.xlf +407 -74
- package/localization/es.xlf +407 -69
- package/localization/fr.xlf +407 -69
- package/localization/generated/de.ts +112 -29
- package/localization/generated/es.ts +112 -29
- package/localization/generated/fr.ts +112 -29
- package/localization/generated/index.d.ts +5 -0
- package/localization/generated/index.js +2 -2
- package/localization/generated/it.ts +112 -29
- package/localization/generated/locale-codes.js +31 -79
- package/localization/generated/nl.ts +112 -29
- package/localization/it.xlf +407 -69
- package/localization/nl.xlf +407 -69
- package/package.json +119 -252
- package/scripts/apply-translations.mjs +97 -0
- package/src/api/index.ts +72 -0
- package/src/lib/artboard.ts +686 -0
- package/src/lib/draggable-grid.ts +432 -0
- package/src/lib/encrypted-property.ts +202 -0
- package/src/lib/hint-popup.ts +152 -0
- package/src/lib/utils.ts +97 -0
- package/src/lib/webwriter-quirks.ts +121 -0
- package/src/migrate/index.ts +622 -0
- package/src/migrate/legacy-solution.ts +362 -0
- package/src/snippets/order.html +9 -8
- package/src/widgets/choice/webwriter-choice-item.ts +316 -0
- package/src/widgets/choice/webwriter-choice.ts +328 -0
- package/src/widgets/choice/webwriter-true-false.ts +113 -0
- package/src/widgets/dnd/webwriter-dnd-draggable.ts +28 -0
- package/src/widgets/dnd/webwriter-dnd-dropzone.ts +9 -0
- package/src/widgets/dnd/webwriter-dnd.ts +36 -0
- package/src/widgets/gap/webwriter-gap-item.ts +250 -0
- package/src/widgets/gap/webwriter-gap.ts +447 -0
- package/src/widgets/order/webwriter-order-item.ts +243 -0
- package/src/widgets/order/webwriter-order.ts +282 -0
- package/src/widgets/pairing/webwriter-pairing-item.ts +46 -0
- package/src/widgets/pairing/webwriter-pairing.ts +934 -0
- package/src/widgets/speech/audio-player.ts +325 -0
- package/src/widgets/speech/audio-recorder.ts +285 -0
- package/src/widgets/speech/waveform.ts +113 -0
- package/src/widgets/speech/webwriter-speech.ts +87 -0
- package/src/widgets/webwriter-mark.ts +374 -432
- package/src/widgets/webwriter-quiz-hint.ts +36 -0
- package/src/widgets/webwriter-quiz.ts +320 -282
- package/src/widgets/webwriter-task-prompt.ts +49 -24
- package/src/widgets/webwriter-task.ts +216 -547
- package/src/widgets/webwriter-text.ts +291 -156
- package/tsconfig.api.json +12 -0
- package/tsconfig.json +8 -7
- package/dist/widgets/webwriter-choice.css +0 -444
- package/dist/widgets/webwriter-cloze-gap.css +0 -444
- package/dist/widgets/webwriter-cloze-gap.js +0 -5866
- package/dist/widgets/webwriter-cloze.css +0 -444
- package/dist/widgets/webwriter-cloze.js +0 -3786
- package/dist/widgets/webwriter-mark.css +0 -444
- package/dist/widgets/webwriter-order.css +0 -444
- package/dist/widgets/webwriter-pairing-item.css +0 -444
- package/dist/widgets/webwriter-pairing.css +0 -444
- package/dist/widgets/webwriter-quiz.css +0 -444
- package/dist/widgets/webwriter-task-explainer.css +0 -444
- package/dist/widgets/webwriter-task-explainer.js +0 -2872
- package/dist/widgets/webwriter-task-hint.css +0 -444
- package/dist/widgets/webwriter-task-hint.js +0 -2811
- package/dist/widgets/webwriter-task.css +0 -444
- package/dist/widgets/webwriter-text.css +0 -444
- package/localization/bg.xlf +0 -69
- package/localization/cs.xlf +0 -69
- package/localization/da.xlf +0 -69
- package/localization/el.xlf +0 -69
- package/localization/et.xlf +0 -69
- package/localization/fi.xlf +0 -69
- package/localization/generated/bg.ts +0 -30
- package/localization/generated/cs.ts +0 -30
- package/localization/generated/da.ts +0 -30
- package/localization/generated/el.ts +0 -30
- package/localization/generated/et.ts +0 -30
- package/localization/generated/fi.ts +0 -30
- package/localization/generated/hu.ts +0 -30
- package/localization/generated/id.ts +0 -30
- package/localization/generated/ja.ts +0 -30
- package/localization/generated/ko.ts +0 -30
- package/localization/generated/lt.ts +0 -30
- package/localization/generated/lv.ts +0 -30
- package/localization/generated/nb.ts +0 -30
- package/localization/generated/pl.ts +0 -30
- package/localization/generated/pt-BR.ts +0 -30
- package/localization/generated/pt-PT.ts +0 -30
- package/localization/generated/ro.ts +0 -30
- package/localization/generated/ru.ts +0 -30
- package/localization/generated/sk.ts +0 -30
- package/localization/generated/sl.ts +0 -30
- package/localization/generated/sv.ts +0 -30
- package/localization/generated/tr.ts +0 -30
- package/localization/generated/uk.ts +0 -30
- package/localization/generated/zh-hans.ts +0 -30
- package/localization/hu.xlf +0 -69
- package/localization/id.xlf +0 -69
- package/localization/ja.xlf +0 -69
- package/localization/ko.xlf +0 -69
- package/localization/lt.xlf +0 -69
- package/localization/lv.xlf +0 -69
- package/localization/nb.xlf +0 -69
- package/localization/pl.xlf +0 -69
- package/localization/pt-BR.xlf +0 -69
- package/localization/pt-PT.xlf +0 -69
- package/localization/ro.xlf +0 -69
- package/localization/ru.xlf +0 -69
- package/localization/sk.xlf +0 -69
- package/localization/sl.xlf +0 -69
- package/localization/sv.xlf +0 -69
- package/localization/tr.xlf +0 -69
- package/localization/uk.xlf +0 -69
- package/localization/zh-hans.xlf +0 -69
- package/src/lib/combobox.ts +0 -456
- package/src/lib/highlighter-fill.svg +0 -6
- package/src/snippets/Beispiel-Choice.html +0 -57
- package/src/snippets/Beispiel-Mark.html +0 -14
- package/src/snippets/Beispiel-Order.html +0 -52
- package/src/snippets/Beispiel-Text.html +0 -20
- package/src/snippets/blank.html +0 -1
- package/src/snippets/choice.html +0 -8
- package/src/snippets/cloze.html +0 -4
- package/src/snippets/mark.html +0 -4
- package/src/snippets/pairing.html +0 -10
- package/src/snippets/speech.html +0 -4
- package/src/snippets/text.html +0 -4
- package/src/snippets/wordsearch.html +0 -4
- package/src/widgets/webwriter-choice-item.ts +0 -254
- package/src/widgets/webwriter-choice.ts +0 -353
- package/src/widgets/webwriter-cloze-gap.ts +0 -216
- package/src/widgets/webwriter-cloze.ts +0 -136
- package/src/widgets/webwriter-order-item.ts +0 -441
- package/src/widgets/webwriter-order.ts +0 -327
- package/src/widgets/webwriter-pairing-item.ts +0 -161
- package/src/widgets/webwriter-pairing.ts +0 -193
- package/src/widgets/webwriter-speech.ts +0 -273
- package/src/widgets/webwriter-task-explainer.ts +0 -43
- package/src/widgets/webwriter-task-hint.ts +0 -23
package/dist/migrate.js
ADDED
|
@@ -0,0 +1,1434 @@
|
|
|
1
|
+
// package.json
|
|
2
|
+
var name = "@webwriter/quiz";
|
|
3
|
+
var version = "2.0.0";
|
|
4
|
+
|
|
5
|
+
// node_modules/@lit/reactive-element/css-tag.js
|
|
6
|
+
var t = globalThis;
|
|
7
|
+
var e = t.ShadowRoot && (void 0 === t.ShadyCSS || t.ShadyCSS.nativeShadow) && "adoptedStyleSheets" in Document.prototype && "replace" in CSSStyleSheet.prototype;
|
|
8
|
+
var s = Symbol();
|
|
9
|
+
var o = /* @__PURE__ */ new WeakMap();
|
|
10
|
+
var n = class {
|
|
11
|
+
constructor(t3, e4, o5) {
|
|
12
|
+
if (this._$cssResult$ = true, o5 !== s) throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");
|
|
13
|
+
this.cssText = t3, this.t = e4;
|
|
14
|
+
}
|
|
15
|
+
get styleSheet() {
|
|
16
|
+
let t3 = this.o;
|
|
17
|
+
const s4 = this.t;
|
|
18
|
+
if (e && void 0 === t3) {
|
|
19
|
+
const e4 = void 0 !== s4 && 1 === s4.length;
|
|
20
|
+
e4 && (t3 = o.get(s4)), void 0 === t3 && ((this.o = t3 = new CSSStyleSheet()).replaceSync(this.cssText), e4 && o.set(s4, t3));
|
|
21
|
+
}
|
|
22
|
+
return t3;
|
|
23
|
+
}
|
|
24
|
+
toString() {
|
|
25
|
+
return this.cssText;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var r = (t3) => new n("string" == typeof t3 ? t3 : t3 + "", void 0, s);
|
|
29
|
+
var S = (s4, o5) => {
|
|
30
|
+
if (e) s4.adoptedStyleSheets = o5.map((t3) => t3 instanceof CSSStyleSheet ? t3 : t3.styleSheet);
|
|
31
|
+
else for (const e4 of o5) {
|
|
32
|
+
const o6 = document.createElement("style"), n4 = t.litNonce;
|
|
33
|
+
void 0 !== n4 && o6.setAttribute("nonce", n4), o6.textContent = e4.cssText, s4.appendChild(o6);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var c = e ? (t3) => t3 : (t3) => t3 instanceof CSSStyleSheet ? ((t4) => {
|
|
37
|
+
let e4 = "";
|
|
38
|
+
for (const s4 of t4.cssRules) e4 += s4.cssText;
|
|
39
|
+
return r(e4);
|
|
40
|
+
})(t3) : t3;
|
|
41
|
+
|
|
42
|
+
// node_modules/@lit/reactive-element/reactive-element.js
|
|
43
|
+
var { is: i2, defineProperty: e2, getOwnPropertyDescriptor: h, getOwnPropertyNames: r2, getOwnPropertySymbols: o2, getPrototypeOf: n2 } = Object;
|
|
44
|
+
var a = globalThis;
|
|
45
|
+
var c2 = a.trustedTypes;
|
|
46
|
+
var l = c2 ? c2.emptyScript : "";
|
|
47
|
+
var p = a.reactiveElementPolyfillSupport;
|
|
48
|
+
var d = (t3, s4) => t3;
|
|
49
|
+
var u = { toAttribute(t3, s4) {
|
|
50
|
+
switch (s4) {
|
|
51
|
+
case Boolean:
|
|
52
|
+
t3 = t3 ? l : null;
|
|
53
|
+
break;
|
|
54
|
+
case Object:
|
|
55
|
+
case Array:
|
|
56
|
+
t3 = null == t3 ? t3 : JSON.stringify(t3);
|
|
57
|
+
}
|
|
58
|
+
return t3;
|
|
59
|
+
}, fromAttribute(t3, s4) {
|
|
60
|
+
let i5 = t3;
|
|
61
|
+
switch (s4) {
|
|
62
|
+
case Boolean:
|
|
63
|
+
i5 = null !== t3;
|
|
64
|
+
break;
|
|
65
|
+
case Number:
|
|
66
|
+
i5 = null === t3 ? null : Number(t3);
|
|
67
|
+
break;
|
|
68
|
+
case Object:
|
|
69
|
+
case Array:
|
|
70
|
+
try {
|
|
71
|
+
i5 = JSON.parse(t3);
|
|
72
|
+
} catch (t4) {
|
|
73
|
+
i5 = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return i5;
|
|
77
|
+
} };
|
|
78
|
+
var f = (t3, s4) => !i2(t3, s4);
|
|
79
|
+
var b = { attribute: true, type: String, converter: u, reflect: false, useDefault: false, hasChanged: f };
|
|
80
|
+
Symbol.metadata ??= Symbol("metadata"), a.litPropertyMetadata ??= /* @__PURE__ */ new WeakMap();
|
|
81
|
+
var y = class extends HTMLElement {
|
|
82
|
+
static addInitializer(t3) {
|
|
83
|
+
this._$Ei(), (this.l ??= []).push(t3);
|
|
84
|
+
}
|
|
85
|
+
static get observedAttributes() {
|
|
86
|
+
return this.finalize(), this._$Eh && [...this._$Eh.keys()];
|
|
87
|
+
}
|
|
88
|
+
static createProperty(t3, s4 = b) {
|
|
89
|
+
if (s4.state && (s4.attribute = false), this._$Ei(), this.prototype.hasOwnProperty(t3) && ((s4 = Object.create(s4)).wrapped = true), this.elementProperties.set(t3, s4), !s4.noAccessor) {
|
|
90
|
+
const i5 = Symbol(), h3 = this.getPropertyDescriptor(t3, i5, s4);
|
|
91
|
+
void 0 !== h3 && e2(this.prototype, t3, h3);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
static getPropertyDescriptor(t3, s4, i5) {
|
|
95
|
+
const { get: e4, set: r4 } = h(this.prototype, t3) ?? { get() {
|
|
96
|
+
return this[s4];
|
|
97
|
+
}, set(t4) {
|
|
98
|
+
this[s4] = t4;
|
|
99
|
+
} };
|
|
100
|
+
return { get: e4, set(s5) {
|
|
101
|
+
const h3 = e4?.call(this);
|
|
102
|
+
r4?.call(this, s5), this.requestUpdate(t3, h3, i5);
|
|
103
|
+
}, configurable: true, enumerable: true };
|
|
104
|
+
}
|
|
105
|
+
static getPropertyOptions(t3) {
|
|
106
|
+
return this.elementProperties.get(t3) ?? b;
|
|
107
|
+
}
|
|
108
|
+
static _$Ei() {
|
|
109
|
+
if (this.hasOwnProperty(d("elementProperties"))) return;
|
|
110
|
+
const t3 = n2(this);
|
|
111
|
+
t3.finalize(), void 0 !== t3.l && (this.l = [...t3.l]), this.elementProperties = new Map(t3.elementProperties);
|
|
112
|
+
}
|
|
113
|
+
static finalize() {
|
|
114
|
+
if (this.hasOwnProperty(d("finalized"))) return;
|
|
115
|
+
if (this.finalized = true, this._$Ei(), this.hasOwnProperty(d("properties"))) {
|
|
116
|
+
const t4 = this.properties, s4 = [...r2(t4), ...o2(t4)];
|
|
117
|
+
for (const i5 of s4) this.createProperty(i5, t4[i5]);
|
|
118
|
+
}
|
|
119
|
+
const t3 = this[Symbol.metadata];
|
|
120
|
+
if (null !== t3) {
|
|
121
|
+
const s4 = litPropertyMetadata.get(t3);
|
|
122
|
+
if (void 0 !== s4) for (const [t4, i5] of s4) this.elementProperties.set(t4, i5);
|
|
123
|
+
}
|
|
124
|
+
this._$Eh = /* @__PURE__ */ new Map();
|
|
125
|
+
for (const [t4, s4] of this.elementProperties) {
|
|
126
|
+
const i5 = this._$Eu(t4, s4);
|
|
127
|
+
void 0 !== i5 && this._$Eh.set(i5, t4);
|
|
128
|
+
}
|
|
129
|
+
this.elementStyles = this.finalizeStyles(this.styles);
|
|
130
|
+
}
|
|
131
|
+
static finalizeStyles(s4) {
|
|
132
|
+
const i5 = [];
|
|
133
|
+
if (Array.isArray(s4)) {
|
|
134
|
+
const e4 = new Set(s4.flat(1 / 0).reverse());
|
|
135
|
+
for (const s5 of e4) i5.unshift(c(s5));
|
|
136
|
+
} else void 0 !== s4 && i5.push(c(s4));
|
|
137
|
+
return i5;
|
|
138
|
+
}
|
|
139
|
+
static _$Eu(t3, s4) {
|
|
140
|
+
const i5 = s4.attribute;
|
|
141
|
+
return false === i5 ? void 0 : "string" == typeof i5 ? i5 : "string" == typeof t3 ? t3.toLowerCase() : void 0;
|
|
142
|
+
}
|
|
143
|
+
constructor() {
|
|
144
|
+
super(), this._$Ep = void 0, this.isUpdatePending = false, this.hasUpdated = false, this._$Em = null, this._$Ev();
|
|
145
|
+
}
|
|
146
|
+
_$Ev() {
|
|
147
|
+
this._$ES = new Promise((t3) => this.enableUpdating = t3), this._$AL = /* @__PURE__ */ new Map(), this._$E_(), this.requestUpdate(), this.constructor.l?.forEach((t3) => t3(this));
|
|
148
|
+
}
|
|
149
|
+
addController(t3) {
|
|
150
|
+
(this._$EO ??= /* @__PURE__ */ new Set()).add(t3), void 0 !== this.renderRoot && this.isConnected && t3.hostConnected?.();
|
|
151
|
+
}
|
|
152
|
+
removeController(t3) {
|
|
153
|
+
this._$EO?.delete(t3);
|
|
154
|
+
}
|
|
155
|
+
_$E_() {
|
|
156
|
+
const t3 = /* @__PURE__ */ new Map(), s4 = this.constructor.elementProperties;
|
|
157
|
+
for (const i5 of s4.keys()) this.hasOwnProperty(i5) && (t3.set(i5, this[i5]), delete this[i5]);
|
|
158
|
+
t3.size > 0 && (this._$Ep = t3);
|
|
159
|
+
}
|
|
160
|
+
createRenderRoot() {
|
|
161
|
+
const t3 = this.shadowRoot ?? this.attachShadow(this.constructor.shadowRootOptions);
|
|
162
|
+
return S(t3, this.constructor.elementStyles), t3;
|
|
163
|
+
}
|
|
164
|
+
connectedCallback() {
|
|
165
|
+
this.renderRoot ??= this.createRenderRoot(), this.enableUpdating(true), this._$EO?.forEach((t3) => t3.hostConnected?.());
|
|
166
|
+
}
|
|
167
|
+
enableUpdating(t3) {
|
|
168
|
+
}
|
|
169
|
+
disconnectedCallback() {
|
|
170
|
+
this._$EO?.forEach((t3) => t3.hostDisconnected?.());
|
|
171
|
+
}
|
|
172
|
+
attributeChangedCallback(t3, s4, i5) {
|
|
173
|
+
this._$AK(t3, i5);
|
|
174
|
+
}
|
|
175
|
+
_$ET(t3, s4) {
|
|
176
|
+
const i5 = this.constructor.elementProperties.get(t3), e4 = this.constructor._$Eu(t3, i5);
|
|
177
|
+
if (void 0 !== e4 && true === i5.reflect) {
|
|
178
|
+
const h3 = (void 0 !== i5.converter?.toAttribute ? i5.converter : u).toAttribute(s4, i5.type);
|
|
179
|
+
this._$Em = t3, null == h3 ? this.removeAttribute(e4) : this.setAttribute(e4, h3), this._$Em = null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
_$AK(t3, s4) {
|
|
183
|
+
const i5 = this.constructor, e4 = i5._$Eh.get(t3);
|
|
184
|
+
if (void 0 !== e4 && this._$Em !== e4) {
|
|
185
|
+
const t4 = i5.getPropertyOptions(e4), h3 = "function" == typeof t4.converter ? { fromAttribute: t4.converter } : void 0 !== t4.converter?.fromAttribute ? t4.converter : u;
|
|
186
|
+
this._$Em = e4;
|
|
187
|
+
const r4 = h3.fromAttribute(s4, t4.type);
|
|
188
|
+
this[e4] = r4 ?? this._$Ej?.get(e4) ?? r4, this._$Em = null;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
requestUpdate(t3, s4, i5, e4 = false, h3) {
|
|
192
|
+
if (void 0 !== t3) {
|
|
193
|
+
const r4 = this.constructor;
|
|
194
|
+
if (false === e4 && (h3 = this[t3]), i5 ??= r4.getPropertyOptions(t3), !((i5.hasChanged ?? f)(h3, s4) || i5.useDefault && i5.reflect && h3 === this._$Ej?.get(t3) && !this.hasAttribute(r4._$Eu(t3, i5)))) return;
|
|
195
|
+
this.C(t3, s4, i5);
|
|
196
|
+
}
|
|
197
|
+
false === this.isUpdatePending && (this._$ES = this._$EP());
|
|
198
|
+
}
|
|
199
|
+
C(t3, s4, { useDefault: i5, reflect: e4, wrapped: h3 }, r4) {
|
|
200
|
+
i5 && !(this._$Ej ??= /* @__PURE__ */ new Map()).has(t3) && (this._$Ej.set(t3, r4 ?? s4 ?? this[t3]), true !== h3 || void 0 !== r4) || (this._$AL.has(t3) || (this.hasUpdated || i5 || (s4 = void 0), this._$AL.set(t3, s4)), true === e4 && this._$Em !== t3 && (this._$Eq ??= /* @__PURE__ */ new Set()).add(t3));
|
|
201
|
+
}
|
|
202
|
+
async _$EP() {
|
|
203
|
+
this.isUpdatePending = true;
|
|
204
|
+
try {
|
|
205
|
+
await this._$ES;
|
|
206
|
+
} catch (t4) {
|
|
207
|
+
Promise.reject(t4);
|
|
208
|
+
}
|
|
209
|
+
const t3 = this.scheduleUpdate();
|
|
210
|
+
return null != t3 && await t3, !this.isUpdatePending;
|
|
211
|
+
}
|
|
212
|
+
scheduleUpdate() {
|
|
213
|
+
return this.performUpdate();
|
|
214
|
+
}
|
|
215
|
+
performUpdate() {
|
|
216
|
+
if (!this.isUpdatePending) return;
|
|
217
|
+
if (!this.hasUpdated) {
|
|
218
|
+
if (this.renderRoot ??= this.createRenderRoot(), this._$Ep) {
|
|
219
|
+
for (const [t5, s5] of this._$Ep) this[t5] = s5;
|
|
220
|
+
this._$Ep = void 0;
|
|
221
|
+
}
|
|
222
|
+
const t4 = this.constructor.elementProperties;
|
|
223
|
+
if (t4.size > 0) for (const [s5, i5] of t4) {
|
|
224
|
+
const { wrapped: t5 } = i5, e4 = this[s5];
|
|
225
|
+
true !== t5 || this._$AL.has(s5) || void 0 === e4 || this.C(s5, void 0, i5, e4);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
let t3 = false;
|
|
229
|
+
const s4 = this._$AL;
|
|
230
|
+
try {
|
|
231
|
+
t3 = this.shouldUpdate(s4), t3 ? (this.willUpdate(s4), this._$EO?.forEach((t4) => t4.hostUpdate?.()), this.update(s4)) : this._$EM();
|
|
232
|
+
} catch (s5) {
|
|
233
|
+
throw t3 = false, this._$EM(), s5;
|
|
234
|
+
}
|
|
235
|
+
t3 && this._$AE(s4);
|
|
236
|
+
}
|
|
237
|
+
willUpdate(t3) {
|
|
238
|
+
}
|
|
239
|
+
_$AE(t3) {
|
|
240
|
+
this._$EO?.forEach((t4) => t4.hostUpdated?.()), this.hasUpdated || (this.hasUpdated = true, this.firstUpdated(t3)), this.updated(t3);
|
|
241
|
+
}
|
|
242
|
+
_$EM() {
|
|
243
|
+
this._$AL = /* @__PURE__ */ new Map(), this.isUpdatePending = false;
|
|
244
|
+
}
|
|
245
|
+
get updateComplete() {
|
|
246
|
+
return this.getUpdateComplete();
|
|
247
|
+
}
|
|
248
|
+
getUpdateComplete() {
|
|
249
|
+
return this._$ES;
|
|
250
|
+
}
|
|
251
|
+
shouldUpdate(t3) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
update(t3) {
|
|
255
|
+
this._$Eq &&= this._$Eq.forEach((t4) => this._$ET(t4, this[t4])), this._$EM();
|
|
256
|
+
}
|
|
257
|
+
updated(t3) {
|
|
258
|
+
}
|
|
259
|
+
firstUpdated(t3) {
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
y.elementStyles = [], y.shadowRootOptions = { mode: "open" }, y[d("elementProperties")] = /* @__PURE__ */ new Map(), y[d("finalized")] = /* @__PURE__ */ new Map(), p?.({ ReactiveElement: y }), (a.reactiveElementVersions ??= []).push("2.1.2");
|
|
263
|
+
|
|
264
|
+
// node_modules/lit-html/lit-html.js
|
|
265
|
+
var t2 = globalThis;
|
|
266
|
+
var i3 = (t3) => t3;
|
|
267
|
+
var s2 = t2.trustedTypes;
|
|
268
|
+
var e3 = s2 ? s2.createPolicy("lit-html", { createHTML: (t3) => t3 }) : void 0;
|
|
269
|
+
var h2 = "$lit$";
|
|
270
|
+
var o3 = `lit$${Math.random().toFixed(9).slice(2)}$`;
|
|
271
|
+
var n3 = "?" + o3;
|
|
272
|
+
var r3 = `<${n3}>`;
|
|
273
|
+
var l2 = document;
|
|
274
|
+
var c3 = () => l2.createComment("");
|
|
275
|
+
var a2 = (t3) => null === t3 || "object" != typeof t3 && "function" != typeof t3;
|
|
276
|
+
var u2 = Array.isArray;
|
|
277
|
+
var d2 = (t3) => u2(t3) || "function" == typeof t3?.[Symbol.iterator];
|
|
278
|
+
var f2 = "[ \n\f\r]";
|
|
279
|
+
var v = /<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g;
|
|
280
|
+
var _ = /-->/g;
|
|
281
|
+
var m = />/g;
|
|
282
|
+
var p2 = RegExp(`>|${f2}(?:([^\\s"'>=/]+)(${f2}*=${f2}*(?:[^
|
|
283
|
+
\f\r"'\`<>=]|("|')|))|$)`, "g");
|
|
284
|
+
var g = /'/g;
|
|
285
|
+
var $ = /"/g;
|
|
286
|
+
var y2 = /^(?:script|style|textarea|title)$/i;
|
|
287
|
+
var x = (t3) => (i5, ...s4) => ({ _$litType$: t3, strings: i5, values: s4 });
|
|
288
|
+
var b2 = x(1);
|
|
289
|
+
var w = x(2);
|
|
290
|
+
var T = x(3);
|
|
291
|
+
var E = Symbol.for("lit-noChange");
|
|
292
|
+
var A = Symbol.for("lit-nothing");
|
|
293
|
+
var C = /* @__PURE__ */ new WeakMap();
|
|
294
|
+
var P = l2.createTreeWalker(l2, 129);
|
|
295
|
+
function V(t3, i5) {
|
|
296
|
+
if (!u2(t3) || !t3.hasOwnProperty("raw")) throw Error("invalid template strings array");
|
|
297
|
+
return void 0 !== e3 ? e3.createHTML(i5) : i5;
|
|
298
|
+
}
|
|
299
|
+
var N = (t3, i5) => {
|
|
300
|
+
const s4 = t3.length - 1, e4 = [];
|
|
301
|
+
let n4, l3 = 2 === i5 ? "<svg>" : 3 === i5 ? "<math>" : "", c4 = v;
|
|
302
|
+
for (let i6 = 0; i6 < s4; i6++) {
|
|
303
|
+
const s5 = t3[i6];
|
|
304
|
+
let a3, u3, d3 = -1, f3 = 0;
|
|
305
|
+
for (; f3 < s5.length && (c4.lastIndex = f3, u3 = c4.exec(s5), null !== u3); ) f3 = c4.lastIndex, c4 === v ? "!--" === u3[1] ? c4 = _ : void 0 !== u3[1] ? c4 = m : void 0 !== u3[2] ? (y2.test(u3[2]) && (n4 = RegExp("</" + u3[2], "g")), c4 = p2) : void 0 !== u3[3] && (c4 = p2) : c4 === p2 ? ">" === u3[0] ? (c4 = n4 ?? v, d3 = -1) : void 0 === u3[1] ? d3 = -2 : (d3 = c4.lastIndex - u3[2].length, a3 = u3[1], c4 = void 0 === u3[3] ? p2 : '"' === u3[3] ? $ : g) : c4 === $ || c4 === g ? c4 = p2 : c4 === _ || c4 === m ? c4 = v : (c4 = p2, n4 = void 0);
|
|
306
|
+
const x2 = c4 === p2 && t3[i6 + 1].startsWith("/>") ? " " : "";
|
|
307
|
+
l3 += c4 === v ? s5 + r3 : d3 >= 0 ? (e4.push(a3), s5.slice(0, d3) + h2 + s5.slice(d3) + o3 + x2) : s5 + o3 + (-2 === d3 ? i6 : x2);
|
|
308
|
+
}
|
|
309
|
+
return [V(t3, l3 + (t3[s4] || "<?>") + (2 === i5 ? "</svg>" : 3 === i5 ? "</math>" : "")), e4];
|
|
310
|
+
};
|
|
311
|
+
var S2 = class _S {
|
|
312
|
+
constructor({ strings: t3, _$litType$: i5 }, e4) {
|
|
313
|
+
let r4;
|
|
314
|
+
this.parts = [];
|
|
315
|
+
let l3 = 0, a3 = 0;
|
|
316
|
+
const u3 = t3.length - 1, d3 = this.parts, [f3, v2] = N(t3, i5);
|
|
317
|
+
if (this.el = _S.createElement(f3, e4), P.currentNode = this.el.content, 2 === i5 || 3 === i5) {
|
|
318
|
+
const t4 = this.el.content.firstChild;
|
|
319
|
+
t4.replaceWith(...t4.childNodes);
|
|
320
|
+
}
|
|
321
|
+
for (; null !== (r4 = P.nextNode()) && d3.length < u3; ) {
|
|
322
|
+
if (1 === r4.nodeType) {
|
|
323
|
+
if (r4.hasAttributes()) for (const t4 of r4.getAttributeNames()) if (t4.endsWith(h2)) {
|
|
324
|
+
const i6 = v2[a3++], s4 = r4.getAttribute(t4).split(o3), e5 = /([.?@])?(.*)/.exec(i6);
|
|
325
|
+
d3.push({ type: 1, index: l3, name: e5[2], strings: s4, ctor: "." === e5[1] ? I : "?" === e5[1] ? L : "@" === e5[1] ? z : H }), r4.removeAttribute(t4);
|
|
326
|
+
} else t4.startsWith(o3) && (d3.push({ type: 6, index: l3 }), r4.removeAttribute(t4));
|
|
327
|
+
if (y2.test(r4.tagName)) {
|
|
328
|
+
const t4 = r4.textContent.split(o3), i6 = t4.length - 1;
|
|
329
|
+
if (i6 > 0) {
|
|
330
|
+
r4.textContent = s2 ? s2.emptyScript : "";
|
|
331
|
+
for (let s4 = 0; s4 < i6; s4++) r4.append(t4[s4], c3()), P.nextNode(), d3.push({ type: 2, index: ++l3 });
|
|
332
|
+
r4.append(t4[i6], c3());
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
} else if (8 === r4.nodeType) if (r4.data === n3) d3.push({ type: 2, index: l3 });
|
|
336
|
+
else {
|
|
337
|
+
let t4 = -1;
|
|
338
|
+
for (; -1 !== (t4 = r4.data.indexOf(o3, t4 + 1)); ) d3.push({ type: 7, index: l3 }), t4 += o3.length - 1;
|
|
339
|
+
}
|
|
340
|
+
l3++;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
static createElement(t3, i5) {
|
|
344
|
+
const s4 = l2.createElement("template");
|
|
345
|
+
return s4.innerHTML = t3, s4;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
function M(t3, i5, s4 = t3, e4) {
|
|
349
|
+
if (i5 === E) return i5;
|
|
350
|
+
let h3 = void 0 !== e4 ? s4._$Co?.[e4] : s4._$Cl;
|
|
351
|
+
const o5 = a2(i5) ? void 0 : i5._$litDirective$;
|
|
352
|
+
return h3?.constructor !== o5 && (h3?._$AO?.(false), void 0 === o5 ? h3 = void 0 : (h3 = new o5(t3), h3._$AT(t3, s4, e4)), void 0 !== e4 ? (s4._$Co ??= [])[e4] = h3 : s4._$Cl = h3), void 0 !== h3 && (i5 = M(t3, h3._$AS(t3, i5.values), h3, e4)), i5;
|
|
353
|
+
}
|
|
354
|
+
var R = class {
|
|
355
|
+
constructor(t3, i5) {
|
|
356
|
+
this._$AV = [], this._$AN = void 0, this._$AD = t3, this._$AM = i5;
|
|
357
|
+
}
|
|
358
|
+
get parentNode() {
|
|
359
|
+
return this._$AM.parentNode;
|
|
360
|
+
}
|
|
361
|
+
get _$AU() {
|
|
362
|
+
return this._$AM._$AU;
|
|
363
|
+
}
|
|
364
|
+
u(t3) {
|
|
365
|
+
const { el: { content: i5 }, parts: s4 } = this._$AD, e4 = (t3?.creationScope ?? l2).importNode(i5, true);
|
|
366
|
+
P.currentNode = e4;
|
|
367
|
+
let h3 = P.nextNode(), o5 = 0, n4 = 0, r4 = s4[0];
|
|
368
|
+
for (; void 0 !== r4; ) {
|
|
369
|
+
if (o5 === r4.index) {
|
|
370
|
+
let i6;
|
|
371
|
+
2 === r4.type ? i6 = new k(h3, h3.nextSibling, this, t3) : 1 === r4.type ? i6 = new r4.ctor(h3, r4.name, r4.strings, this, t3) : 6 === r4.type && (i6 = new Z(h3, this, t3)), this._$AV.push(i6), r4 = s4[++n4];
|
|
372
|
+
}
|
|
373
|
+
o5 !== r4?.index && (h3 = P.nextNode(), o5++);
|
|
374
|
+
}
|
|
375
|
+
return P.currentNode = l2, e4;
|
|
376
|
+
}
|
|
377
|
+
p(t3) {
|
|
378
|
+
let i5 = 0;
|
|
379
|
+
for (const s4 of this._$AV) void 0 !== s4 && (void 0 !== s4.strings ? (s4._$AI(t3, s4, i5), i5 += s4.strings.length - 2) : s4._$AI(t3[i5])), i5++;
|
|
380
|
+
}
|
|
381
|
+
};
|
|
382
|
+
var k = class _k {
|
|
383
|
+
get _$AU() {
|
|
384
|
+
return this._$AM?._$AU ?? this._$Cv;
|
|
385
|
+
}
|
|
386
|
+
constructor(t3, i5, s4, e4) {
|
|
387
|
+
this.type = 2, this._$AH = A, this._$AN = void 0, this._$AA = t3, this._$AB = i5, this._$AM = s4, this.options = e4, this._$Cv = e4?.isConnected ?? true;
|
|
388
|
+
}
|
|
389
|
+
get parentNode() {
|
|
390
|
+
let t3 = this._$AA.parentNode;
|
|
391
|
+
const i5 = this._$AM;
|
|
392
|
+
return void 0 !== i5 && 11 === t3?.nodeType && (t3 = i5.parentNode), t3;
|
|
393
|
+
}
|
|
394
|
+
get startNode() {
|
|
395
|
+
return this._$AA;
|
|
396
|
+
}
|
|
397
|
+
get endNode() {
|
|
398
|
+
return this._$AB;
|
|
399
|
+
}
|
|
400
|
+
_$AI(t3, i5 = this) {
|
|
401
|
+
t3 = M(this, t3, i5), a2(t3) ? t3 === A || null == t3 || "" === t3 ? (this._$AH !== A && this._$AR(), this._$AH = A) : t3 !== this._$AH && t3 !== E && this._(t3) : void 0 !== t3._$litType$ ? this.$(t3) : void 0 !== t3.nodeType ? this.T(t3) : d2(t3) ? this.k(t3) : this._(t3);
|
|
402
|
+
}
|
|
403
|
+
O(t3) {
|
|
404
|
+
return this._$AA.parentNode.insertBefore(t3, this._$AB);
|
|
405
|
+
}
|
|
406
|
+
T(t3) {
|
|
407
|
+
this._$AH !== t3 && (this._$AR(), this._$AH = this.O(t3));
|
|
408
|
+
}
|
|
409
|
+
_(t3) {
|
|
410
|
+
this._$AH !== A && a2(this._$AH) ? this._$AA.nextSibling.data = t3 : this.T(l2.createTextNode(t3)), this._$AH = t3;
|
|
411
|
+
}
|
|
412
|
+
$(t3) {
|
|
413
|
+
const { values: i5, _$litType$: s4 } = t3, e4 = "number" == typeof s4 ? this._$AC(t3) : (void 0 === s4.el && (s4.el = S2.createElement(V(s4.h, s4.h[0]), this.options)), s4);
|
|
414
|
+
if (this._$AH?._$AD === e4) this._$AH.p(i5);
|
|
415
|
+
else {
|
|
416
|
+
const t4 = new R(e4, this), s5 = t4.u(this.options);
|
|
417
|
+
t4.p(i5), this.T(s5), this._$AH = t4;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
_$AC(t3) {
|
|
421
|
+
let i5 = C.get(t3.strings);
|
|
422
|
+
return void 0 === i5 && C.set(t3.strings, i5 = new S2(t3)), i5;
|
|
423
|
+
}
|
|
424
|
+
k(t3) {
|
|
425
|
+
u2(this._$AH) || (this._$AH = [], this._$AR());
|
|
426
|
+
const i5 = this._$AH;
|
|
427
|
+
let s4, e4 = 0;
|
|
428
|
+
for (const h3 of t3) e4 === i5.length ? i5.push(s4 = new _k(this.O(c3()), this.O(c3()), this, this.options)) : s4 = i5[e4], s4._$AI(h3), e4++;
|
|
429
|
+
e4 < i5.length && (this._$AR(s4 && s4._$AB.nextSibling, e4), i5.length = e4);
|
|
430
|
+
}
|
|
431
|
+
_$AR(t3 = this._$AA.nextSibling, s4) {
|
|
432
|
+
for (this._$AP?.(false, true, s4); t3 !== this._$AB; ) {
|
|
433
|
+
const s5 = i3(t3).nextSibling;
|
|
434
|
+
i3(t3).remove(), t3 = s5;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
setConnected(t3) {
|
|
438
|
+
void 0 === this._$AM && (this._$Cv = t3, this._$AP?.(t3));
|
|
439
|
+
}
|
|
440
|
+
};
|
|
441
|
+
var H = class {
|
|
442
|
+
get tagName() {
|
|
443
|
+
return this.element.tagName;
|
|
444
|
+
}
|
|
445
|
+
get _$AU() {
|
|
446
|
+
return this._$AM._$AU;
|
|
447
|
+
}
|
|
448
|
+
constructor(t3, i5, s4, e4, h3) {
|
|
449
|
+
this.type = 1, this._$AH = A, this._$AN = void 0, this.element = t3, this.name = i5, this._$AM = e4, this.options = h3, s4.length > 2 || "" !== s4[0] || "" !== s4[1] ? (this._$AH = Array(s4.length - 1).fill(new String()), this.strings = s4) : this._$AH = A;
|
|
450
|
+
}
|
|
451
|
+
_$AI(t3, i5 = this, s4, e4) {
|
|
452
|
+
const h3 = this.strings;
|
|
453
|
+
let o5 = false;
|
|
454
|
+
if (void 0 === h3) t3 = M(this, t3, i5, 0), o5 = !a2(t3) || t3 !== this._$AH && t3 !== E, o5 && (this._$AH = t3);
|
|
455
|
+
else {
|
|
456
|
+
const e5 = t3;
|
|
457
|
+
let n4, r4;
|
|
458
|
+
for (t3 = h3[0], n4 = 0; n4 < h3.length - 1; n4++) r4 = M(this, e5[s4 + n4], i5, n4), r4 === E && (r4 = this._$AH[n4]), o5 ||= !a2(r4) || r4 !== this._$AH[n4], r4 === A ? t3 = A : t3 !== A && (t3 += (r4 ?? "") + h3[n4 + 1]), this._$AH[n4] = r4;
|
|
459
|
+
}
|
|
460
|
+
o5 && !e4 && this.j(t3);
|
|
461
|
+
}
|
|
462
|
+
j(t3) {
|
|
463
|
+
t3 === A ? this.element.removeAttribute(this.name) : this.element.setAttribute(this.name, t3 ?? "");
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
var I = class extends H {
|
|
467
|
+
constructor() {
|
|
468
|
+
super(...arguments), this.type = 3;
|
|
469
|
+
}
|
|
470
|
+
j(t3) {
|
|
471
|
+
this.element[this.name] = t3 === A ? void 0 : t3;
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
var L = class extends H {
|
|
475
|
+
constructor() {
|
|
476
|
+
super(...arguments), this.type = 4;
|
|
477
|
+
}
|
|
478
|
+
j(t3) {
|
|
479
|
+
this.element.toggleAttribute(this.name, !!t3 && t3 !== A);
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
var z = class extends H {
|
|
483
|
+
constructor(t3, i5, s4, e4, h3) {
|
|
484
|
+
super(t3, i5, s4, e4, h3), this.type = 5;
|
|
485
|
+
}
|
|
486
|
+
_$AI(t3, i5 = this) {
|
|
487
|
+
if ((t3 = M(this, t3, i5, 0) ?? A) === E) return;
|
|
488
|
+
const s4 = this._$AH, e4 = t3 === A && s4 !== A || t3.capture !== s4.capture || t3.once !== s4.once || t3.passive !== s4.passive, h3 = t3 !== A && (s4 === A || e4);
|
|
489
|
+
e4 && this.element.removeEventListener(this.name, this, s4), h3 && this.element.addEventListener(this.name, this, t3), this._$AH = t3;
|
|
490
|
+
}
|
|
491
|
+
handleEvent(t3) {
|
|
492
|
+
"function" == typeof this._$AH ? this._$AH.call(this.options?.host ?? this.element, t3) : this._$AH.handleEvent(t3);
|
|
493
|
+
}
|
|
494
|
+
};
|
|
495
|
+
var Z = class {
|
|
496
|
+
constructor(t3, i5, s4) {
|
|
497
|
+
this.element = t3, this.type = 6, this._$AN = void 0, this._$AM = i5, this.options = s4;
|
|
498
|
+
}
|
|
499
|
+
get _$AU() {
|
|
500
|
+
return this._$AM._$AU;
|
|
501
|
+
}
|
|
502
|
+
_$AI(t3) {
|
|
503
|
+
M(this, t3);
|
|
504
|
+
}
|
|
505
|
+
};
|
|
506
|
+
var B = t2.litHtmlPolyfillSupport;
|
|
507
|
+
B?.(S2, k), (t2.litHtmlVersions ??= []).push("3.3.3");
|
|
508
|
+
var D = (t3, i5, s4) => {
|
|
509
|
+
const e4 = s4?.renderBefore ?? i5;
|
|
510
|
+
let h3 = e4._$litPart$;
|
|
511
|
+
if (void 0 === h3) {
|
|
512
|
+
const t4 = s4?.renderBefore ?? null;
|
|
513
|
+
e4._$litPart$ = h3 = new k(i5.insertBefore(c3(), t4), t4, void 0, s4 ?? {});
|
|
514
|
+
}
|
|
515
|
+
return h3._$AI(t3), h3;
|
|
516
|
+
};
|
|
517
|
+
|
|
518
|
+
// node_modules/lit-element/lit-element.js
|
|
519
|
+
var s3 = globalThis;
|
|
520
|
+
var i4 = class extends y {
|
|
521
|
+
constructor() {
|
|
522
|
+
super(...arguments), this.renderOptions = { host: this }, this._$Do = void 0;
|
|
523
|
+
}
|
|
524
|
+
createRenderRoot() {
|
|
525
|
+
const t3 = super.createRenderRoot();
|
|
526
|
+
return this.renderOptions.renderBefore ??= t3.firstChild, t3;
|
|
527
|
+
}
|
|
528
|
+
update(t3) {
|
|
529
|
+
const r4 = this.render();
|
|
530
|
+
this.hasUpdated || (this.renderOptions.isConnected = this.isConnected), super.update(t3), this._$Do = D(r4, this.renderRoot, this.renderOptions);
|
|
531
|
+
}
|
|
532
|
+
connectedCallback() {
|
|
533
|
+
super.connectedCallback(), this._$Do?.setConnected(true);
|
|
534
|
+
}
|
|
535
|
+
disconnectedCallback() {
|
|
536
|
+
super.disconnectedCallback(), this._$Do?.setConnected(false);
|
|
537
|
+
}
|
|
538
|
+
render() {
|
|
539
|
+
return E;
|
|
540
|
+
}
|
|
541
|
+
};
|
|
542
|
+
i4._$litElement$ = true, i4["finalized"] = true, s3.litElementHydrateSupport?.({ LitElement: i4 });
|
|
543
|
+
var o4 = s3.litElementPolyfillSupport;
|
|
544
|
+
o4?.({ LitElement: i4 });
|
|
545
|
+
(s3.litElementVersions ??= []).push("4.2.2");
|
|
546
|
+
|
|
547
|
+
// src/lib/encrypted-property.ts
|
|
548
|
+
var VERSION = 3;
|
|
549
|
+
var KEY_LENGTH = 16;
|
|
550
|
+
var LENGTH_LENGTH = 4;
|
|
551
|
+
var MIN_PADDING_LENGTH = 2;
|
|
552
|
+
var PADDING_BLOCK_LENGTH = 8;
|
|
553
|
+
var HEADER_LENGTH = 1 + KEY_LENGTH;
|
|
554
|
+
var encoder = new TextEncoder();
|
|
555
|
+
var decoder = new TextDecoder("utf-8", { fatal: true });
|
|
556
|
+
function randomBytes(length) {
|
|
557
|
+
const bytes = new Uint8Array(length);
|
|
558
|
+
if (globalThis.crypto?.getRandomValues) {
|
|
559
|
+
return globalThis.crypto.getRandomValues(bytes);
|
|
560
|
+
}
|
|
561
|
+
for (let index = 0; index < length; index++) {
|
|
562
|
+
bytes[index] = Math.floor(Math.random() * 256);
|
|
563
|
+
}
|
|
564
|
+
return bytes;
|
|
565
|
+
}
|
|
566
|
+
function paddedLength(plaintextLength) {
|
|
567
|
+
const minimumLength = LENGTH_LENGTH + plaintextLength + MIN_PADDING_LENGTH;
|
|
568
|
+
const roundedLength = Math.ceil(minimumLength / PADDING_BLOCK_LENGTH) * PADDING_BLOCK_LENGTH;
|
|
569
|
+
return roundedLength + randomBytes(1)[0] % 2 * PADDING_BLOCK_LENGTH;
|
|
570
|
+
}
|
|
571
|
+
function applyKeystream(bytes, key) {
|
|
572
|
+
const result = new Uint8Array(bytes.length);
|
|
573
|
+
const state = new Uint32Array(4);
|
|
574
|
+
const keyView = new DataView(key.buffer, key.byteOffset, key.byteLength);
|
|
575
|
+
for (let index = 0; index < state.length; index++) {
|
|
576
|
+
state[index] = keyView.getUint32(index * 4);
|
|
577
|
+
}
|
|
578
|
+
if (state.every((word) => word === 0)) {
|
|
579
|
+
state[0] = 1;
|
|
580
|
+
}
|
|
581
|
+
for (let index = 0; index < bytes.length; index++) {
|
|
582
|
+
let next = state[3];
|
|
583
|
+
const first = state[0];
|
|
584
|
+
state[3] = state[2];
|
|
585
|
+
state[2] = state[1];
|
|
586
|
+
state[1] = first;
|
|
587
|
+
next ^= next << 11;
|
|
588
|
+
next ^= next >>> 8;
|
|
589
|
+
state[0] = next ^ first ^ first >>> 19;
|
|
590
|
+
result[index] = bytes[index] ^ state[0];
|
|
591
|
+
}
|
|
592
|
+
return result;
|
|
593
|
+
}
|
|
594
|
+
function toBase64(bytes) {
|
|
595
|
+
let binary = "";
|
|
596
|
+
for (const byte of bytes) {
|
|
597
|
+
binary += String.fromCharCode(byte);
|
|
598
|
+
}
|
|
599
|
+
return btoa(binary);
|
|
600
|
+
}
|
|
601
|
+
function fromBase64(value) {
|
|
602
|
+
const binary = atob(value);
|
|
603
|
+
const bytes = new Uint8Array(binary.length);
|
|
604
|
+
for (let index = 0; index < binary.length; index++) {
|
|
605
|
+
bytes[index] = binary.charCodeAt(index);
|
|
606
|
+
}
|
|
607
|
+
return bytes;
|
|
608
|
+
}
|
|
609
|
+
function decryptAttribute(value) {
|
|
610
|
+
const payload = fromBase64(value);
|
|
611
|
+
if (payload[0] !== VERSION || payload.length < HEADER_LENGTH + LENGTH_LENGTH) {
|
|
612
|
+
throw new Error("Not an encrypted property");
|
|
613
|
+
}
|
|
614
|
+
const key = payload.subarray(1, HEADER_LENGTH);
|
|
615
|
+
const framedPlaintext = applyKeystream(payload.subarray(HEADER_LENGTH), key);
|
|
616
|
+
const plaintextLength = new DataView(
|
|
617
|
+
framedPlaintext.buffer,
|
|
618
|
+
framedPlaintext.byteOffset,
|
|
619
|
+
framedPlaintext.byteLength
|
|
620
|
+
).getUint32(0);
|
|
621
|
+
if (plaintextLength > framedPlaintext.length - LENGTH_LENGTH) {
|
|
622
|
+
throw new Error("Invalid encrypted property");
|
|
623
|
+
}
|
|
624
|
+
return JSON.parse(
|
|
625
|
+
decoder.decode(
|
|
626
|
+
framedPlaintext.subarray(LENGTH_LENGTH, LENGTH_LENGTH + plaintextLength)
|
|
627
|
+
)
|
|
628
|
+
);
|
|
629
|
+
}
|
|
630
|
+
var encryptedProperty = {
|
|
631
|
+
toAttribute(value) {
|
|
632
|
+
if (value == null) {
|
|
633
|
+
return value;
|
|
634
|
+
}
|
|
635
|
+
const plaintext = encoder.encode(JSON.stringify(value));
|
|
636
|
+
const framedPlaintext = randomBytes(paddedLength(plaintext.length));
|
|
637
|
+
new DataView(framedPlaintext.buffer).setUint32(0, plaintext.length);
|
|
638
|
+
framedPlaintext.set(plaintext, LENGTH_LENGTH);
|
|
639
|
+
const key = randomBytes(KEY_LENGTH);
|
|
640
|
+
const ciphertext = applyKeystream(framedPlaintext, key);
|
|
641
|
+
const payload = new Uint8Array(HEADER_LENGTH + ciphertext.length);
|
|
642
|
+
payload[0] = VERSION;
|
|
643
|
+
payload.set(key, 1);
|
|
644
|
+
payload.set(ciphertext, HEADER_LENGTH);
|
|
645
|
+
return toBase64(payload);
|
|
646
|
+
},
|
|
647
|
+
fromAttribute(value, type) {
|
|
648
|
+
if (value == null) {
|
|
649
|
+
return null;
|
|
650
|
+
}
|
|
651
|
+
try {
|
|
652
|
+
return decryptAttribute(value);
|
|
653
|
+
} catch {
|
|
654
|
+
return u.fromAttribute?.(value, type);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
|
|
659
|
+
// src/migrate/legacy-solution.ts
|
|
660
|
+
var LEGACY_PASSWORD = "B08bxd82SAOf";
|
|
661
|
+
var PBKDF2_ITERATIONS = 1e5;
|
|
662
|
+
var GCM_TAG_LENGTH = 16;
|
|
663
|
+
var K = new Uint32Array([
|
|
664
|
+
1116352408,
|
|
665
|
+
1899447441,
|
|
666
|
+
3049323471,
|
|
667
|
+
3921009573,
|
|
668
|
+
961987163,
|
|
669
|
+
1508970993,
|
|
670
|
+
2453635748,
|
|
671
|
+
2870763221,
|
|
672
|
+
3624381080,
|
|
673
|
+
310598401,
|
|
674
|
+
607225278,
|
|
675
|
+
1426881987,
|
|
676
|
+
1925078388,
|
|
677
|
+
2162078206,
|
|
678
|
+
2614888103,
|
|
679
|
+
3248222580,
|
|
680
|
+
3835390401,
|
|
681
|
+
4022224774,
|
|
682
|
+
264347078,
|
|
683
|
+
604807628,
|
|
684
|
+
770255983,
|
|
685
|
+
1249150122,
|
|
686
|
+
1555081692,
|
|
687
|
+
1996064986,
|
|
688
|
+
2554220882,
|
|
689
|
+
2821834349,
|
|
690
|
+
2952996808,
|
|
691
|
+
3210313671,
|
|
692
|
+
3336571891,
|
|
693
|
+
3584528711,
|
|
694
|
+
113926993,
|
|
695
|
+
338241895,
|
|
696
|
+
666307205,
|
|
697
|
+
773529912,
|
|
698
|
+
1294757372,
|
|
699
|
+
1396182291,
|
|
700
|
+
1695183700,
|
|
701
|
+
1986661051,
|
|
702
|
+
2177026350,
|
|
703
|
+
2456956037,
|
|
704
|
+
2730485921,
|
|
705
|
+
2820302411,
|
|
706
|
+
3259730800,
|
|
707
|
+
3345764771,
|
|
708
|
+
3516065817,
|
|
709
|
+
3600352804,
|
|
710
|
+
4094571909,
|
|
711
|
+
275423344,
|
|
712
|
+
430227734,
|
|
713
|
+
506948616,
|
|
714
|
+
659060556,
|
|
715
|
+
883997877,
|
|
716
|
+
958139571,
|
|
717
|
+
1322822218,
|
|
718
|
+
1537002063,
|
|
719
|
+
1747873779,
|
|
720
|
+
1955562222,
|
|
721
|
+
2024104815,
|
|
722
|
+
2227730452,
|
|
723
|
+
2361852424,
|
|
724
|
+
2428436474,
|
|
725
|
+
2756734187,
|
|
726
|
+
3204031479,
|
|
727
|
+
3329325298
|
|
728
|
+
]);
|
|
729
|
+
var INITIAL_STATE = new Uint32Array([
|
|
730
|
+
1779033703,
|
|
731
|
+
3144134277,
|
|
732
|
+
1013904242,
|
|
733
|
+
2773480762,
|
|
734
|
+
1359893119,
|
|
735
|
+
2600822924,
|
|
736
|
+
528734635,
|
|
737
|
+
1541459225
|
|
738
|
+
]);
|
|
739
|
+
var schedule = new Uint32Array(64);
|
|
740
|
+
function compress(state, block, offset) {
|
|
741
|
+
for (let i5 = 0; i5 < 16; i5++) {
|
|
742
|
+
const j = offset + i5 * 4;
|
|
743
|
+
schedule[i5] = block[j] << 24 | block[j + 1] << 16 | block[j + 2] << 8 | block[j + 3];
|
|
744
|
+
}
|
|
745
|
+
for (let i5 = 16; i5 < 64; i5++) {
|
|
746
|
+
const x2 = schedule[i5 - 15];
|
|
747
|
+
const y3 = schedule[i5 - 2];
|
|
748
|
+
const s0 = (x2 >>> 7 | x2 << 25) ^ (x2 >>> 18 | x2 << 14) ^ x2 >>> 3;
|
|
749
|
+
const s1 = (y3 >>> 17 | y3 << 15) ^ (y3 >>> 19 | y3 << 13) ^ y3 >>> 10;
|
|
750
|
+
schedule[i5] = schedule[i5 - 16] + s0 + schedule[i5 - 7] + s1 | 0;
|
|
751
|
+
}
|
|
752
|
+
let a3 = state[0];
|
|
753
|
+
let b3 = state[1];
|
|
754
|
+
let c4 = state[2];
|
|
755
|
+
let d3 = state[3];
|
|
756
|
+
let e4 = state[4];
|
|
757
|
+
let f3 = state[5];
|
|
758
|
+
let g2 = state[6];
|
|
759
|
+
let h3 = state[7];
|
|
760
|
+
for (let i5 = 0; i5 < 64; i5++) {
|
|
761
|
+
const s1 = (e4 >>> 6 | e4 << 26) ^ (e4 >>> 11 | e4 << 21) ^ (e4 >>> 25 | e4 << 7);
|
|
762
|
+
const ch = e4 & f3 ^ ~e4 & g2;
|
|
763
|
+
const t1 = h3 + s1 + ch + K[i5] + schedule[i5] | 0;
|
|
764
|
+
const s0 = (a3 >>> 2 | a3 << 30) ^ (a3 >>> 13 | a3 << 19) ^ (a3 >>> 22 | a3 << 10);
|
|
765
|
+
const maj = a3 & b3 ^ a3 & c4 ^ b3 & c4;
|
|
766
|
+
const t22 = s0 + maj | 0;
|
|
767
|
+
h3 = g2;
|
|
768
|
+
g2 = f3;
|
|
769
|
+
f3 = e4;
|
|
770
|
+
e4 = d3 + t1 | 0;
|
|
771
|
+
d3 = c4;
|
|
772
|
+
c4 = b3;
|
|
773
|
+
b3 = a3;
|
|
774
|
+
a3 = t1 + t22 | 0;
|
|
775
|
+
}
|
|
776
|
+
state[0] = state[0] + a3 | 0;
|
|
777
|
+
state[1] = state[1] + b3 | 0;
|
|
778
|
+
state[2] = state[2] + c4 | 0;
|
|
779
|
+
state[3] = state[3] + d3 | 0;
|
|
780
|
+
state[4] = state[4] + e4 | 0;
|
|
781
|
+
state[5] = state[5] + f3 | 0;
|
|
782
|
+
state[6] = state[6] + g2 | 0;
|
|
783
|
+
state[7] = state[7] + h3 | 0;
|
|
784
|
+
}
|
|
785
|
+
var tailBlock = new Uint8Array(128);
|
|
786
|
+
var tailView = new DataView(tailBlock.buffer);
|
|
787
|
+
function absorb(state, data, prefixLength) {
|
|
788
|
+
let i5 = 0;
|
|
789
|
+
for (; i5 + 64 <= data.length; i5 += 64) compress(state, data, i5);
|
|
790
|
+
const rest = data.length - i5;
|
|
791
|
+
const size = rest <= 55 ? 64 : 128;
|
|
792
|
+
tailBlock.fill(0, 0, size);
|
|
793
|
+
tailBlock.set(data.subarray(i5), 0);
|
|
794
|
+
tailBlock[rest] = 128;
|
|
795
|
+
const bits = (prefixLength + data.length) * 8;
|
|
796
|
+
tailView.setUint32(size - 8, Math.floor(bits / 4294967296));
|
|
797
|
+
tailView.setUint32(size - 4, bits >>> 0);
|
|
798
|
+
for (let j = 0; j < size; j += 64) compress(state, tailBlock, j);
|
|
799
|
+
}
|
|
800
|
+
function writeState(state, out) {
|
|
801
|
+
for (let i5 = 0; i5 < 8; i5++) {
|
|
802
|
+
out[i5 * 4] = state[i5] >>> 24;
|
|
803
|
+
out[i5 * 4 + 1] = state[i5] >>> 16 & 255;
|
|
804
|
+
out[i5 * 4 + 2] = state[i5] >>> 8 & 255;
|
|
805
|
+
out[i5 * 4 + 3] = state[i5] & 255;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
function sha256(data) {
|
|
809
|
+
const state = INITIAL_STATE.slice();
|
|
810
|
+
absorb(state, data, 0);
|
|
811
|
+
const out = new Uint8Array(32);
|
|
812
|
+
writeState(state, out);
|
|
813
|
+
return out;
|
|
814
|
+
}
|
|
815
|
+
function hmacStates(key) {
|
|
816
|
+
const normalized = key.length > 64 ? sha256(key) : key;
|
|
817
|
+
const ipad = new Uint8Array(64);
|
|
818
|
+
const opad = new Uint8Array(64);
|
|
819
|
+
ipad.set(normalized);
|
|
820
|
+
opad.set(normalized);
|
|
821
|
+
for (let i5 = 0; i5 < 64; i5++) {
|
|
822
|
+
ipad[i5] ^= 54;
|
|
823
|
+
opad[i5] ^= 92;
|
|
824
|
+
}
|
|
825
|
+
const inner = INITIAL_STATE.slice();
|
|
826
|
+
compress(inner, ipad, 0);
|
|
827
|
+
const outer = INITIAL_STATE.slice();
|
|
828
|
+
compress(outer, opad, 0);
|
|
829
|
+
return { inner, outer };
|
|
830
|
+
}
|
|
831
|
+
var hmacDigest = new Uint8Array(32);
|
|
832
|
+
function hmacInto(states, message, out) {
|
|
833
|
+
const inner = states.inner.slice();
|
|
834
|
+
absorb(inner, message, 64);
|
|
835
|
+
writeState(inner, hmacDigest);
|
|
836
|
+
const outer = states.outer.slice();
|
|
837
|
+
absorb(outer, hmacDigest, 64);
|
|
838
|
+
writeState(outer, out);
|
|
839
|
+
}
|
|
840
|
+
function pbkdf2Sha256(password, salt, iterations, keyLength) {
|
|
841
|
+
const states = hmacStates(password);
|
|
842
|
+
const derived = new Uint8Array(keyLength);
|
|
843
|
+
const input = new Uint8Array(salt.length + 4);
|
|
844
|
+
const inputView = new DataView(input.buffer);
|
|
845
|
+
const u3 = new Uint8Array(32);
|
|
846
|
+
const t3 = new Uint8Array(32);
|
|
847
|
+
input.set(salt);
|
|
848
|
+
for (let block = 1; block <= Math.ceil(keyLength / 32); block++) {
|
|
849
|
+
inputView.setUint32(salt.length, block);
|
|
850
|
+
hmacInto(states, input, u3);
|
|
851
|
+
t3.set(u3);
|
|
852
|
+
for (let i5 = 1; i5 < iterations; i5++) {
|
|
853
|
+
hmacInto(states, u3, u3);
|
|
854
|
+
for (let j = 0; j < 32; j++) t3[j] ^= u3[j];
|
|
855
|
+
}
|
|
856
|
+
derived.set(t3.subarray(0, Math.min(32, keyLength - (block - 1) * 32)), (block - 1) * 32);
|
|
857
|
+
}
|
|
858
|
+
return derived;
|
|
859
|
+
}
|
|
860
|
+
var SBOX = new Uint8Array(256);
|
|
861
|
+
{
|
|
862
|
+
const rotl8 = (x2, shift) => (x2 << shift | x2 >>> 8 - shift) & 255;
|
|
863
|
+
let p3 = 1;
|
|
864
|
+
let q = 1;
|
|
865
|
+
do {
|
|
866
|
+
p3 = (p3 ^ p3 << 1 ^ (p3 & 128 ? 27 : 0)) & 255;
|
|
867
|
+
q ^= q << 1;
|
|
868
|
+
q ^= q << 2;
|
|
869
|
+
q ^= q << 4;
|
|
870
|
+
q &= 255;
|
|
871
|
+
if (q & 128) q ^= 9;
|
|
872
|
+
SBOX[p3] = (q ^ rotl8(q, 1) ^ rotl8(q, 2) ^ rotl8(q, 3) ^ rotl8(q, 4) ^ 99) & 255;
|
|
873
|
+
} while (p3 !== 1);
|
|
874
|
+
SBOX[0] = 99;
|
|
875
|
+
}
|
|
876
|
+
var xtime = (x2) => (x2 << 1 ^ (x2 & 128 ? 27 : 0)) & 255;
|
|
877
|
+
var AES_ROUNDS = 14;
|
|
878
|
+
var AES_KEY_WORDS = 8;
|
|
879
|
+
function expandKey(key) {
|
|
880
|
+
const roundKeys = new Uint8Array(16 * (AES_ROUNDS + 1));
|
|
881
|
+
roundKeys.set(key);
|
|
882
|
+
let rcon = 1;
|
|
883
|
+
for (let i5 = AES_KEY_WORDS; i5 < 4 * (AES_ROUNDS + 1); i5++) {
|
|
884
|
+
const previous = (i5 - 1) * 4;
|
|
885
|
+
let t0 = roundKeys[previous];
|
|
886
|
+
let t1 = roundKeys[previous + 1];
|
|
887
|
+
let t22 = roundKeys[previous + 2];
|
|
888
|
+
let t3 = roundKeys[previous + 3];
|
|
889
|
+
if (i5 % AES_KEY_WORDS === 0) {
|
|
890
|
+
const rotated = t0;
|
|
891
|
+
t0 = SBOX[t1] ^ rcon;
|
|
892
|
+
t1 = SBOX[t22];
|
|
893
|
+
t22 = SBOX[t3];
|
|
894
|
+
t3 = SBOX[rotated];
|
|
895
|
+
rcon = xtime(rcon);
|
|
896
|
+
} else if (i5 % AES_KEY_WORDS === 4) {
|
|
897
|
+
t0 = SBOX[t0];
|
|
898
|
+
t1 = SBOX[t1];
|
|
899
|
+
t22 = SBOX[t22];
|
|
900
|
+
t3 = SBOX[t3];
|
|
901
|
+
}
|
|
902
|
+
const target = i5 * 4;
|
|
903
|
+
const source = (i5 - AES_KEY_WORDS) * 4;
|
|
904
|
+
roundKeys[target] = roundKeys[source] ^ t0;
|
|
905
|
+
roundKeys[target + 1] = roundKeys[source + 1] ^ t1;
|
|
906
|
+
roundKeys[target + 2] = roundKeys[source + 2] ^ t22;
|
|
907
|
+
roundKeys[target + 3] = roundKeys[source + 3] ^ t3;
|
|
908
|
+
}
|
|
909
|
+
return roundKeys;
|
|
910
|
+
}
|
|
911
|
+
function encryptBlock(roundKeys, block) {
|
|
912
|
+
for (let i5 = 0; i5 < 16; i5++) block[i5] ^= roundKeys[i5];
|
|
913
|
+
for (let round = 1; round <= AES_ROUNDS; round++) {
|
|
914
|
+
for (let i5 = 0; i5 < 16; i5++) block[i5] = SBOX[block[i5]];
|
|
915
|
+
let swap = block[1];
|
|
916
|
+
block[1] = block[5];
|
|
917
|
+
block[5] = block[9];
|
|
918
|
+
block[9] = block[13];
|
|
919
|
+
block[13] = swap;
|
|
920
|
+
swap = block[2];
|
|
921
|
+
const swap2 = block[6];
|
|
922
|
+
block[2] = block[10];
|
|
923
|
+
block[6] = block[14];
|
|
924
|
+
block[10] = swap;
|
|
925
|
+
block[14] = swap2;
|
|
926
|
+
swap = block[15];
|
|
927
|
+
block[15] = block[11];
|
|
928
|
+
block[11] = block[7];
|
|
929
|
+
block[7] = block[3];
|
|
930
|
+
block[3] = swap;
|
|
931
|
+
if (round < AES_ROUNDS) {
|
|
932
|
+
for (let c4 = 0; c4 < 16; c4 += 4) {
|
|
933
|
+
const a0 = block[c4];
|
|
934
|
+
const a1 = block[c4 + 1];
|
|
935
|
+
const a22 = block[c4 + 2];
|
|
936
|
+
const a3 = block[c4 + 3];
|
|
937
|
+
const all = a0 ^ a1 ^ a22 ^ a3;
|
|
938
|
+
block[c4] = a0 ^ all ^ xtime(a0 ^ a1);
|
|
939
|
+
block[c4 + 1] = a1 ^ all ^ xtime(a1 ^ a22);
|
|
940
|
+
block[c4 + 2] = a22 ^ all ^ xtime(a22 ^ a3);
|
|
941
|
+
block[c4 + 3] = a3 ^ all ^ xtime(a3 ^ a0);
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
const offset = round * 16;
|
|
945
|
+
for (let i5 = 0; i5 < 16; i5++) block[i5] ^= roundKeys[offset + i5];
|
|
946
|
+
}
|
|
947
|
+
}
|
|
948
|
+
function aesGcmDecrypt(key, iv, payload) {
|
|
949
|
+
if (iv.length !== 12) throw new Error(`Unsupported IV length: ${iv.length}`);
|
|
950
|
+
if (payload.length < GCM_TAG_LENGTH) throw new Error("Ciphertext too short");
|
|
951
|
+
const roundKeys = expandKey(key);
|
|
952
|
+
const ciphertext = payload.subarray(0, payload.length - GCM_TAG_LENGTH);
|
|
953
|
+
const plaintext = new Uint8Array(ciphertext.length);
|
|
954
|
+
const counter = new Uint8Array(16);
|
|
955
|
+
const keystream = new Uint8Array(16);
|
|
956
|
+
counter.set(iv);
|
|
957
|
+
counter[15] = 1;
|
|
958
|
+
for (let offset = 0; offset < ciphertext.length; offset += 16) {
|
|
959
|
+
for (let i5 = 15; i5 >= 12; i5--) {
|
|
960
|
+
counter[i5] = counter[i5] + 1 & 255;
|
|
961
|
+
if (counter[i5] !== 0) break;
|
|
962
|
+
}
|
|
963
|
+
keystream.set(counter);
|
|
964
|
+
encryptBlock(roundKeys, keystream);
|
|
965
|
+
const length = Math.min(16, ciphertext.length - offset);
|
|
966
|
+
for (let i5 = 0; i5 < length; i5++) plaintext[offset + i5] = ciphertext[offset + i5] ^ keystream[i5];
|
|
967
|
+
}
|
|
968
|
+
return plaintext;
|
|
969
|
+
}
|
|
970
|
+
function dataUrlToBytes(url) {
|
|
971
|
+
const comma = url.indexOf(",");
|
|
972
|
+
if (comma === -1) throw new Error("Not a data URL");
|
|
973
|
+
const payload = url.slice(comma + 1);
|
|
974
|
+
if (!/;base64/i.test(url.slice(0, comma))) {
|
|
975
|
+
return new TextEncoder().encode(decodeURIComponent(payload));
|
|
976
|
+
}
|
|
977
|
+
const binary = atob(payload);
|
|
978
|
+
const bytes = new Uint8Array(binary.length);
|
|
979
|
+
for (let i5 = 0; i5 < binary.length; i5++) bytes[i5] = binary.charCodeAt(i5);
|
|
980
|
+
return bytes;
|
|
981
|
+
}
|
|
982
|
+
function decryptLegacySolution(solution, iv, salt) {
|
|
983
|
+
const key = pbkdf2Sha256(new TextEncoder().encode(LEGACY_PASSWORD), dataUrlToBytes(salt), PBKDF2_ITERATIONS, 32);
|
|
984
|
+
const plaintext = aesGcmDecrypt(key, dataUrlToBytes(iv), dataUrlToBytes(solution));
|
|
985
|
+
return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(plaintext));
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
// src/migrate/index.ts
|
|
989
|
+
var CURRENT_MAJOR_VERSION = Number(version.split(".")[0]);
|
|
990
|
+
var ANSWER_TAGS = /* @__PURE__ */ new Set([
|
|
991
|
+
"webwriter-choice",
|
|
992
|
+
"webwriter-true-false",
|
|
993
|
+
"webwriter-order",
|
|
994
|
+
"webwriter-text",
|
|
995
|
+
"webwriter-mark",
|
|
996
|
+
"webwriter-gap",
|
|
997
|
+
"webwriter-pairing",
|
|
998
|
+
"webwriter-speech"
|
|
999
|
+
]);
|
|
1000
|
+
var generatedQuizzes = /* @__PURE__ */ new WeakSet();
|
|
1001
|
+
var dragAndDropClozes = /* @__PURE__ */ new WeakSet();
|
|
1002
|
+
var taskSolutions = /* @__PURE__ */ new WeakMap();
|
|
1003
|
+
var segmenter = new Intl.Segmenter(void 0, { granularity: "word" });
|
|
1004
|
+
function warn(message, ...details) {
|
|
1005
|
+
console.warn(`[${name}] ${message}`, ...details);
|
|
1006
|
+
}
|
|
1007
|
+
function uniqueId() {
|
|
1008
|
+
const uuid = crypto.randomUUID?.() ?? `${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`;
|
|
1009
|
+
return `ww-${uuid}`;
|
|
1010
|
+
}
|
|
1011
|
+
function markAsCurrent(el) {
|
|
1012
|
+
for (const cls of Array.from(el.classList)) {
|
|
1013
|
+
if (cls.startsWith("ww-v")) el.classList.remove(cls);
|
|
1014
|
+
}
|
|
1015
|
+
el.classList.add("ww-widget", `ww-v${version}`, `ww-pkg-${name}`);
|
|
1016
|
+
if (!el.id) el.id = uniqueId();
|
|
1017
|
+
}
|
|
1018
|
+
function createWidget(tag, id) {
|
|
1019
|
+
const el = document.createElement(tag);
|
|
1020
|
+
if (id) el.id = id;
|
|
1021
|
+
markAsCurrent(el);
|
|
1022
|
+
return el;
|
|
1023
|
+
}
|
|
1024
|
+
function retag(el, tag) {
|
|
1025
|
+
const replacement = document.createElement(tag);
|
|
1026
|
+
for (const name2 of el.getAttributeNames()) replacement.setAttribute(name2, el.getAttribute(name2));
|
|
1027
|
+
replacement.append(...Array.from(el.childNodes));
|
|
1028
|
+
markAsCurrent(replacement);
|
|
1029
|
+
el.replaceWith(replacement);
|
|
1030
|
+
return replacement;
|
|
1031
|
+
}
|
|
1032
|
+
function removeAttributes(el, ...names) {
|
|
1033
|
+
for (const name2 of names) el.removeAttribute(name2);
|
|
1034
|
+
}
|
|
1035
|
+
function renameAttribute(el, from, to) {
|
|
1036
|
+
if (!el.hasAttribute(from)) return;
|
|
1037
|
+
el.setAttribute(to, el.getAttribute(from));
|
|
1038
|
+
el.removeAttribute(from);
|
|
1039
|
+
}
|
|
1040
|
+
function parseJson(value) {
|
|
1041
|
+
if (!value) return void 0;
|
|
1042
|
+
try {
|
|
1043
|
+
return JSON.parse(value);
|
|
1044
|
+
} catch {
|
|
1045
|
+
return void 0;
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
function setSolution(el, value) {
|
|
1049
|
+
const attribute = encryptedProperty.toAttribute?.(value, Array);
|
|
1050
|
+
if (typeof attribute === "string") el.setAttribute("solution", attribute);
|
|
1051
|
+
}
|
|
1052
|
+
function getTaskSolution(el) {
|
|
1053
|
+
const task = el.closest("webwriter-task");
|
|
1054
|
+
if (!task) return void 0;
|
|
1055
|
+
if (taskSolutions.has(task)) return taskSolutions.get(task);
|
|
1056
|
+
const solution = task.getAttribute("solution");
|
|
1057
|
+
const iv = task.getAttribute("iv");
|
|
1058
|
+
const salt = task.getAttribute("salt");
|
|
1059
|
+
let value = void 0;
|
|
1060
|
+
if (solution && iv && salt) {
|
|
1061
|
+
try {
|
|
1062
|
+
value = decryptLegacySolution(solution, iv, salt);
|
|
1063
|
+
} catch (error) {
|
|
1064
|
+
warn("Could not decrypt the solution of a task, it will have to be entered again.", task, error);
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
taskSolutions.set(task, value);
|
|
1068
|
+
return value;
|
|
1069
|
+
}
|
|
1070
|
+
function migrateQuiz(el) {
|
|
1071
|
+
removeAttributes(el, "randomorder", "counter", "submitted");
|
|
1072
|
+
markAsCurrent(el);
|
|
1073
|
+
}
|
|
1074
|
+
function ensurePrompt(task) {
|
|
1075
|
+
let prompt = task.querySelector(":scope > webwriter-task-prompt");
|
|
1076
|
+
if (!prompt) {
|
|
1077
|
+
prompt = createWidget("webwriter-task-prompt");
|
|
1078
|
+
prompt.appendChild(document.createElement("p"));
|
|
1079
|
+
task.insertBefore(prompt, task.firstChild);
|
|
1080
|
+
}
|
|
1081
|
+
prompt.setAttribute("slot", "prompt");
|
|
1082
|
+
return prompt;
|
|
1083
|
+
}
|
|
1084
|
+
function ensureQuiz(task) {
|
|
1085
|
+
const parent = task.parentElement;
|
|
1086
|
+
if (!parent || parent.localName === "webwriter-quiz") return;
|
|
1087
|
+
const previous = task.previousElementSibling;
|
|
1088
|
+
if (previous && generatedQuizzes.has(previous)) {
|
|
1089
|
+
previous.appendChild(task);
|
|
1090
|
+
return;
|
|
1091
|
+
}
|
|
1092
|
+
const quiz = createWidget("webwriter-quiz");
|
|
1093
|
+
generatedQuizzes.add(quiz);
|
|
1094
|
+
parent.insertBefore(quiz, task);
|
|
1095
|
+
quiz.appendChild(task);
|
|
1096
|
+
}
|
|
1097
|
+
function migrateTask(el) {
|
|
1098
|
+
const solution = getTaskSolution(el);
|
|
1099
|
+
removeAttributes(el, "solution", "iv", "salt", "hint", "submitted", "counter");
|
|
1100
|
+
applyAnswerSolution(el, solution);
|
|
1101
|
+
ensurePrompt(el);
|
|
1102
|
+
markAsCurrent(el);
|
|
1103
|
+
ensureQuiz(el);
|
|
1104
|
+
}
|
|
1105
|
+
function migratePrompt(el) {
|
|
1106
|
+
el.setAttribute("slot", "prompt");
|
|
1107
|
+
markAsCurrent(el);
|
|
1108
|
+
}
|
|
1109
|
+
var BLOCK_TAGS = /* @__PURE__ */ new Set(["div", "section", "article", "ul", "ol", "li", "blockquote", "pre", "figure"]);
|
|
1110
|
+
function appendAsParagraphs(target, nodes) {
|
|
1111
|
+
let paragraph;
|
|
1112
|
+
for (const node of nodes) {
|
|
1113
|
+
const tag = node.nodeType === Node.ELEMENT_NODE ? node.localName : void 0;
|
|
1114
|
+
if (tag === "p") {
|
|
1115
|
+
target.appendChild(node);
|
|
1116
|
+
paragraph = void 0;
|
|
1117
|
+
} else if (tag && (BLOCK_TAGS.has(tag) || /^h[1-6]$/.test(tag))) {
|
|
1118
|
+
const replacement = document.createElement("p");
|
|
1119
|
+
replacement.append(...Array.from(node.childNodes));
|
|
1120
|
+
target.appendChild(replacement);
|
|
1121
|
+
paragraph = void 0;
|
|
1122
|
+
} else if (node.nodeType !== Node.TEXT_NODE || node.textContent?.trim()) {
|
|
1123
|
+
if (!paragraph) {
|
|
1124
|
+
paragraph = document.createElement("p");
|
|
1125
|
+
target.appendChild(paragraph);
|
|
1126
|
+
}
|
|
1127
|
+
paragraph.appendChild(node);
|
|
1128
|
+
}
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
function ensureHint(task, id) {
|
|
1132
|
+
const prompt = ensurePrompt(task);
|
|
1133
|
+
let hint = prompt.querySelector(":scope > webwriter-quiz-hint");
|
|
1134
|
+
if (!hint) {
|
|
1135
|
+
hint = createWidget("webwriter-quiz-hint", id);
|
|
1136
|
+
hint.setAttribute("slot", "hint");
|
|
1137
|
+
prompt.prepend(hint);
|
|
1138
|
+
}
|
|
1139
|
+
return hint;
|
|
1140
|
+
}
|
|
1141
|
+
function foldIntoHint(el, id) {
|
|
1142
|
+
const task = el.closest("webwriter-task");
|
|
1143
|
+
if (task) {
|
|
1144
|
+
appendAsParagraphs(ensureHint(task, id), Array.from(el.childNodes));
|
|
1145
|
+
} else {
|
|
1146
|
+
warn("Dropped a hint that was not inside a task.", el);
|
|
1147
|
+
}
|
|
1148
|
+
el.remove();
|
|
1149
|
+
}
|
|
1150
|
+
function migrateHint(el) {
|
|
1151
|
+
foldIntoHint(el, el.id);
|
|
1152
|
+
}
|
|
1153
|
+
function migrateExplainer(el) {
|
|
1154
|
+
warn("A task explainer became part of the task's hint, since v2 has no explainers.", el);
|
|
1155
|
+
foldIntoHint(el);
|
|
1156
|
+
}
|
|
1157
|
+
function applyAnswerSolution(task, solution) {
|
|
1158
|
+
const answer = Array.from(task.children).find((child) => ANSWER_TAGS.has(child.localName));
|
|
1159
|
+
if (!answer || solution === void 0 || solution === null) return;
|
|
1160
|
+
if (answer.localName === "webwriter-choice" && Array.isArray(solution)) {
|
|
1161
|
+
const value = {};
|
|
1162
|
+
for (const item of answer.querySelectorAll(":scope > webwriter-choice-item")) {
|
|
1163
|
+
value[item.id] = solution.includes(item.id);
|
|
1164
|
+
}
|
|
1165
|
+
setSolution(answer, value);
|
|
1166
|
+
} else if (answer.localName === "webwriter-order" && Array.isArray(solution)) {
|
|
1167
|
+
const items = Array.from(answer.querySelectorAll(":scope > webwriter-order-item"));
|
|
1168
|
+
const ordered = solution.map((id) => items.find((item) => item.id === id)).filter((item) => item !== void 0);
|
|
1169
|
+
const rest = items.filter((item) => !ordered.includes(item));
|
|
1170
|
+
const sorted = [...ordered, ...rest];
|
|
1171
|
+
for (const item of sorted) answer.appendChild(item);
|
|
1172
|
+
setSolution(
|
|
1173
|
+
answer,
|
|
1174
|
+
sorted.map((item) => item.id)
|
|
1175
|
+
);
|
|
1176
|
+
} else if (answer.localName === "webwriter-text" && typeof solution === "string") {
|
|
1177
|
+
setSolution(answer, solution);
|
|
1178
|
+
} else if (answer.localName === "webwriter-pairing" && !answer.hasAttribute("solution")) {
|
|
1179
|
+
applyPairingSolution(answer, Array.isArray(solution) ? solution : []);
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
function hoistLayout(el, containerTag) {
|
|
1183
|
+
const layout = el.getAttribute("layout");
|
|
1184
|
+
const container = el.parentElement;
|
|
1185
|
+
if (layout && container?.localName === containerTag && !container.hasAttribute("layout")) {
|
|
1186
|
+
container.setAttribute("layout", layout);
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
function migrateChoice(el) {
|
|
1190
|
+
const mode = el.getAttribute("mode") ?? "single";
|
|
1191
|
+
if (mode === "truefalse") {
|
|
1192
|
+
const trueFalse = createWidget("webwriter-true-false", el.id);
|
|
1193
|
+
trueFalse.setAttribute("solution", "true");
|
|
1194
|
+
const discarded = el.querySelectorAll(":scope > webwriter-choice-item").length;
|
|
1195
|
+
el.replaceWith(trueFalse);
|
|
1196
|
+
warn(
|
|
1197
|
+
`A true/false question lost its solution, since v1 never stored one.${discarded ? ` ${discarded} leftover option(s) were dropped.` : ""}`,
|
|
1198
|
+
trueFalse
|
|
1199
|
+
);
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
el.setAttribute("mode", mode === "multiple" ? "multiple" : "single");
|
|
1203
|
+
if (el.getAttribute("layout") !== "tiles") el.removeAttribute("layout");
|
|
1204
|
+
if (el.hasAttribute("randomorder")) el.setAttribute("randomize-order", "");
|
|
1205
|
+
removeAttributes(el, "randomorder", "showsolution");
|
|
1206
|
+
if (!el.querySelector(":scope > webwriter-choice-item")) {
|
|
1207
|
+
const item = createWidget("webwriter-choice-item");
|
|
1208
|
+
item.appendChild(document.createElement("p"));
|
|
1209
|
+
el.appendChild(item);
|
|
1210
|
+
}
|
|
1211
|
+
markAsCurrent(el);
|
|
1212
|
+
}
|
|
1213
|
+
function migrateChoiceItem(el) {
|
|
1214
|
+
hoistLayout(el, "webwriter-choice");
|
|
1215
|
+
removeAttributes(el, "layout");
|
|
1216
|
+
markAsCurrent(el);
|
|
1217
|
+
}
|
|
1218
|
+
function migrateOrder(el) {
|
|
1219
|
+
if (el.getAttribute("layout") !== "tiles") el.removeAttribute("layout");
|
|
1220
|
+
removeAttributes(el, "hideorderbuttons", "showsolution");
|
|
1221
|
+
markAsCurrent(el);
|
|
1222
|
+
}
|
|
1223
|
+
function migrateOrderItem(el) {
|
|
1224
|
+
hoistLayout(el, "webwriter-order");
|
|
1225
|
+
removeAttributes(el, "layout", "draggable", "droppreview", "hideorderbuttons");
|
|
1226
|
+
markAsCurrent(el);
|
|
1227
|
+
}
|
|
1228
|
+
function migrateText(el) {
|
|
1229
|
+
renameAttribute(el, "freetext", "free-text");
|
|
1230
|
+
renameAttribute(el, "ignorecase", "ignore-case");
|
|
1231
|
+
renameAttribute(el, "wrongmessage", "wrong-message");
|
|
1232
|
+
removeAttributes(el, "showsolution", "value");
|
|
1233
|
+
markAsCurrent(el);
|
|
1234
|
+
}
|
|
1235
|
+
function migrateSpeech(el) {
|
|
1236
|
+
removeAttributes(el, "loading", "recording");
|
|
1237
|
+
markAsCurrent(el);
|
|
1238
|
+
}
|
|
1239
|
+
function isLegacyRange(value) {
|
|
1240
|
+
const range = value;
|
|
1241
|
+
return typeof range?.startContainer === "string" && typeof range?.startOffset === "number";
|
|
1242
|
+
}
|
|
1243
|
+
function evaluateXPath(path) {
|
|
1244
|
+
try {
|
|
1245
|
+
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
|
|
1246
|
+
} catch {
|
|
1247
|
+
return null;
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
function resolveLegacyRange(legacy, scope) {
|
|
1251
|
+
const start = evaluateXPath(legacy.startContainer);
|
|
1252
|
+
const end = legacy.endContainer ? evaluateXPath(legacy.endContainer) : start;
|
|
1253
|
+
if (!start || !end || !scope.contains(start) || !scope.contains(end)) return void 0;
|
|
1254
|
+
const range = document.createRange();
|
|
1255
|
+
const clamp = (node, offset) => Math.max(
|
|
1256
|
+
0,
|
|
1257
|
+
Math.min(offset, node.nodeType === Node.TEXT_NODE ? node.data.length : node.childNodes.length)
|
|
1258
|
+
);
|
|
1259
|
+
range.setStart(start, clamp(start, legacy.startOffset));
|
|
1260
|
+
range.setEnd(end, clamp(end, legacy.endOffset));
|
|
1261
|
+
return range;
|
|
1262
|
+
}
|
|
1263
|
+
function wordSegments(root) {
|
|
1264
|
+
const segments = [];
|
|
1265
|
+
const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);
|
|
1266
|
+
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
|
|
1267
|
+
const text = node;
|
|
1268
|
+
for (const segment of segmenter.segment(text.data)) {
|
|
1269
|
+
if (!segment.isWordLike) continue;
|
|
1270
|
+
const range = document.createRange();
|
|
1271
|
+
range.setStart(text, segment.index);
|
|
1272
|
+
range.setEnd(text, segment.index + segment.segment.length);
|
|
1273
|
+
segments.push(range);
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
return segments;
|
|
1277
|
+
}
|
|
1278
|
+
function rangesOverlap(a3, b3) {
|
|
1279
|
+
return a3.compareBoundaryPoints(Range.END_TO_START, b3) < 0 && a3.compareBoundaryPoints(Range.START_TO_END, b3) > 0;
|
|
1280
|
+
}
|
|
1281
|
+
function migrateMark(el) {
|
|
1282
|
+
const legacy = Array.isArray(getTaskSolution(el)) ? getTaskSolution(el) : [];
|
|
1283
|
+
const ranges = legacy.filter(isLegacyRange).map((value) => resolveLegacyRange(value, el)).filter((range) => range !== void 0);
|
|
1284
|
+
if (legacy.length && !ranges.length) {
|
|
1285
|
+
warn("Could not locate the marked words of a task, they have to be marked again.", el);
|
|
1286
|
+
}
|
|
1287
|
+
for (const child of Array.from(el.querySelectorAll("br, wbr"))) {
|
|
1288
|
+
if (child.localName === "br") child.replaceWith(document.createTextNode("\n"));
|
|
1289
|
+
else child.remove();
|
|
1290
|
+
}
|
|
1291
|
+
for (let child = el.firstElementChild; child; child = el.firstElementChild) {
|
|
1292
|
+
child.replaceWith(...Array.from(child.childNodes));
|
|
1293
|
+
}
|
|
1294
|
+
const segments = wordSegments(el);
|
|
1295
|
+
const solution = segments.map((segment, index) => ranges.some((range) => rangesOverlap(range, segment)) ? index : -1).filter((index) => index !== -1);
|
|
1296
|
+
removeAttributes(el, "highlighting", "value");
|
|
1297
|
+
if (solution.length) setSolution(el, solution);
|
|
1298
|
+
markAsCurrent(el);
|
|
1299
|
+
}
|
|
1300
|
+
function migrateCloze(el) {
|
|
1301
|
+
const dragAndDrop = dragAndDropClozes.has(el);
|
|
1302
|
+
const gap = retag(el, "webwriter-gap");
|
|
1303
|
+
if (dragAndDrop) gap.setAttribute("mode", "drag-and-drop");
|
|
1304
|
+
}
|
|
1305
|
+
function migrateClozeGap(el) {
|
|
1306
|
+
if (el.hasAttribute("showoptions")) {
|
|
1307
|
+
const cloze = el.closest("webwriter-cloze");
|
|
1308
|
+
if (cloze) dragAndDropClozes.add(cloze);
|
|
1309
|
+
}
|
|
1310
|
+
const solutions = parseJson(el.getAttribute("solution"));
|
|
1311
|
+
const accepted = Array.isArray(solutions) ? solutions.filter((value) => typeof value === "string") : [];
|
|
1312
|
+
if (accepted.length > 1) {
|
|
1313
|
+
warn(`A gap accepted ${accepted.length} answers, v2 keeps only "${accepted[0]}".`, el);
|
|
1314
|
+
}
|
|
1315
|
+
if (parseJson(el.getAttribute("distraction"))) {
|
|
1316
|
+
warn("A gap had distractor options, which v2 does not support. They were dropped.", el);
|
|
1317
|
+
}
|
|
1318
|
+
const item = createWidget("webwriter-gap-item", el.id);
|
|
1319
|
+
item.textContent = accepted[0] ?? "";
|
|
1320
|
+
el.replaceWith(item);
|
|
1321
|
+
}
|
|
1322
|
+
function applyPairingSolution(el, legacy) {
|
|
1323
|
+
const items = Array.from(el.querySelectorAll(":scope > webwriter-pairing-item"));
|
|
1324
|
+
const ids = new Set(items.map((item) => item.id));
|
|
1325
|
+
const pairs = legacy.filter(
|
|
1326
|
+
(entry) => Array.isArray(entry) && entry.length === 2 && entry.every((id) => typeof id === "string" && ids.has(id))
|
|
1327
|
+
);
|
|
1328
|
+
const paired = new Set(pairs.flat());
|
|
1329
|
+
for (const item of items) {
|
|
1330
|
+
if (paired.has(item.id)) continue;
|
|
1331
|
+
warn("Removed a pairing item that was not part of a pair, which v2 cannot represent.", item);
|
|
1332
|
+
item.remove();
|
|
1333
|
+
}
|
|
1334
|
+
setSolution(el, pairs);
|
|
1335
|
+
}
|
|
1336
|
+
function migratePairing(el) {
|
|
1337
|
+
el.setAttribute("mode", el.getAttribute("mode") === "memory" ? "memory" : "pairing");
|
|
1338
|
+
const legacy = parseJson(el.getAttribute("solution")) ?? getTaskSolution(el);
|
|
1339
|
+
applyPairingSolution(el, Array.isArray(legacy) ? legacy : []);
|
|
1340
|
+
markAsCurrent(el);
|
|
1341
|
+
}
|
|
1342
|
+
function migratePairingItem(el) {
|
|
1343
|
+
removeAttributes(el, "draggable", "droppreview");
|
|
1344
|
+
const picture = el.querySelector("picture");
|
|
1345
|
+
if (picture) {
|
|
1346
|
+
el.replaceChildren(picture);
|
|
1347
|
+
} else {
|
|
1348
|
+
const paragraph = document.createElement("p");
|
|
1349
|
+
paragraph.append(...Array.from(el.childNodes));
|
|
1350
|
+
for (const child of Array.from(paragraph.children)) {
|
|
1351
|
+
if (child.localName === "p" || child.localName === "div") {
|
|
1352
|
+
child.replaceWith(...Array.from(child.childNodes));
|
|
1353
|
+
}
|
|
1354
|
+
}
|
|
1355
|
+
el.replaceChildren(paragraph);
|
|
1356
|
+
}
|
|
1357
|
+
markAsCurrent(el);
|
|
1358
|
+
}
|
|
1359
|
+
function migrateElement(el) {
|
|
1360
|
+
switch (el.localName) {
|
|
1361
|
+
case "webwriter-quiz":
|
|
1362
|
+
return migrateQuiz(el);
|
|
1363
|
+
case "webwriter-task":
|
|
1364
|
+
return migrateTask(el);
|
|
1365
|
+
case "webwriter-task-prompt":
|
|
1366
|
+
return migratePrompt(el);
|
|
1367
|
+
case "webwriter-task-hint":
|
|
1368
|
+
return migrateHint(el);
|
|
1369
|
+
case "webwriter-task-explainer":
|
|
1370
|
+
return migrateExplainer(el);
|
|
1371
|
+
case "webwriter-choice":
|
|
1372
|
+
return migrateChoice(el);
|
|
1373
|
+
case "webwriter-choice-item":
|
|
1374
|
+
return migrateChoiceItem(el);
|
|
1375
|
+
case "webwriter-order":
|
|
1376
|
+
return migrateOrder(el);
|
|
1377
|
+
case "webwriter-order-item":
|
|
1378
|
+
return migrateOrderItem(el);
|
|
1379
|
+
case "webwriter-text":
|
|
1380
|
+
return migrateText(el);
|
|
1381
|
+
case "webwriter-speech":
|
|
1382
|
+
return migrateSpeech(el);
|
|
1383
|
+
case "webwriter-mark":
|
|
1384
|
+
return migrateMark(el);
|
|
1385
|
+
case "webwriter-cloze":
|
|
1386
|
+
return migrateCloze(el);
|
|
1387
|
+
case "webwriter-cloze-gap":
|
|
1388
|
+
return migrateClozeGap(el);
|
|
1389
|
+
case "webwriter-pairing":
|
|
1390
|
+
return migratePairing(el);
|
|
1391
|
+
case "webwriter-pairing-item":
|
|
1392
|
+
return migratePairingItem(el);
|
|
1393
|
+
default:
|
|
1394
|
+
return markAsCurrent(el);
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
document.addEventListener("migrate", (event) => {
|
|
1398
|
+
const el = event.target;
|
|
1399
|
+
if (!el?.classList) return;
|
|
1400
|
+
const classes = Array.from(el.classList);
|
|
1401
|
+
if (classes.find((cls) => cls.startsWith("ww-pkg-"))?.slice("ww-pkg-".length) !== name) return;
|
|
1402
|
+
const major = Number.parseInt(classes.find((cls) => cls.startsWith("ww-v"))?.slice("ww-v".length) ?? "", 10);
|
|
1403
|
+
if (!Number.isFinite(major) || major >= CURRENT_MAJOR_VERSION) return;
|
|
1404
|
+
try {
|
|
1405
|
+
migrateElement(el);
|
|
1406
|
+
} catch (error) {
|
|
1407
|
+
warn(`Could not migrate a <${el.localName}>, it may display incorrectly.`, el, error);
|
|
1408
|
+
}
|
|
1409
|
+
});
|
|
1410
|
+
/*! Bundled license information:
|
|
1411
|
+
|
|
1412
|
+
@lit/reactive-element/css-tag.js:
|
|
1413
|
+
(**
|
|
1414
|
+
* @license
|
|
1415
|
+
* Copyright 2019 Google LLC
|
|
1416
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
1417
|
+
*)
|
|
1418
|
+
|
|
1419
|
+
@lit/reactive-element/reactive-element.js:
|
|
1420
|
+
lit-html/lit-html.js:
|
|
1421
|
+
lit-element/lit-element.js:
|
|
1422
|
+
(**
|
|
1423
|
+
* @license
|
|
1424
|
+
* Copyright 2017 Google LLC
|
|
1425
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
1426
|
+
*)
|
|
1427
|
+
|
|
1428
|
+
lit-html/is-server.js:
|
|
1429
|
+
(**
|
|
1430
|
+
* @license
|
|
1431
|
+
* Copyright 2022 Google LLC
|
|
1432
|
+
* SPDX-License-Identifier: BSD-3-Clause
|
|
1433
|
+
*)
|
|
1434
|
+
*/
|