feat: Reinitialize frontend with SvelteKit and TypeScript

- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
This commit is contained in:
2026-02-17 16:19:59 -05:00
parent 54df6018f5
commit de2d83092e
28274 changed files with 3816354 additions and 90 deletions

View File

@@ -0,0 +1,18 @@
/**
* Attribute utility
*/
export declare class AttributeUtility {
/**
*
* @param name the attribute name
* @param contentType the attribute has to be valid in
* @param context the context in which the error occurred in
* @param context.method
* @param context.instance
*/
static validateAttributeName(name: unknown, contentType: string, context: {
method: string;
instance: string;
}): void;
}
//# sourceMappingURL=AttributeUtility.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AttributeUtility.d.ts","sourceRoot":"","sources":["../../src/utilities/AttributeUtility.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,qBAAa,gBAAgB;IAC5B;;;;;;;OAOG;WACW,qBAAqB,CAClC,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE;QACR,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KACjB,GACC,IAAI;CAiBP"}

View File

@@ -0,0 +1,29 @@
import DOMException from '../exception/DOMException.js';
import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js';
const HTML_INVALID_ATTRIBUTE_NAME_CHARACTER_REGEX = /[\x00-\x1F\x7F\x80-\x9F "\'><=\/\uFDD0-\uFDEF\uFFFE\uFFFF\u1FFFE\u1FFFF\u2FFFE\u2FFFF\u3FFFE\u3FFFF\u4FFFE\u4FFFF\u5FFFE\u5FFFF\u6FFFE\u6FFFF\u7FFFE\u7FFFF\u8FFFE\u8FFFF\u9FFFE\u9FFFF\uAFFFE\uAFFFF\uBFFFE\uBFFFF\uCFFFE\uCFFFF\uDFFFE\uDFFFF\uEFFFE\uEFFFF\uFFFFE\uFFFFF\u10FFFE\u10FFFF]/;
/**
* Attribute utility
*/
export class AttributeUtility {
/**
*
* @param name the attribute name
* @param contentType the attribute has to be valid in
* @param context the context in which the error occurred in
* @param context.method
* @param context.instance
*/
static validateAttributeName(name, contentType, context) {
const { method, instance } = context;
if (contentType === 'text/html') {
const normalizedName = String(name).toLowerCase();
if (HTML_INVALID_ATTRIBUTE_NAME_CHARACTER_REGEX.test(normalizedName) ||
normalizedName.length === 0 ||
normalizedName[0] === '-') {
throw new DOMException(`Uncaught InvalidCharacterError: Failed to execute '${method}' on '${instance}': '${name}' is not a valid attribute name.`, DOMExceptionNameEnum.invalidCharacterError);
}
}
// TODO: implement XML and other content types
}
}
//# sourceMappingURL=AttributeUtility.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"AttributeUtility.js","sourceRoot":"","sources":["../../src/utilities/AttributeUtility.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,8BAA8B,CAAC;AACxD,OAAO,oBAAoB,MAAM,sCAAsC,CAAC;AAExE,MAAM,2CAA2C,GAChD,8RAA8R,CAAC;AAEhS;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAC5B;;;;;;;OAOG;IACI,MAAM,CAAC,qBAAqB,CAClC,IAAa,EACb,WAAmB,EACnB,OAGC;QAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QACrC,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;YACjC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YAClD,IACC,2CAA2C,CAAC,IAAI,CAAC,cAAc,CAAC;gBAChE,cAAc,CAAC,MAAM,KAAK,CAAC;gBAC3B,cAAc,CAAC,CAAC,CAAC,KAAK,GAAG,EACxB,CAAC;gBACF,MAAM,IAAI,YAAY,CACrB,sDAAsD,MAAM,SAAS,QAAQ,OAAO,IAAI,kCAAkC,EAC1H,oBAAoB,CAAC,qBAAqB,CAC1C,CAAC;YACH,CAAC;QACF,CAAC;QACD,8CAA8C;IAC/C,CAAC;CACD"}

View File

@@ -0,0 +1,28 @@
/**
* Node utility.
*/
export default class ClassMethodBinder {
private target;
private classes;
private cache;
/**
* Constructor.
*
* @param target Target.
* @param classes Classes.
*/
constructor(target: Object, classes: any[]);
/**
* Binds method, getters and setters to a target.
*
* @param name Method name.
*/
bind(name: string | symbol): void;
/**
* Prevents a method, getter or setter from being bound.
*
* @param name Method name.
*/
preventBinding(name: string | symbol): void;
}
//# sourceMappingURL=ClassMethodBinder.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ClassMethodBinder.d.ts","sourceRoot":"","sources":["../../src/utilities/ClassMethodBinder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,KAAK,CAAuC;IAEpD;;;;;OAKG;gBACS,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE;IAK1C;;;;OAIG;IACI,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsCxC;;;;OAIG;IACI,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGlD"}

View File

@@ -0,0 +1,66 @@
/**
* Node utility.
*/
export default class ClassMethodBinder {
target;
classes;
cache = new Map();
/**
* Constructor.
*
* @param target Target.
* @param classes Classes.
*/
constructor(target, classes) {
this.target = target;
this.classes = classes;
}
/**
* Binds method, getters and setters to a target.
*
* @param name Method name.
*/
bind(name) {
// We should never bind the Symbol.iterator method as it can cause problems with Array.from()
if (this.cache.has(name) || name === Symbol.iterator || name === 'constructor') {
return;
}
this.cache.set(name, true);
const target = this.target;
if (!(name in target)) {
return;
}
for (const _class of this.classes) {
const descriptor = Object.getOwnPropertyDescriptor(_class.prototype, name);
if (descriptor) {
if (typeof descriptor.value === 'function') {
if (descriptor.value.toString().startsWith('class ')) {
// Do not bind classes
return;
}
Object.defineProperty(target, name, {
...descriptor,
value: descriptor.value.bind(target)
});
}
else if (descriptor.get !== undefined) {
Object.defineProperty(target, name, {
...descriptor,
get: descriptor.get?.bind(target),
set: descriptor.set?.bind(target)
});
}
return;
}
}
}
/**
* Prevents a method, getter or setter from being bound.
*
* @param name Method name.
*/
preventBinding(name) {
this.cache.set(name, true);
}
}
//# sourceMappingURL=ClassMethodBinder.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"ClassMethodBinder.js","sourceRoot":"","sources":["../../src/utilities/ClassMethodBinder.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IAC7B,MAAM,CAAS;IACf,OAAO,CAAQ;IACf,KAAK,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEpD;;;;;OAKG;IACH,YAAY,MAAc,EAAE,OAAc;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACI,IAAI,CAAC,IAAqB;QAChC,6FAA6F;QAC7F,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;YAChF,OAAO;QACR,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE3B,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC;YACvB,OAAO;QACR,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3E,IAAI,UAAU,EAAE,CAAC;gBAChB,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC5C,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACtD,sBAAsB;wBACtB,OAAO;oBACR,CAAC;oBACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE;wBACnC,GAAG,UAAU;wBACb,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;qBACpC,CAAC,CAAC;gBACJ,CAAC;qBAAM,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;oBACzC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE;wBACnC,GAAG,UAAU;wBACb,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;wBACjC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;qBACjC,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO;YACR,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,IAAqB;QAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;CACD"}

View File

@@ -0,0 +1,22 @@
/**
* String utility.
*/
export default class StringUtility {
/**
* ASCII lowercase.
*
* @see https://infra.spec.whatwg.org/#ascii-lowercase
* @param text Text.
* @returns Lowercase text.
*/
static asciiLowerCase(text: string): string;
/**
* ASCII uppercase.
*
* @see https://infra.spec.whatwg.org/#ascii-uppercase
* @param text Text.
* @returns Uppercase text.
*/
static asciiUpperCase(text: string): string;
}
//# sourceMappingURL=StringUtility.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"StringUtility.d.ts","sourceRoot":"","sources":["../../src/utilities/StringUtility.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC;;;;;;OAMG;WACW,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAkBlD;;;;;;OAMG;WACW,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;CAiBlD"}

View File

@@ -0,0 +1,58 @@
const ASCII_LOWER_CASE_CACHE = new Map();
const ASCII_UPPER_CASE_CACHE = new Map();
/**
* String utility.
*/
export default class StringUtility {
/**
* ASCII lowercase.
*
* @see https://infra.spec.whatwg.org/#ascii-lowercase
* @param text Text.
* @returns Lowercase text.
*/
static asciiLowerCase(text) {
const cached = ASCII_LOWER_CASE_CACHE.get(text);
if (cached) {
return cached;
}
let newText = '';
for (const char of text) {
const value = char.charCodeAt(0);
if (value >= 65 && value <= 90) {
newText += String.fromCharCode(value + 32);
}
else {
newText += char;
}
}
ASCII_LOWER_CASE_CACHE.set(text, newText);
return newText;
}
/**
* ASCII uppercase.
*
* @see https://infra.spec.whatwg.org/#ascii-uppercase
* @param text Text.
* @returns Uppercase text.
*/
static asciiUpperCase(text) {
const cached = ASCII_UPPER_CASE_CACHE.get(text);
if (cached) {
return cached;
}
let newText = '';
for (const char of text) {
const value = char.charCodeAt(0);
if (value >= 97 && value <= 122) {
newText += String.fromCharCode(value - 32);
}
else {
newText += char;
}
}
ASCII_UPPER_CASE_CACHE.set(text, newText);
return newText;
}
}
//# sourceMappingURL=StringUtility.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"StringUtility.js","sourceRoot":"","sources":["../../src/utilities/StringUtility.ts"],"names":[],"mappings":"AAAA,MAAM,sBAAsB,GAAwB,IAAI,GAAG,EAAE,CAAC;AAC9D,MAAM,sBAAsB,GAAwB,IAAI,GAAG,EAAE,CAAC;AAE9D;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IACjC;;;;;;OAMG;IACI,MAAM,CAAC,cAAc,CAAC,IAAY;QACxC,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC;QACf,CAAC;QACD,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;gBAChC,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACP,OAAO,IAAI,IAAI,CAAC;YACjB,CAAC;QACF,CAAC;QACD,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,cAAc,CAAC,IAAY;QACxC,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC;QACf,CAAC;QACD,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;gBACjC,OAAO,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACP,OAAO,IAAI,IAAI,CAAC;YACjB,CAAC;QACF,CAAC;QACD,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}

View File

@@ -0,0 +1,62 @@
/**
* Utility for encoding.
*/
export default class XMLEncodeUtility {
/**
* Encodes attribute value.
*
* @param value Value.
* @returns Escaped value.
*/
static encodeXMLAttributeValue(value: string | null): string;
/**
* Decodes attribute value.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeXMLAttributeValue(value: string | null): string;
/**
* Encodes attribute value.
*
* @param value Value.
* @returns Escaped value.
*/
static encodeHTMLAttributeValue(value: string | null): string;
/**
* Decodes attribute value.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeHTMLAttributeValue(value: string | null): string;
/**
* Encodes text content.
*
* @param text Value.
* @returns Escaped value.
*/
static encodeTextContent(text: string | null): string;
/**
* Decodes text content.
*
* @param text Value.
* @returns Decoded value.
*/
static decodeTextContent(text: string | null): string;
/**
* Decodes HTML entities.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeHTMLEntities(value: string): string;
/**
* Decodes XML entities.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeXMLEntities(value: string): string;
}
//# sourceMappingURL=XMLEncodeUtility.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"XMLEncodeUtility.d.ts","sourceRoot":"","sources":["../../src/utilities/XMLEncodeUtility.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACpC;;;;;OAKG;WACW,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAcnE;;;;;OAKG;WACW,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAenE;;;;;OAKG;WACW,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAOpE;;;;;OAKG;WACW,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAQpE;;;;;OAKG;WACW,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAY5D;;;;;OAKG;WACW,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAY5D;;;;;OAKG;WACW,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAgBvD;;;;;OAKG;WACW,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAiBtD"}

View File

@@ -0,0 +1,140 @@
/**
* Utility for encoding.
*/
export default class XMLEncodeUtility {
/**
* Encodes attribute value.
*
* @param value Value.
* @returns Escaped value.
*/
static encodeXMLAttributeValue(value) {
if (value === null) {
return '';
}
return value
.replace(/&/gu, '&amp;')
.replace(/"/gu, '&quot;')
.replace(/</gu, '&lt;')
.replace(/>/gu, '&gt;')
.replace(/\t/gu, '&#x9;')
.replace(/\n/gu, '&#xA;')
.replace(/\r/gu, '&#xD;');
}
/**
* Decodes attribute value.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeXMLAttributeValue(value) {
if (value === null) {
return '';
}
return value
.replace(/&quot;/gu, '"')
.replace(/&lt;/gu, '<')
.replace(/&gt;/gu, '>')
.replace(/&#x9;/gu, '\t')
.replace(/&#xA;/gu, '\n')
.replace(/&#xD;/gu, '\r')
.replace(/&amp;/gu, '&');
}
/**
* Encodes attribute value.
*
* @param value Value.
* @returns Escaped value.
*/
static encodeHTMLAttributeValue(value) {
if (value === null) {
return '';
}
return value.replace(/&/gu, '&amp;').replace(/"/gu, '&quot;');
}
/**
* Decodes attribute value.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeHTMLAttributeValue(value) {
if (value === null) {
return '';
}
return value.replace(/&quot;/gu, '"').replace(/&amp;/gu, '&');
}
/**
* Encodes text content.
*
* @param text Value.
* @returns Escaped value.
*/
static encodeTextContent(text) {
if (text === null) {
return '';
}
return text
.replace(/&/gu, '&amp;')
.replace(/\xA0/gu, '&nbsp;')
.replace(/</gu, '&lt;')
.replace(/>/gu, '&gt;');
}
/**
* Decodes text content.
*
* @param text Value.
* @returns Decoded value.
*/
static decodeTextContent(text) {
if (text === null) {
return '';
}
return text
.replace(/&nbsp;/gu, String.fromCharCode(160))
.replace(/&lt;/gu, '<')
.replace(/&gt;/gu, '>')
.replace(/&amp;/gu, '&');
}
/**
* Decodes HTML entities.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeHTMLEntities(value) {
if (value === null) {
return '';
}
return value
.replace(/&lt;/gu, '<')
.replace(/&gt;/gu, '>')
.replace(/&nbsp;/gu, String.fromCharCode(160))
.replace(/&quot;/gu, '"')
.replace(/&apos;/gu, "'")
.replace(/&#(\d+);/gu, (_match, dec) => String.fromCharCode(parseInt(dec, 10)))
.replace(/&#x([A-Fa-f\d]+);/gu, (_match, hex) => String.fromCharCode(parseInt(hex, 16)))
.replace(/&amp;/gu, '&');
}
/**
* Decodes XML entities.
*
* @param value Value.
* @returns Decoded value.
*/
static decodeXMLEntities(value) {
if (value === null) {
return '';
}
return (value
.replace(/&lt;/gu, '<')
.replace(/&gt;/gu, '>')
// "&nbsp;" Should not be supported in XML.
.replace(/&quot;/gu, '"')
.replace(/&apos;/gu, "'")
.replace(/&#(\d+);/gu, (_match, dec) => String.fromCharCode(parseInt(dec, 10)))
.replace(/&#x([A-Fa-f\d]+);/gu, (_match, hex) => String.fromCharCode(parseInt(hex, 16)))
.replace(/&amp;/gu, '&'));
}
}
//# sourceMappingURL=XMLEncodeUtility.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"XMLEncodeUtility.js","sourceRoot":"","sources":["../../src/utilities/XMLEncodeUtility.ts"],"names":[],"mappings":"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"}